apacheとnginxとphp-fpmとfastcgiと。

スポンサーリンク

使ってるVPSのリソースがかなり切迫してきたので、apache+mod_phpだけでは辛いなぁ、という事で遅まきながらやっとnginxを絡めた構成に変える事にしました。
といっても今まで「nginx?何それおいしいの?」ぐらいの理解度だったので、試行錯誤の連続です。
結果的に自分の使い方だとこれが良かった、というのがやっと結果が出たので参考までに。

背景

・・・といってもWeb上のnginx関連の情報ってものすごく偏ってるというか、VPSでwordpressを最大限使いたいです、という前提条件にピッタリくる情報がなかなか無かったです。

まず多かったのが「nginx+fastcgiをインストールしてみた」、といった「歌ってみた」系の情報。設定のとっかかりはこれでいいんですが、それが速いか遅いか、サーバが安定するのかどうか、が全然分からない「インストールマニア」的な情報だったり、「nginxをリバースプロキシサーバにして別サーバのapacheとで運用」という、いやそれ仕事なんでしょ、という情報だったり・・・サンデーエンジニアの「VPS1台でなんとかなりませんか」的なのがなかなか無かったです。

スポンサーリンク

特にインストール系は必要最低限の知識は手に入りますが、「いかに今のウェブサービスを停めずにやるか」の要素がないのでキツいです。この手のモノに手を出すのはパフォーマンス向上が目的のはずで、そうすると現状既にサーバが停められない状況にあるはずなので。

前提条件

さて前提としてですが、

  • 基本Apacheの方が設定は慣れてる
  • けどApache+mod_phpで、後はwordpressのキャッシュ満載運用だと限界が見えてきた
  • とりあえずVPS乗り換えとかにならないんだったらなんとか今のリソースでなんとかしたい

というあたりでサーバが停められない(停めたくない)、というのが条件になるかと思います。

私の場合はそこに、「Load averageが最近異様に上がってきて困っている」という問題があって、これをどうにかしたい、というのが発端でした。以前はせいぜい1.0前後だったのが、普通に5.0台になって、過負荷状態になると50とか100とか気前の良すぎる数値になってしまい、mysqlとapacheのなんかが原因なんだけど分からないのでcronで一定時間で「killall -HUP httpd」とかしてしのぐ、という状態。

選択肢

で、試してみたのが、

  1. apache+mod_phpとnginxリバースプロキシ
  2. apache+fastcgi
  3. nginx+php-fpm

この3つでした。結論から言うと3つ目のnginx+php-fpmが一番パフォーマンスが良さげです。その次が1つ目のnginxをリバースプロキシとしてだけ使うバージョン。2つ目のapache+fastcgiは、mod_fastcgiとmod_fcgidと2種類ある上に、メリデメがありありであまり使いよいと思いませんでした。

テスト方法

具体的な設定方法はそれぞれのブログとかにお任せするとして、これらをapacheが普通に走っている状態でテスト+リプレイスするか、という所ですが、nginxは設定ファイルに待ち受けポートをバラバラに設定出来るので意外にフレキシブルに出来ます。2の方法以外ですけど。

例えば1つ目のnginxのリバースプロキシですが、最終的には、
nginx:80 => apahce:8080
という形にする為に、一旦
apache:80
nginx:8080 => apache:80
という設定にしてテストは8080ポートでやる、というので移行できます。これなら稼働しているサイトは80番のまま普通にサービス出来ますし、nginxの設定をミスってもapacheには影響無し。全部テストが終わったらnginxをlisten 80、apacheを8080にして、
service nginx stop; service httpd restart; servie nginx start
みたいなので寸断で切り替えできます。3のパターンも全てそれで対処可能です。

結果

それぞれのテスト結果とかは作業しながらだったので残ってませんが、
2のfastcgiはapacheをworkerで動かす、という観点からトライしたのですが、phpが不安定になりすぎるのでNG。

1のnginxリバースプロキシは効果はありました。nginxが頑張る分apacheが楽できるのでいい感じだったのですが、やはりここ一番mod_phpのでかいプロセスは変わってないので、キャッシュを作っていく過程が重い。

3のphp-fpmに全置き換えをしたらload averageが一桁台に落ちてくれました。最初は半信半疑だったんですが今も安定しているので大丈夫でしょう。デメリットはapacheのノウハウがほぼ生きない事ですかね。nginxは普通に「Bad Gateway」とか吐いちゃうので、あまり多発するようだとやっぱりapache+nginxリバースプロキシに戻すかも知れません。

3のメリットは上に書いたポート分けをする事で、apacheに全く触らずテスト出来る割にはシンプルな事かも知れません。

スポンサーリンク