-->

リバースプロキシでApacheとTomcatの連携

リバースプロキシでApacheとTomcatの連携

Ubuntu環境、ApacheとTomcatのAJPを使わない連携。
リバースプロキシの設定。

関連ページ

ApacheとTomcatの連携方法は色んな所で紹介されてるものの、AJPを使った連携が多いです。
しかし実際にAJPを使った連携をしたところ、自分の環境ではcssの読み込みがおかしくなっていました。
またAJPは以前にはセキュリティの脆弱性が指摘されていたりしたので、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 
に対応したコマンドを確認してみます。ファイル名は
 proxy.load 
です。
sudo vi proxy.load
ファイル内で
 LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so 
というコマンドが確認できます。
同様に
 proxy_http.loadとssl.load 
も確認。一覧は次のようになります。
 
proxy.load
 
: LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
 
proxy_http.load
 
: LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so
 
ssl.load
 
: LoadModule ssl_module /usr/lib/apache2/modules/mod_ssl.so

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    

    
#SSLを有効化

    SSLEngine on
    
#最新のプロトコルのみ許可

    SSLProtocol TLSv1.2 TLSv1.3
    
#安全な暗号化アルゴリズムだけを網羅して許可

    SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
    
#ブラウザ側に暗号化アルゴリズムを選択させる(接続スピード強化)

    SSLHonorCipherOrder off
    
#セッションごとに使い捨ての鍵を使う(前方秘匿性強化)

    SSLSessionTickets off

    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