Apache HTTPとApache Tomcatを連携するWebサーバを構築してみた

こんにちは、伊藤です。

今回は、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サーバの構築手順について紹介しました。
サーバの構築において少しでも参考になれば幸いです。

参考

  1. SAN付き自己署名証明書:https://qiita.com/nis_d1ce1984/items/b8f87d41ea108d47af61 ↩︎
  2. Virtual Hostの設定:http://httpd.apache.org/docs/2.4/en/vhosts/name-based.html ↩︎
  3. SSLモジュールの設定:https://httpd.apache.org/docs/2.4/ja/mod/mod_ssl.html ↩︎
  4. Mozilla SSL Configuration Generator:https://ssl-config.mozilla.org/ ↩︎
  5. ApacheとTomcatの連携:https://qiita.com/xyz666/items/387251d0aee41a25fec1 ↩︎
ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です