search
LoginSignup
26
Help us understand the problem. What are the problem?

posted at

updated at

ApacheとTomcatを連携させる

はじめに

Tomcatのインストールと自動起動の設定の続きとして、Apache側で受け取ったHTTPリクエストをTomcatに投げる設定をまとめてみました。

使用した環境

  • OS
    • CentOS 7.7(1908)
  • Java(Amazon Corretto)
    • Java 1.8.0_242
  • Apache
    • Apache-2.4.6
  • Tomcat
    • Tomcat-9.0.30

Apacheのインストール

  • yumコマンドでインストールした後、バージョン情報を表示して正しくインストールされたことを確認しておきます。
[root@akagi ~]# yum install -y httpd
[root@akagi ~]# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Aug  8 2019 11:41:18

Apacheの自動起動の設定

  • systemctl enable...で自動起動の設定をして、その後に自動起動設定を確認しておきます。
[root@akagi ~]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
[root@akagi ~]# systemctl list-unit-files -t service | grep httpd
httpd.service                                 enabled 

設定ファイルの編集

  • ここではhttpd.confを編集して、ApacheからTomcatへリバースプロキシでリクエストを投げる設定をします。

/etc/httpd/conf.modules.d/00-proxy.confの確認

  • /etc/httpd/conf.modules.d/00-proxy.confにはリバースプロキシに使われるモジュールの設定が記載されています。
  • mod_proxy.somod_proxy_ajp.soが記載されており、コメント行になっていないことを確認します。
    • 行頭が#だとコメント行になります。
  • mod_proxy_ajpを使うと、HTTPよりも効率の良いAJPというプロトコルを使ってTomcatと通信することができます。
    • かなり前はmod_jkmod_jk2というモジュールを使っていたと思うのですが、いつの間にか使用するモジュールが変わっていました...
00-proxy.conf
# This file configures all the proxy modules:
LoadModule proxy_module modules/mod_proxy.so
...
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
...

httpd.confのバックアップ

  • httpd.confを編集する前に、オリジナルの状態でhttpd.confをバックアップしておきます。
[root@akagi ~]# cd /etc/httpd/conf/
[root@akagi conf]# cp -a httpd.conf httpd.conf.org

リバースプロキシの設定

  • ProxyPassおよびProxyPassReverseを以下の要領で設定します。
    • ProxyPass {リクエストパス} ajp://localhost:8009/{Javaアプリのコンテキスト名}
    • ProxyPassReverse {リクエストパス} ajp://localhost:8009/{Javaアプリのコンテキスト名}
  • ProxyPassとProxyPassReverseはいずれも「リクエストパスに来たリクエストを、アプリケーションサーバー(※ここではTomcat)に転送する」という役割を持ちますが、リダイレクトを使う場合はProxyPassReverseを設定しておく必要があります。
    • 以下の例では、リクエストがhttp://{サーバーのIP}/tomcat9/にマッチする場合、自ホスト(localhost)の8009番ポートのコンテキスト名/(※Tomcatの管理画面)に転送する設定となっています。
    • 参考URL:mod_proxy再入門 – ProxyPassとProxyPassReverse
/etc/httpd/conf/httpd.conf
# 以下をファイルの末尾に追記
ProxyPass /tomcat9/ ajp://localhost:8009/
ProxyPassReverse /tomcat9/ ajp://localhost:8009/
  • 例えば、Tomcat上で動作しているコンテキスト名がtestのアプリに対してリバースプロキシの設定をする場合は、以下のような設定になります。
    • tomcat9としている箇所は、任意の文字列に置き換え可能です。
/etc/httpd/conf/httpd.conf
# 以下をファイルの末尾に追記
ProxyPass /tomcat9/ ajp://localhost:8009/test/
ProxyPassReverse /tomcat9/ ajp://localhost:8009/test/

設定の反映

  • CentOS5系およびCentOS6系ではservice httpd gracefulを実行して、Apacheを強制的に再起動させるのではなく、設定値の反映だけをさせてきましたが、CentOS7系のApacheだとgracefulが使えません。
  • こちらの記事によると、reloadを使ってsystemctl reload httpdを実行すれば、従来のgracefulと同じ効果が得られるそうです。
[root@akagi ~]# systemctl reload httpd

動作の確認

  • 最後にhttp://{サーバーのIP}/tomcat9/にアクセスして、Tomcatの管理画面が見られることを確認します。

image.png

関連する作業

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
26
Help us understand the problem. What are the problem?