ApacheとTomcatの連携設定とSSL化

前回のブログに引き続き、ここではApacheとTomcatの連携設定とSSL化について備忘録を兼ねて紹介したいと思います。まずは、インストール環境を以下に記載します。

・ OS Windows Server 2022 Datacenter バージョン:21H2
・ Apache 2.4.57 VS17
・Tomcat 9.0.76
・ SSL Let’s Encrypt

最初にTomcat側を設定します。

8080ポートを停止し、AJPプロトコルでの接続を準備します。
Tomcatインストールディレクトリの「\conf\server.xml」をひらき、8080ポートでの接続設定を以下の通りコメントアウトします。
<!--
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
-->

「AJP/1.3」を使用してApacheとの接続を準備します。
上記と同様に、Tomcatインストールディレクトリの「\conf\server.xml」をひらき、AJP/1.3ポートでの接続設定のコメントアウトを外し、「secretRequired」オプションを「false」に設定します。
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector protocol="AJP/1.3"
address="::1"
port="8009"
secretRequired="false"
redirectPort="8443" />

server.xmlの修正が完了したらTomcatを再起動します。

次にApache側を設定します。

Apacheのproxy_ajpモジュールmod_proxy.soとmod_proxy_ajp.soを使用します。
C:\Apache24\conf\httpd.confをひらき、以下のようにコメントアウトを外します。
LoadModule proxy_module modules/mod_proxy.so<
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
上記ファイルに「httpd-proxy.conf」の読み込み設定を追記します。
Include conf/extra/httpd-proxy.conf

「extra」フォルダ内に「httpd-proxy.conf」を作成し、下記を記述します。
<Location /oldAgeFundSimulation/>
ProxyPass ajp://localhost:8009/oldAgeFundSimulation/
</Location>

Apacheを再起動して無事に起動が完了することを確認します。

次にApache に Let’s Encrypt を導入します。

Apache の設定ファイルであるhttpd.confを編集します。
httpdがリクエストを受信するポート番号:通常 HTTPS であれば443を追加します。
(80もそのまま残しておきました)
Listen 80
Listen 443
必要となるモジュールのコメントを外します。
LoadModule md_module modules/mod_md.so # mod_mdモジュール本体
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so # セションキャッシュ
LoadModule ssl_module modules/mod_ssl.so # SSL
LoadModule watchdog_module modules/mod_watchdog.so # mod_mdが利用するフック機構
エラーメッセージ中に記述するお問合せ先(メールアドレス)を修正します。
(デフォルトのままだと証明書発行の認証に失敗)
ServerAdmin webmaster@mydomain.com
下記を読み込む設定を追加します。
Include conf/extra/httpd-ssl-le.conf

「extra」フォルダ内に「httpd-ssl-le.conf」を作成し、下記を記述します。
# Let's Encrypt
MDBaseServer on
MDCAChallenges tls-alpn-01
MDCertificateAuthority https://acme-staging-v02.api.letsencrypt.org/directory
MDCertificateAgreement https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf
MDomain mydomain.com

SSLSessionCache "shmcb:${SRVROOT}/logs/ssl_scache(512000)"
SSLSessionCacheTimeout 300

<VirtualHost *:443>
SSLEngine on
ServerName mydomain.com
DocumentRoot "${SRVROOT}/htdocs"
Protocols http/1.1 acme-tls/1
</VirtualHost>

Windows Defender ファイアウォールでポート443を開放する設定を行います。

証明書の発行を行います。<==管理者権限のコマンドプロンプトより再起動のコマンドを実行します。
>cd \Apache24\bin
>httpd.exe -k restart # Apacheの再起動
再度、Apache を再起動(1回目の再起動ではエラーとなる)
httpd-ssl-le.confの MDCertificateAuthority をコメントアウト(#)
Apache のインストール先フォルダ配下のmdというフォルダを削除
Apache を再起動(前回同様、1回目の再起動ではエラーとなる)
Apache を再起動

ここまででWEBサーバーにSSLで接続できることを確認できましたが、SSLを設定するとアプリケーションにアクセスできなくなりました。そこで、以下の設定を行うことによりアプリケーションにアクセスできることを確認することができました。

<HTTPにリダイレクトされるのを強制的にHTTPSに書き換える設定>
Apache の設定ファイルであるhttpd.confを編集して以下のモジュールのコメントを外します。
LoadModule headers_module modules/mod_headers.so
「extra」フォルダ内の「httpd-proxy.conf」に以下を追記します。
Header edit Location ^http:// https://

以上色々調べて試行錯誤しながらようやく設定することができ、これにより自作のJavaアプリケーションを公開できる環境が整いました。いずれこのサイトで紹介できたらうれしいです。