こんにちは、伊藤です。
今回は、Apache HTTPとApache Tomcatを連携するWebサーバの構築手順について紹介します。
連携Webサーバの利点
Apache HTTPはHTTPの処理(リクエストとレスポンス)に優れており、Apache TomcatではJAVAの実行処理(動的処理)が可能です。これらを組み合わせることで応答性を担保した動的Webアプリケーションを構築することができます。
Apache HTTPでは複数のドメインで別々のWebサイトを提供することができます。利用者と管理者それぞれにWebサイトを提供したい場面があったため、今回はその設定をApache Tomcatのサンプルページを利用して紹介します。
使用環境
構築時に利用した環境は以下です。
- Rocky Linux 9.2
また、クライアントPCからWebサーバに対してhttp, https通信ができるようにしておく必要がありますが、今回は割愛します。
ソフトウェアインストール
以下のソフトウェアをインストールします。
- Apache HTTP
- Apache HTTP SSLモジュール
- Apache Tomcat
- OpenJDK
Apache HTTPのインストール
Apache HTTPをインストールし、バージョンを確認します。
$ sudo dnf -y install httpd
$ httpd -v
Server version: Apache/2.4.62 (Rocky Linux)
Server built: Aug 3 2024 00:00:00
Apache HTTP SSLモジュールのインストール
Apache HTTP SSLモジュールをインストールし、バージョンを確認します。
$ sudo dnf -y install mod_ssl
$ rpm -aq | grep mod_ssl
mod_ssl-2.4.62-1.el9.x86_64
Apache Tomcatのインストール
Apache Tomcatをインストールし、バージョンを確認します。
$ sudo dnf -y install tomcat
$ tomcat version
Server version: Apache Tomcat/9.0.87
Server built: Jan 10 1970 04:21:54 UTC
Server number: 9.0.87.0
OS Name: Linux
OS Version: 5.14.0-284.11.1.el9_2.x86_64
Architecture: amd64
JVM Version: 11.0.25+9-LTS
JVM Vendor: Red Hat, Inc.
OpenJDKをインストール
OpenJDKをインストールし、バージョンを確認します。
$ sudo dnf -y install java-17-openjdk
$ java -version
openjdk version "17.0.13" 2024-10-15 LTS
OpenJDK Runtime Environment (Red_Hat-17.0.13.0.11-1) (build 17.0.13+11-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-17.0.13.0.11-1) (build 17.0.13+11-LTS, mixed mode, sharing)
Webアプリケーションのダウンロード
dnfでインストールした場合Apache TomcatのWebアプリはダウンロードされないため、Tomcatが提供するWebアプリ(ドキュメント集や管理者用Webアプリ)をダウンロードサイトからダウンロードします。ダウンロード対象フォルダはwebapps配下のフォルダです。ダウンロードしたフォルダはWebサーバのtomcat/webapps配下に配置します。
「ROOT」ディレクトリはドキュメントルート「/」のwebページの配置場所となりますが、今回は使用しないため、ディレクトリ名を「ROOT」から「home」に変更します。
ダウンロードサイト:https://tomcat.apache.org/download-90.cgi
Apache Tomcatのサンプルwebアプリ用ファイル(sample.war)もダウンロードします。sample.warファイルをtomcat/webapps配下に配置します。配置するとsampleディレクトリが自動生成されます。
ダウンロードサイト:https://tomcat.apache.org/tomcat-7.0-doc/appdev/sample/
Webアプリの配置を確認します。
$ ls /usr/share/tomcat/webapps/
docs examples home host-manager manager sample sample.war
自己署名証明書の作成
検証用の自己署名証明書を作成します。自己署名証明書は信頼されていないため、本番環境での使用は推奨されていません。本番環境では認証局(CA)から発行された証明書を使用してください。今回はSAN付き自己署名証明書の作成方法1を参考にして、複数のWebサイトに対応するSubject Alternative Name (SAN) 付き証明書を作成します。
秘密鍵の作成
秘密鍵(server.key)を作成します(RSA4096ビット長)。
$ sudo openssl genpkey -algorithm RSA -out /etc/pki/tls/private/server.key -pkeyopt rsa_keygen_bits:4096
署名リクエストの作成
署名リクエスト(server.csr)を作成します。
$ sudo openssl req -new -key /etc/pki/tls/private/server.key -out /etc/pki/tls/certs/server.csr
署名リクエストで以下の質問に回答します。
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Minato-ku
Organization Name (eg, company) [Default Company Ltd]:Example Inc.
Organizational Unit Name (eg, section) []:Example section
Common Name (eg, your name or your server's hostname) []:example.com
Email Address []:admin@example.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
署名リクエストを確認します。
$ openssl req -text -in /etc/pki/tls/certs/server.csr -noout
Certificate Request:
Data:
Version: 1 (0x0)
Subject: C = JP, ST = Tokyo, L = Minato-ku, O = Example Inc., OU = Example section, CN = example.com, emailAddress = admin@example.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (4096 bit)
…<省略>…
証明書の作成
SANを記述したファイル san.txtを作成します。
$ vim san.txt
subjectAltName = DNS:example.com, DNS:manager.example.com, DNS:user.example.com
証明書(server.crt)を作成します(有効期限約10年間)。
$ sudo openssl x509 -in /etc/pki/tls/certs/server.csr -out /etc/pki/tls/certs/server.crt -req -signkey /etc/pki/tls/private/server.key -days 3650 -extfile san.txt
証明書を確認します。
$ openssl x509 -text -in /etc/pki/tls/certs/server.crt -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
17:76:19:47:c7:0f:0b:fe:ff:b9:33:ec:21:3e:1f:83:e0:1b:8a:9a
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = JP, ST = Tokyo, L = Minato-ku, O = Example Inc., OU = Example section, CN = example.com, emailAddress = admin@example.com
Validity
Not Before: Dec 6 02:42:24 2024 GMT
Not After : Dec 4 02:42:24 2034 GMT
Subject: C = JP, ST = Tokyo, L = Minato-ku, O = Example Inc., OU = Example section, CN = example.com, emailAddress = admin@example.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (4096 bit)
…<省略>…
X509v3 extensions:
X509v3 Subject Alternative Name:
DNS:example.com, DNS:manager.example.com, DNS:user.example.com
…<省略>…
Apache HTTPの設定
HTTPの設定
HTTPの設定(/etc/httpd/conf/httpd.conf)です。下記の設定を行います。各種設定は、Virtual Hostの設定2、SSLモジュールの設定3、Mozilla SSL Configuration Generator4を参考にしました。
- ディレクトリ一覧表示を禁止する設定
- Virtual Hostの設定
- Tomcatへの転送設定
- SSLの設定
- httpからhttpsへのリダイレクト設定
$ sudo vim /etc/httpd/conf/httpd.conf
Listen 80
Listen 443
…<省略>…
ServerName example.com:443
…<省略>…
Options FollowSymLinks # Indexesを削除してディレクトリ一覧表示を禁止する
…<省略>…
# manager.example.com
<VirtualHost *:443>
# Webサーバ名
ServerName manager.example.com
# SSL設定
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLHonorCipherOrder on
SSLCertificateFile /etc/pki/tls/certs/server.crt
SSLCertificateKeyFile /etc/pki/tls/private/server.key
SSLCompression off
SSLSessionTickets off
# リクエスト転送設定
<Location "/home">
ProxyPass ajp://127.0.0.1:8009/home
</Location>
<Location "/manager">
ProxyPass ajp://127.0.0.1:8009/manager
</Location>
<Location "/host-manager">
ProxyPass ajp://127.0.0.1:8009/host-manager
</Location>
<Location "/docs">
ProxyPass ajp://127.0.0.1:8009/docs
</Location>
<Location "/examples">
ProxyPass ajp://127.0.0.1:8009/examples
</Location>
</VirtualHost>
# user.example.com
<VirtualHost *:443>
# Webサーバ名
ServerName user.example.com
# SSL設定
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLHonorCipherOrder on
SSLCertificateFile /etc/pki/tls/certs/server.crt
SSLCertificateKeyFile /etc/pki/tls/private/server.key
SSLCompression off
SSLSessionTickets off
# リクエスト転送設定
<Location "/sample">
ProxyPass ajp://127.0.0.1:8009/sample
</Location>
</VirtualHost>
<VirtualHost *:80>
# httpでアクセスした場合はhttpsに書き換える
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/\.well\-known/acme\-challenge/
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,QSA,L]
</VirtualHost>
SSLの設定
SSLを設定します(/etc/httpd/conf.d/ssl.conf)。
$ sudo vim /etc/httpd/conf.d/ssl.conf
#Listen 443
…<省略>…
# SSL設定
SSLCertificateKeyFile /etc/pki/tls/private/server.key
SSLCertificateFile /etc/pki/tls/private/server.crt
テストページの無効化
Apache HTTPのテストページ(/etc/httpd/conf.d/welcome.conf)をコメントアウトして無効化します。
$ sudo vim /etc/httpd/conf.d/welcome.conf
#
# This configuration file enables the default "Welcome" page if there
# is no default index page present for the root URL. To disable the
# Welcome page, comment out all the lines below.
#
# NOTE: if this file is removed, it will be restored on upgrades.
#
#<LocationMatch "^/+$">
# Options -Indexes
# ErrorDocument 403 /.noindex.html
#</LocationMatch>
…<省略>…
Apache Tomcatの設定
サーバ設定
Apache Tomcatサーバを設定します(/usr/share/tomcat/conf/server.xml)。http1.1通信無効化とlocalhostの8009番ポートからの※AJP1.3 通信を受け付けています。また、エラーページで詳細なエラー内容とTomcatのバージョンを非表示にします。
…<省略>…
<!--
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxParameterCount="1000"
/>
-->
…<省略>…
<Connector protocol="AJP/1.3"
address="127.0.0.1"
port="8009"
redirectPort="8443"
maxParameterCount="1000"
secretRequired="false"
/>
…<省略>…
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
…<省略>…
<Valve className="org.apache.catalina.valves.ErrorReportValve" showReport="false"
showServerInfo="false" />
</Host>
※AJP (Apache JServ Protocol):Apache tomcat 通信プロトコル
参考:ApacheとTomcatの連携5
環境設定
Apache Tomcatの環境を設定します(/usr/share/tomcat/conf/tomcat.conf)。
Apache TomcatとJavaのディレクトリがデフォルトから異なる場合は設定の変更が必要です。
以下はデフォルト設定となります。
# Where your java installation lives
JAVA_HOME="/usr/lib/jvm/jre"
# Where your tomcat installation lives
CATALINA_HOME="/usr/share/tomcat"
管理者用Webアプリの設定
管理者用Webアプリを設定します(/usr/share/tomcat/conf/tomcat-users.xml)。
ここでは、管理者用Webアプリのログイン情報を設定します。
managerを含むロール名はmanagerアプリに、adminを含むロール名はhost-managerアプリに対応します。
以下の例ではadminユーザはmanagerアプリとhost-managerアプリに、managerユーザはmanagerアプリにログインできます。
$ sudo vim /usr/share/tomcat/conf/tomcat-users.xml
<role rolename="admin"/>
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<role rolename="manager"/>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user name="admin" password="admin_password" roles="admin,manager,admin-gui,admin-script,manager-gui,manager-script,manager-jmx,manager-status" />
<user name="manager" password="manager_password" roles="manager,manager-gui,manager-script,manager-jmx,manager-status" />
</tomcat-users>
名前解決設定
FQDNでWebサーバにアクセスできるようにするために名前解決を設定します。今回はクライアントPC(Windows)のhostsファイルを編集します。
C:\Windows\System32\drivers\etc\hosts
<WebサーバのIPアドレス> user.example.com
<WebサーバのIPアドレス> manager.example.com
サービス起動・自動起動有効化
Apache HTTPとApache Tomcatのサービス起動および自動起動を有効化します。
$ sudo systemctl start httpd
$ sudo systemctl enable httpd
$ sudo systemctl start tomcat
$ sudo systemctl enable tomcat
Webサイト確認
FirefoxでWebページにアクセスします。
アクセスする際には自己署名証明書のために警告が発生しますが、このまま使用します。
管理者側Webサイト
管理者側Webサイトにアクセスできることを確認します。
https://manager.example.com/home
ここで「Manager App」を選択し、管理者用Webアプリ設定(tomcat-users.xml)のユーザー名とパスワードを入力します。
https://manager.example.com/managerにアクセスできることを確認します。
https://manager.example.com/homeで「Host Manager」を選択し、管理者用Webアプリ設定(tomcat-users.xml)のユーザー名とパスワードを入力した後に「Host Manager」にアクセスできることを確認します。
https://manager.example.com/homeで「Documentation」を選択し、ドキュメントページにアクセスできることを確認します。
利用者側Webサイト
利用者側Webサイトにアクセスできることを確認します。
https://user.example.com/sample/
さいごに
今回は、Apache HTTPとApache Tomcatを連携するWebサーバの構築手順について紹介しました。
サーバの構築において少しでも参考になれば幸いです。
参考
- SAN付き自己署名証明書:https://qiita.com/nis_d1ce1984/items/b8f87d41ea108d47af61 ↩︎
- Virtual Hostの設定:http://httpd.apache.org/docs/2.4/en/vhosts/name-based.html ↩︎
- SSLモジュールの設定:https://httpd.apache.org/docs/2.4/ja/mod/mod_ssl.html ↩︎
- Mozilla SSL Configuration Generator:https://ssl-config.mozilla.org/ ↩︎
- ApacheとTomcatの連携:https://qiita.com/xyz666/items/387251d0aee41a25fec1 ↩︎