- Web アプリケーションを開発している
- 本番環境では前段にリバースプロキシサーバを挟むことになっている
- そのリバースプロキシサーバからは何らかのリクエストヘッダが追加されてリクエストが流されてくる
こういう状況で、開発環境でも同じ状況を再現したい、という場合。
最も簡単な方法は ModHeader などのブラウザ拡張を利用してリクエストヘッダを書き換える方法だが、もっとちゃんと再現したい場合は自分で Nginx や httpd を動かす必要がある。
明らかに Nginx でやったほうが簡単なのだけど、今回は本番環境のリバースプロキシサーバが httpd で動いているので開発環境も httpd でやることにした。
Apache (httpd) といえばデフォルトの設定ファイル (httpd.conf) がとても長くて、どこが本当に必要な行なのかわからなくて嫌になってしまう。
今回はできる限り httpd.conf のデフォルト設定を削除して最小限の記述でリバースプロキシができるように試行錯誤してみた。
docker-compose.yml
version: '3'
services:
app:
# ポート 3000 で http を serve するアプリ
proxy:
image: httpd:2.4
ports:
- 8080:80
volumes:
- ./httpd.conf:/usr/local/apache2/conf/httpd.conf
environment:
PROXY_PATH: /
PROXY_URL: http://app:3000/
USER_ID: '012345'
httpd.conf
Listen 80
# 必須モジュール
LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule authz_core_module modules/mod_authz_core.so
# root で実行しないようにする
LoadModule unixd_module modules/mod_unixd.so
User daemon
Group daemon
# エラーログを stderr に流す
ErrorLog /proc/self/fd/2
# リバースプロキシの設定
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
ProxyPass ${PROXY_PATH} ${PROXY_URL}
ProxyPassReverse ${PROXY_PATH} {$PROXY_URL}
# リクエストヘッダを追加する
LoadModule headers_module modules/mod_headers.so
RequestHeader add X-Forwarded-User ${USER_ID}
docker-compose up
してブラウザから http://localhost:8080/ にアクセスして Web アプリケーションの画面が表示されれば OK。
アクセスログも流したい場合
上記の設定だと httpd のエラーしか Docker のログには出力されないが、アクセスログも流したい場合は以下を追加すればよい。
# アクセスログを stdout に流す
LoadModule log_config_module modules/mod_log_config.so
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog /proc/self/fd/1 combined