-->

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

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

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

このリバースプロキシの設定は、セキュリティの設定とのかみ合わせも大事になるので、 こちらのページも併せて読んでおく必要があります。
また私のサーバー環境に最適化された設定なので、いくつか無駄な情報も混ざってるかもしれません。

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

必要なModuleがインストールされているか確認します。
今回必要になるのは、
 proxy_module 
 proxy_http_module 
 ssl_module 
の3つです。 下のコマンドでインストール済みModuleを確認できます。
Copy Code

apachectl -M
 ssl_module 
に関しては存在しない場合がある。その時は下のコマンドを打ち込みます。
Copy Code

sudo apt install mod_ssl

今回のリバースプロキシの設定では
 LoadModule 
コマンドを使って上の3つのModuleを有効化する必要があります。
 /etc/apache2/mods-avaliable 
に移動すると、Module一つ一つに対応したLoadModuleコマンドを記したファイル群が確認できます。
Copy Code

cd /etc/apache2/mods-avaliable

 proxy_module 
に対応したコマンドを確認してみます。ファイル名は
 proxy.load 
です。
Copy Code

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 
に移動します。
Copy Code

cd /etc/apache2/sites-available
viコマンドでファイルを開きます。
Copy Code

sudo vi default-ssl.conf
中をざっと見ると、ポート443接続(https接続)の時の処理が書かれているのが分かります。
Copy Code

<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 
のドメインを対象とする場合以下の通りです。
Copy Code

#確認した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    

#https通信設定
<VirtualHost *:443>
    DocumentRoot /var/www/engineer.host
    ServerName unity-engineer.top
    ErrorLog /var/log/apache2/engineer.host.error.log
    CustomLog /var/log/apache2/engineer.host.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-G    CM-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

    # errprsページ以外のアクセスは、リバースプロキシを使ってTomcatページに移動させる
    ProxyPass /errors !
    ProxyPass / https://unity-engineer.top:「Tomcatのhttpsポート設定」/「Tomcatのwebapps下サイトディレクトリ」
    ProxyPassReverse / https://unity-engineer.top:「Tomcatのhttpsポート設定」/「Tomcatのwebapps下サイトディレクトリ」

    # URL末尾が/homeであった場合、サイトトップページに移動させる
    RewriteEngine On
    RewriteRule ^/home / [R=301,L]

    # サーバーからerrorが返ってきたときは、それぞれのエラーに応じてDocumentRoot下のページに移動させる
    ProxyErrorOverride On
    ErrorDocument 400 /errors/400.html
    ErrorDocument 401 /errors/401.html
    ErrorDocument 403 /errors/403.html
    ErrorDocument 404 /errors/404.html
    ErrorDocument 408 /errors/408.html
    ErrorDocument 500 /errors/500.html
    ErrorDocument 502 /errors/502.html
    ErrorDocument 503 /errors/503.html
    ErrorDocument 504 /errors/504.html
</VirtualHost>

#http通信設定、httpsに受け流す
#ただしwell-knownからのアクセス(Let's Enctyptからのアクセス)はhttpsに移動させずhttpのDocumentRootに移動させる
<VirtualHost *:80>
    DocumentRoot /var/www/engineer.host
    ServerName unity-engineer.top
    ErrorLog /var/log/apache2/engineer.host.error.log
    CustomLog /var/log/apache2/engineer.host.access.log combined

    RewriteEngine On
    RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301]
</VirtualHost>

同じポート接続でも、ドメインが違えば遷移も分かれます。
例として
 unity-engineer.top 
 english-everyday.top 
で見てみます。
Copy Code

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

    RewriteEngine On
    RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301]
</VirtualHost>

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

    RewriteEngine On
    RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301]
</VirtualHost>

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

a2ensite default-ssl
a2enmod ssl

Apacheを再起動して完了。
Copy Code

sudo service apache2 restart
0
0