私は、バックエンドでかなりの量の PHP 処理を行っている Apache サーバー上で PHP ベースの Web アプリケーションを実行しています。全体的なパフォーマンスが低いため、アプリケーションのパフォーマンスの向上に取り組みました。まず、クライアント側のキャッシュ、gzip の有効化、js-css の縮小などの手法を採用し、パフォーマンスを大幅に向上させました。
パフォーマンスをさらに向上させるために、サーバー レベルの改善を試してみたかったのです。そこで、Apache サーバーと Nginx サーバーでアプリケーションをホストしてパフォーマンスを比較してみました。
- Nginx バージョン - 1.0.15;
- Apache バージョン - 2.2.15;
- php バージョン - 5.4.38;
この比較では、Apache では Apache + mod-php を使用し、Nginx では Nginx + php-fpm を使用しました。ほとんどのチュートリアルで説明されているように、Nginx ワーカーの数をプロセッサのコア数と同じ数に設定しました。ストレス テストには jmeter を使用しました。以下は、jmeter から生成したグラフです。
これらのグラフではすべて、x 軸は送信した各リクエスト、y 軸は各リクエストの応答を取得するのにかかった時間 (ミリ秒) です。
ログインページにアクセスする
ログインページを送信する
ホームページにアクセス
両方のサーバー設定でそれ以降リクエストがドロップされ始めたため、1 秒以内にログインした同時ユーザーが 100 人までしかテストを実行できませんでした。
Nginx のパフォーマンスは Apache より少し向上しましたが、サーバー アーキテクチャをすべて Apache から Nginx に変更するほど大きな違いはありませんでした。また、サーバー リソースの使用率を観察しても、Nginx と Apache の間に大きな違いは見つかりませんでした。
他の人が行った比較を調べたところ、次のグラフに示すように、同時アクセスでは Nginx の方がはるかに高速であると主張していることがわかりました。
http://www.eschrade.com/wp-content/uploads/2014/01/event-mpm-nginx.gif
しかし、1 秒以内に 100 件の同時アクセスがあった場合でも、Nginx と Apache のパフォーマンスに大きな違いは見られませんでした。
以下が私の質問です。
- Nginx + php-fpm は、メモリやその他のリソースを効率的に使用するため、Apache + mod-php よりもサーバー操作がはるかに高速になると思われますか?
- Nginx は、サーバーが静的なコンテンツを扱う場合にのみ推奨され、サーバー操作が重いサイトには推奨されないのでしょうか?
- パフォーマンスをさらに向上させるために Nginx を設定するより良い方法はありますか?
ベストアンサー1
これについてもう少し調査したところ、Nginx は静的リソースではうまく機能しますが、php-fpm などの外部アプリケーションの助けを借りて実行する必要がある php 処理などの他の動的コンテンツ配信ではうまく機能しないことがわかりました。したがって、Web アプリケーションで php 処理のパフォーマンス ボトルネックが発生する場合は、Apache を Nginx に置き換えても解決にはなりません。
次の記事では、Apache + mod_php と Nginx + php-fpm を使用して静的コンテンツ配信と PHP スクリプト結果配信を比較した詳細な調査について説明します。
http://blog.a2o.si/2009/06/24/apache-mod_php-compared-to-nginx-php-fpm/
上記記事で述べた結論のポイントは以下のとおりです。
結論、または「Apache から Nginx に切り替えるべきでしょうか?」
- 短い答え: 分かりません。
より長い回答はここにあります:
- 多数の Web サイトをホストしていて、ユーザーが .htaccess ファイルを使用して頻繁に変更する場合、答えはおそらく「いいえ」です。Nginx に切り替えてすべての構成を新しい形式に変換するコストは、通常、別のサーバーを購入するコストに達します。
- 複数のサーバーに単一のアプリケーションがあり、処理能力の大部分が静的ファイル コンテンツの提供に消費されていない場合も、答えはおそらく「いいえ」です。
- 主に静的コンテンツを提供している場合、答えは明らかに「はい」です。
- ウェブホスティングソリューション用の新しいシステムを作成している場合、ユーザーが.htaccess機能を必要としないか、他の手段で提供されると仮定すると、答えはおそらく「はい」です。
- 何らかの仮想化テクノロジーを使用してサービスを統合している場合、Nginx は Apache よりもメモリ フットプリントが小さくなる傾向があるため、答えはおそらく「はい」になります。
- PHP サーバーの最適化として Nginx を検討している場合は、Nginx ではなくアプリケーション コードをもう一度見直してください。