目的
WebサーバとしてApache HTTP Serverをインストールし、外部からのリクエストをTomcatに連携させます。
※今回はTomcatとApacheは同じサーバ上で動作するように構築します。
構築環境
Iaas:AWS EC2
OS:RHEL-7.6_HVM_GA-20190128-x86_64-0-Hourly2-GP2(コミュニティ AMI)
Apache:2.4.6
Apache HTTP Serverをyumでインストール
$ sudo yum install httpd -y
httpd.confを設定
$ sudo vi /etc/httpd/conf/httpd.conf
1.ServerName ディレクティブ
ServerName 'サーバ名' (例)www.example.com:80
エラー画面を表示する時など、自分自身の名前を表示する際に使用されます。
設定しなかった場合、ApacheがIPアドレスから逆引きしてホスト名を検知し、ポートはリクエストを受けたポートを使用するようになります。
2.ServerTokens ディレクティブ
クライアントに送り返す、応答ヘッダ内にサーバのOS種別や組み込まれているモジュール情報を含めるかどうかを指定します。
ServerTokens Prod
3.TraceEnable ディレクティブ
TRACEメソッドでのHTTPリクエスト受け入れるか設定する項目。
XST対策のため、offを指定します。
TraceEnable off
4.<Directory> ディレクティブ
デフォルトのままだとサーバ内の/var/www/html配下がアクセス可能となり、ブラウザ上でディレクトリ一覧が表示されてしまう。
サーバ内が探索できてしまい、セキュリティ上よろしくないのでコメントアウトする。
<Directory "/var/www/html">
・・・
Options FollowSymLinks
・・・
</Directory>
5.リバースプロキシ設定
外部からのリクエストをtomcatに連携するように設定します。
今回はHTTP通信で行います。
# フォワードプロキシサーバとしての動作を有効/無効に設定します。
# Onだと公開プロキシになってしまうため、リバースプロキシとして設定する今回ではOffに設定します。
ProxyRequests Off
# すべてのクライアントに対しアクセス許可する場合
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
# 特定のクライアントのみアクセス可能にする場合
<Proxy *>
Order Deny,Allow
Deny from all
Allow from 許可するクライアントのDNSまたはIPアドレス
</Proxy>
# Tomcatにリクエストを連携する設定します。
# 後続で行うTomcatのアクセス制限を設定するとlocalhostでもアクセス出来なくなるため、
# 連携先はlocalhostではなく、ループバックアドレス(127.0.0.1)で指定します。
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
httpdサービスを起動する
$ sudo systemctl start httpd
ストップやステータス確認するときは以下の通り
$ sudo systemctl stop httpd
$ sudo systemctl status httpd
Tomcat側の設定
1.アクセス制限
Webサーバを配置した場合、ユーザーがTomcatへの直接アクセス出来るのはセキュリティ上良くありません。
そのため、ループバックアドレスからのアクセスのみ許可するようにserver.xmlを修正します。
$ vi /opt/apache-tomcat-8.5.61/conf/server.xml
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<!-- 以下のValueタグを追加します -->
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127.0.0.1" />
</Host>
SELinuxの設定
特定のディストリビューションではSELinuxがデフォルトで有効になっており、httpd_can_network_connectが無効化(off)されているため、http通信が出来ない場合があります。
そのため、httpd_can_network_connectの設定を確認し、必要があれば設定を変更します。
$ getsebool httpd_can_network_connect
httpd_can_network_connect --> off
以下の通り、httpd_can_network_connectの設定を変更して外部通信を許可します。
$ sudo setsebool -P httpd_can_network_connect=1
おわりに
以上の手順でWebサーバを通してアプリにアクセス出来れば成功です。
参考文献