今現在、以下の3パターンでロードアベレージなどを調べています。
- Apache+mod_phpのみ
- 静的コンテンツはwokerのApache,動的コンテンツはApache+mod_php
- 静的コンテンツはwokerのApache+mod_cache,動的コンテンツはApache+mod_php
仮想で2CPUで検証中。
最初は、どれも大して差がありません。
むしろ、分けている方がロードアベレージ高いです。
ただ、負荷が上がってくるとだんだんmod_php+Apacheが悲鳴をあげてきます。
ある時を境に、1のmod_php+Apacheが突然落ちます。(ログに出ないけどtopから消えてJMeterが止まる)
同じ負荷でも、2はちゃんとアクセスをさばいています。(若干重くなってはいるが表示はされる)
3はまだ検証していません。
ここらへんの結果から、静的コンテンツと動的コンテンツで分ける手法は
同一サーバ内でも有効だという仮説が立ちます。
負荷を軽減するというよりは、マシンパワーを余すことなく使いしっかりとアクセスをさばいている感じです。
ここはもう少し深堀していきます。
余裕が出たらJMeterの使い方や負荷テストの手順とかも書きたいなぁ。
※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とかも上手く動くようになりました。
※グローバル変数を書き換えるのは危険な気もするけど…。
とある環境にて、Xenとリバースプロキシを利用して
ちゃんと環境を作ろうと画策中。
年内にはすっきりさせたい!
画像のリクエストを別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にする。
理由は、こちら。

最新コメント