なかなかいい結果が出ています。
ちょうど運良く(?)障害が発生し、リバースプロキシの耐障害性の検証できました!
同一サーバ内でも十分効果があるのでWeb屋さんは是非どうぞ。
現在、本番にて検証してます。
かなり、差が出てます。
PHP用のhttpdプロセス数が断然に少なくなりました。
ロードアベレージはあんまり変わってないのが残念です…。
しかし、いくつかの問題も発生しました。
アクセス制限が上手くいってなかった…。
これは、Apacheのモジュールで解決しました。
詳細はまた後日!
とりあえずは、明日の結果が楽しみです。
※ProxyPreserveHost Onを設定すると発生しない??
リクエストをプロキシされる側で問題が発生する場合がある。
今回遭遇したのは、$_SERVERに関する部分。
プロキシ:example.jpの80番ポート
APサーバ:example.jpの30080番ポート
とすると、
APサーバにて、$_SERVER['HTTP_HOST']を表示させると
example.jp:30080
となっている。
普通に考えればこれは当然なんだけど、
example.jp:80
になって欲しい。
他にも、 $_SERVER['REMOTE_ADDR']と$_SERVER['SERVER_NAME']も
APサーバ側の情報になる。
そんな時の対処法としては、
$_SERVER['HTTP_HOST'] = isset($_SERVER['HTTP_X_FORWARDED_HOST']) ? $_SERVER['HTTP_X_FORWARDED_HOST']:$_SERVER['HTTP_HOST']; $_SERVER['REMOTE_ADDR'] = isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR']:$_SERVER['REMOTE_ADDR']; $_SERVER['SERVER_NAME'] = isset($_SERVER['HTTP_X_FORWARDED_SERVER']) ? $_SERVER['HTTP_X_FORWARDED_SERVER']:$_SERVER['SERVER_NAME'];
という感じで、HTTP_X_FORWARDED系の情報を使い、プロキシ側に書き換えます。
これを使って、mojaviとかも上手く動くようになりました。
※グローバル変数を書き換えるのは危険な気もするけど…。
画像のリクエストを別httpdに任せたい。
理由は、負荷対策。
というわけで、手順を書いておく。
・実行用ユーザ作成
# groupadd -g 1001 www # useradd -d /home/www -g www -s /sbin/nologin -u 1001 www
・apacheをソースからインストール(workerとして)
# ./configure --prefix=/usr/local/apache_proxy --enable-mods-shared=all --enable-proxy --enable-proxy-http --with-suexec-caller=www --with-expat=builtin --with-mpm=worker # make # make install
・起動スクリプト作成
# vim /etc/rc.d/init.d/apache_proxy
・以下の内容を書き込み
#!/bin/sh
#
# Startup script for the Apache Web Server
#
# chkconfig: 345 85 15
# description: Apache is a World Wide Web server. It is used to serve \
# HTML files and CGI.
# processname: httpd
# pidfile: /usr/local/apache/logs/httpd.pid
# config: /usr/local/apache/conf/httpd.conf
APACHECTL=/usr/local/apache_proxy/bin/apachectl
PID=/usr/local/apache_proxy/logs/httpd.pid
# Source function library.
. /etc/rc.d/init.d/functions
# See how we were called.
case "$1" in
start)
echo -n "Starting apache_proxy: "
daemon $APACHECTL start
echo
;;
stop)
echo -n "Shutting down apache_proxy: "
daemon $APACHECTL stop
rm -f $PID
echo
;;
status)
status httpd
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
esac
exit 0
・実行権付与
# cd /etc/init.d # chmod +x apache_proxy # chkconfig --add apache_proxy
・リバースプロキシ設定
# cd /usr/local/apache_proxy/conf/ # vim httpd.conf Listen 80 ProxyRequests Off ProxyPreserveHost On ProxyPassReverse / http://localhost:30080/ RewriteEngine On RewriteRule ^/(images |css|js)/ - [L] RewriteRule ^/(.*) http://localhost:30080/$1 [P,L,QSA]
・APサーバ設定変更(/usr/local/apacheにインストールされていると仮定)
# cd /usr/local/apache/conf # vim httpd.conf Listen 30080
ちなみに、リバースプロキシはworkerにする。
理由は、こちら。

最新コメント