[apache] apacheでリバースプロキシーを設定したときのメモ
1月 8th, 2009 Posted in apacheapacheでリバースプロキシの設定をしました。
■ 条件など
・Apacheのバージョンは2.2.8
・画像、css、jsなどの静的ファイルについてはリバースプロキシで配信を行う。
・動的なファイルのときはアプリケーションサーバにリクエストをプロキシする
・画像、css、jsのパスはそれぞれ以下の通り
wadslab.net/images wadslab.net/css wadslab.net/js
・アプリケーションサーバのIPは192.168.0.100
設定は「サーバ/インフラを支える技術」を参考にしています。
■ 設定
リバースプロキシの設定を行うのに必要なApacheのモジュールは以下のとおりです。
mod_rewrite mod_proxy mod_proxy_http
設定は、リバースプロキシサーバーのhttpd.confとか、httpd.confの下のほうにある
# Virtual hosts #Include conf/extra/httpd-vhosts.conf
のIncludeの部分をコメントアウトして、httpd-vhosts.confを編集します。
設定の内容は以下のようになります。
<virtualhost *:80> ServerName wadslab.net RewriteEngine On RewriteRule ^/(images|css|js|)/ - [L] RewriteRule ^/(.*)$ http://192.168.0.100/$1 [P,L] </virtualhost>
これでapacheを再起動すればバースプロキシの設定は終了です。簡単ですね。
一度リクエストをかけた後、リバースプロキシ、アプリケーションサーバの両方でaccess_logをみて、うまくリクエストを振り分けられたかどうか確認できます。
■ ssl通信を処理するときの設定
上記設定は80番のポートに対しての設定だったので、ssl通信についてもリバースプロキシで処理する場合はもう少し設定が必要す。
sslでのリクエストの場合は、私の環境ではhttpd.confを以下のように編集して、
# Secure (SSL/TLS) connections Include conf/extra/httpd-ssl.conf #コメントをはずす
httpd-ssl.confというファイルで設定をしています。
以下、これを前提に記述します。
sslでリクエストがきた場合、httpd-ssl.conf内の
<virtualhost _default_:443> ... </virtualhost>
のディレクティブの設定が適用されます。
設定自体は、上記ディレクティブ内に
RewriteEngine On RewriteRule ^/(images|css|js|)/ - [L] RewriteRule ^/(.*)$ http://192.168.0.100/$1 [P,L]
と書けばOKです。
設定の通り、リバースプロキシーとアプリケーションサーバ間のリクエストは非sslとなるので、アプリケーション側でsslでのリクエストかどうかを知りたい場合は、ちょっと工夫が必要です。
以下のように、プロキシさせる場合にはヘッダーを設定して、
RewriteEngine On RewriteRule ^/(images|img|css|js|favicon\.ico)/ - [L] RequestHeader set X_HTTPS 'on' RewriteRule ^/(.*)$ http://192.168.23.210/$1 [P,L]
phpの場合は、アプリケーション側で以下のようにして感知できます。
if($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTP_X_HTTPS'] == 'on') { $ssl_req = true; } define('HTTPS', isset($ssl_req));
■ 参考文献
・サーバ/インフラを支える技術