-100p

-10p

+10p

+100p

Ubuntu環境、ApacheとTomcatの連携

Ubuntu環境、ApacheとTomcatのAJPを使わない連携。

関連ページ

ApacheとTomcatの連携方法は色んな所で紹介されてるものの、AJPを使った連携が多い。
ただAJPは以前にはセキュリティの脆弱性が指摘されていたり、実際にAJPを使った連携をしたところcssの読み込みがおかしくなったりしたので、AJPを使わない連携方法を探していた。
結論から言うとAJPを使わなくてリバースプロキシだけで連携は可能だった。

必要なModuleの確認とインストール

必要なModuleがインストールされているか確認する。
今回必要になるのは、
 proxy_module 
 proxy_http_module 
 ssl_module 
の3つ。 下のコマンドでインストール済みModuleを確認できる。
apachectl -M
ssl_moduleに関しては存在しない場合がある。その時は下のコマンドを打ち込む。
sudo apt install mod_ssl

今回のリバースプロキシの設定ではLoadModuleコマンドを使って上の3つのModuleを有効化する必要がある。
/etc/apache2/mods-avaliableに移動すると、Module一つ一つに対応したLoadModuleコマンドを記したファイル群が確認できる。
cd /etc/apache2/mods-avaliable
proxy_moduleに対応したコマンドを確認してみる。
sudo vi proxy.load
ファイルの中に
 LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so 
というコマンドが確認できる。
同様に
 proxy_http.load 
 ssl.load 
の中身を確認する。

VirtualHostの中身を確認

Ubuntu環境だと、デフォルトのVirtualHost設定は/etc/apache2/sites-availableの下の
 000-default.conf 
 default-ssl.conf 
で行っている。
名前からすると000-default.confが全般的なVirtualHost設定、default-ssl.confはSSL認証に関するVirtualHost設定に見える。
今回はSSL認証も一緒にやるのでdefault-ssl.confをいじる。

sites-availableに移動。
cd /etc/apache2/sites-available
viコマンドでファイルを開く。
sudo vi default-ssl.conf
中をざっと見ると、ポート443接続(https接続)の時の処理が書かれているのが分かる。
<VirtualHost *:443>    
    ServerAdmin 
 [管理者のメールアドレス] 
    

    DocumentRoot /var/www/html    

    # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,    
    # error, crit, alert, emerg.    
    # It is also possible to configure the loglevel for particular    
    # modules, e.g.    
    #LogLevel info ssl:warn    

    ErrorLog ${APACHE_LOG_DIR}/error.log    
    CustomLog ${APACHE_LOG_DIR}/access.log combined    
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VirtualHostは、同じポート設定、同じIPアドレスの接続でも、ドメインによって遷移を分けられる。
1つのサーバしかなくても、ドメインを複数取得して複数のサイトを運営でき、その根元の部分をApacheで管理できる。(素晴らしい)

VirtualHostを編集する

とりあえず今回の作業に邪魔なので、すでにdefault-ssl.confに書かれているコードは全て#でコメントアウトさせる。

コメントアウトした下に、新しいVirtualHostの設定を書きこむ。
例としてこのサイト、
 unity-engineer.top 
のドメインを対象とする場合こうなる。
#確認したLoadModuleコマンドを打ち込む
    
LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so    
LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so    
LoadModule ssl_module /usr/lib/apache2/modules/mod_ssl.so    

#http接続ならこっちの遷移を通る。
    
<VirtualHost *:80>    
    DocumentRoot /var/www/    
    ServerName unity-engineer.top    
    ErrorLog /var/log/apache2/unity-engineer.top.error.log    
    CustomLog /var/log/apache2/unity-engineer.top.access.log combined    

    ProxyRequests Off    
    ProxyPass / http://unity-engineer.top:
 [Tomcatのhttpポート設定] 
/
 [Tomcatのwebapps下サイトディレクトリ] 
    
    ProxyPassReverse / http://unity-engineer.top:
 [Tomcatのhttpポート設定] 
/
 [Tomcatのwebapps下サイトディレクトリ] 
    
</VirtualHost>

#https接続ならこっちの遷移を通る。サイトのSSL認証が済んでいる必要がある。
    
<VirtualHost *:443>    
    DocumentRoot /var/www/    
    ServerName unity-engineer.top    
    ErrorLog /var/log/apache2/unity-engineer.top.error.log    
    CustomLog /var/log/apache2/unity-engineer.top.access.log combined    

    SSLEngine on    
    SSLProtocol all -SSLv2    
    SSLCertificateFile      
 [unity-engineer.top  cert.pem(SSLサーバー証明書)の path] 
    
    SSLCertificateKeyFile   
 [unity-engineer.top  privkey.pem(秘密鍵)の path] 
    
    SSLCertificateChainFile 
 [unity-engineer.top  chain.pem(中間証明書)の path] 
    

    ProxyRequests Off    
    SSLProxyEngine On    
    ProxyPass / https://unity-engineer.top:
 [Tomcatのhttpsポート設定] 
/
 [Tomcatのwebapps下サイトディレクトリ] 
    
    ProxyPassReverse / https://unity-engineer.top:
 [Tomcatのhttpsポート設定] 
/
 [Tomcatのwebapps下サイトディレクトリ] 
    
</VirtualHost>    

同じポート接続でも、ドメインが違えば遷移も分かれる。
例として
 unity-engineer.top 
 english-everyday.top 
で見てみる。
#unity-engineer.topのhttp接続ならこっちの遷移
    
<VirtualHost *:80>    
    DocumentRoot /var/www/    
    ServerName unity-engineer.top    
    ErrorLog /var/log/apache2/unity-engineer.top.error.log    
    CustomLog /var/log/apache2/unity-engineer.top.access.log combined    

    ProxyRequests Off    
    ProxyPass / http://unity-engineer.top:
 [Tomcatのhttpポート設定] 
/
 [Tomcatのwebapps下サイトディレクトリ] 
    
    ProxyPassReverse / http://unity-engineer.top:
 [Tomcatのhttpポート設定] 
/
 [Tomcatのwebapps下サイトディレクトリ] 
    
</VirtualHost>

#english-everyday.topのhttp接続ならこっちの遷移
    
<VirtualHost *:80>    
    DocumentRoot /var/www/    
    ServerName english-everyday.top    
    ErrorLog /var/log/apache2/english-everyday.top.error.log    
    CustomLog /var/log/apache2/english-everyday.top.access.log combined    

    ProxyRequests Off    
    ProxyPass / http://english-everyday.top:
 [Tomcatのhttpポート設定] 
/
 [Tomcatのwebapps下サイトディレクトリ] 
    
    ProxyPassReverse / http://english-everyday.top:
 [Tomcatのhttpポート設定] 
/
 [Tomcatのwebapps下サイトディレクトリ] 
    
</VirtualHost>

編集が終わったら、保存して閉じる。
一応default-ssl.confとsslの有効化をコマンドからしておく。(既に実行されてるなら必要ない)
a2ensite default-ssl
a2enmod ssl

Apacheを再起動して完了。
sudo service apache2 restart
0
0

-100p

-10p

+10p

+100p