[apache] apacheでリバースプロキシーを設定したときのメモ

1 月 8th, 2009 | by wads |

apacheでリバースプロキシの設定をしました。

■ 条件など

・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));

■ 参考文献
サーバ/インフラを支える技術

Post a Comment