2006年09月07日

Yappoの本番環境って凄く手抜きしてて、一つのhttpd.confにstaticとmod_perlとcgiとphpな環境がごちゃ混ぜになってるんですよね。
問題ないように見えるようで実はmod_perlなアプリってメモリ食いまくりだから(数十MB)、性的なコンテンツを沢山のhttpdプロセスで処理するって事が出来ないのね。
まぁそんなケースは滅多にないけど。

mod_perlは8個くらい上がってれば十分で、その分メモリに余裕を作って他の事やろうとすると、静的なコンテンツの為のhttpdが足りなくなる。
みたいなジレンマがあって、いいかげんapacheの分離作業をやりました。
分離された物にフロントのapacheがprxoyする感じで。

昔のhttpdな構成をまとめると


+---------------------------------------------+
| apache1.3(static/mod_php/mod_perl/mod_proxy)|
+---------------------------------------------+
|
+---------------+
| |
+---------------+ +-------+
| apache2.0(SVN)| | tracd |
+---------------+ +-------+

#あとも一個別に開発環境

一番上のapacheは30Mくらい物理メモリを使ってます。
まずはmod_perlを全部分離する事から始めました。
この辺の方法論についてはライブドアを参考(WEB+DB PRESSとかオープンソースマガジンの記事参考)にして
apache作る時に--target=modperlしてます。

+------------------------------------+
| apache1.3(static/mod_php/mod_proxy)|
+------------------------------------+
|
+-------------------------------------+
| | |
+--------------------+ +---------------+ +-------+
| apache1.3(mod_perl)| | apache2.0(SVN)| | tracd |
+--------------------+ +---------------+ +-------+

#あとも一個別に開発環境

これでmod_perlが分離され、上のapacheの物理メモリ使用量が10Mくらいに落ちました。
ついでに、今までさぼってたstartup.plもやや真面目に作ったので全体のメモリ効率はかなりうpしました。

ここまで来たら、まだ何かしたくなるのが人の子ってことでphpとcgiも別プロセスに飛ばしたくなりました。
--target=modphpで分離です。


+----------------------------+
| apache1.3(static/mod_proxy)|
+----------------------------+
|
+----------------------------------------------------------------+
| | | |
+--------------------+ +-----------------------+ +---------------+ +-------+
| apache1.3(mod_perl)| | apache1.3(mod_php/cgi)| | apache2.0(SVN)| | tracd |
+--------------------+ +-----------------------+ +---------------+ +-------+

#あとも一個別に開発環境

さらに物理メモリ使用量が減り3Mくらいになりました。
フロントのプロセス上げ放題です。

フロントがmod_perlとかmod_phpに依存しなくなっちゃったのでapache2.2.3を入れる事にしました。preforkです。
これで今っぽい構成になってきました。


+----------------------------+
| apache2.2(static/mod_proxy)|
+----------------------------+
|
+----------------------------------------------------------------+
| | | |
+--------------------+ +-----------------------+ +---------------+ +-------+
| apache1.3(mod_perl)| | apache1.3(mod_php/cgi)| | apache2.0(SVN)| | tracd |
+--------------------+ +-----------------------+ +---------------+ +-------+

#あとも一個別に開発環境

phpとかcgiは
RewriteRule ^(.*\.(cgi|php3?))$ http://example.com:81$1 [P]
みたいな感じでforwardしてます。
ハマりどころはnph-なやつまでproxyすると、リクエストが全部処理されるまでクライアントが表示されなくなるので
RewriteRule ^/nph-ss(.*)$ /nph-ss$1 [PT]
みたいなことしてます。

とりあえず、こんな感じで再構築してちょっとは軽くなった気がしてます。
今後は画像のクライアントキャッシュとか設定をつめてみようかなぁと思います。
圧縮系はやらないです、トラフィックより負荷対策優先で。
mod_phpまでやったのは、折角だからとことんフロントのメモリ使用量さげちゃおうって事と、あんまりphpの為にプロセス上げとくのも無駄だからなぁって感じからでした。

そういえば

ProxyPassReverse / balancer://
みたいな設定書いてるblogを良く見かけますが、それ動かないよ。
ProxyPassReverseってbalancerを展開してくれないよ。
そのかわり複数書けるから
ProxyPassReverse / http://ap1
ProxyPassReverse / http://ap2
ProxyPassReverse / http://ap3
な感じで書こうね。

Posted by Yappo at 2006年09月07日 20:56 | TrackBack | tech
Comments

通りすがりですが、誤字を見つけたので、一言。
「性的なコンテンツを沢山のhttpdプロセスで処理する」
↑「静的」ですよね??

Posted by: at 2006年09月08日 00:44
Post a comment









Remember personal info?






コメントを投稿する前に↓の場所にnospamと入力してください。