今現在、以下の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とかも上手く動くようになりました。
※グローバル変数を書き換えるのは危険な気もするけど…。

最新コメント