私はPHPベースのWebアプリケーションをApacheサーバーで実行していますが、バックエンドでかなりの量のphp処理があります。全体的なパフォーマンスが低いので、アプリケーションのパフォーマンスの改善に取り組みました。最初に私は、クライアント側のキャッシュ、gzipの有効化、js-cssの縮小などの手法に従って、パフォーマンスを大幅に向上させました。
パフォーマンスをさらに向上させるために、サーバーレベルの改善を試してみました。そこで、アプリケーションをApacheとNginxサーバーでホストして、アプリケーションのパフォーマンスを比較してみました。
ApacheではApache + mod-phpを使用し、Nginxではこの比較にNginx + php-fpmを使用しました。ほとんどのチュートリアルで説明したように、プロセッサのコアの数と同じ数のNginxワーカーを構成しました。私は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の同時アクセスがあったとしても、ApacheよりもNginxのパフォーマンスの大きな違いを観察できませんでした。
以下は私の質問です。
私はこれについてもう少し調査しましたが、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に切り替えますか?」
より長い答えはここにあります:
それがより高速である、またはそうであるはずであるという多くの主張があるにもかかわらず、それは、少なくとも無条件ではなく、より高速であるはずではありません。
どちらが速いか、mod_phpまたはext-fpmはまだ証明されておらず、変化する可能性があります。パフォーマンスに関しては、理論、実装、使用例、リソース、負荷の3つの考慮事項があります。
理論的には、mod_phpが最も高速です。 mod_phpを使用すると、Webサーバーとインタプリタが直接通信し、同じリソースとメモリ空間を共有します。 ext-fpmを使用すると、直接通信するのではなく、リソースを複製する必要のある別個のプロセスがあります。
多くの異なるユーザー、異なるバージョンを同時に実行するなどの点で柔軟性が高くなる傾向があるため、伝統的に個別のプロセスが一般的です。多くの人は、free()
、fclose()
など.
Ext-fpmは、FastCGIを使用して、個別のプロセスモデルをその理論上の最大速度に適合させる試みですが、理論上の最大速度は、統一されたプロセスの理論上の最大速度よりも低速です。
どちらが最も速いかを見つけるのは難しい場合があります。他の人のテストは、適切に調整されていても、ユースケースやセットアップに関連していない可能性があるため、信頼できません。あなた自身のテストでは、一方を他方よりも速くすることができますが、それは誰かがやって来てそれを変更できないことを意味しません。より多くの時間とあなたの自由に理解を持っている誰かがあなたであるかもしれないこと。
Mod_phpの実装は、必ずしも理論上の最大速度を実現するものではありません。静的リクエストを処理するときに発生する他のすべてのものと比較して、SAPIのオーバーヘッドが取るに足らないことが特に多いため、この2つはそれほど離れていない可能性があります。多くのベンチマークは、実質的にnoopスクリプトを使用してテストする必要があるため、違いが顕著に現れます。
Ext-fpmは「高速」であるという一般的な信念になっています。これを維持する多くの力があり、それらのいくつかは無実であり、他は無能から引き出され、いくつかは正しく操作されます。
多くの場合、人々は異なる結果を目にしても、その理由を理解できません。プロセス、測定値、およびトラフィックの詳細は省略されています。その後、人々はしばしばこれらの成功を繰り返して失敗し、なぜそれがより速くないのかを尋ねる人々の無限の検索結果を残します。大きな問題は、静的コンテンツの負荷が高い状態でmod_phpを使用してマルチプロセスベースのMPMを使用する場合に成功する人々です。静的リクエストからの負荷がPHPに跳ね返る可能性があるため、これらのケースは特に欺瞞的です。
もう1つのよくある間違いは、2つの異なる構成をテストすることです。 php-fpmの設定は、mod_phpの設定よりも最適化されている可能性があります。場合によっては、オリジナルを無視してより速くなると期待するものについてすべてを最適化するのと同じくらい簡単なこともあります。これは特に、リクエストが成功したかどうかを確認しないなど、メモリ制限や最大実行時間などを変更するような場合に特に重要です。人々がSAPIを変更することだけを意図している場合、時には不可避であり、時には透過的にさえ、多くのことが構成で変更される可能性があります。一般的な例は、ext-fpmが追加のコアを利用するために追加のプロセスを生成できるため、Webサーバーの制限がサーバーのリソースの使用率を最大化するには不十分である可能性があります。 PHPからFPMのWebサーバーにルーティングするなど、人々が移動するのを見るのが一般的です。
マルチプロセス、シングルスレッドのMPMを使用するmod_phpと比較すると、ext-fpmは優れた性能であるとは限りませんが、あらゆる面で多くの利点を持つ優れた候補です。負荷が完全にPHP=リクエストを処理している場合は、Apacheはすでにext-fpmがそうでなかった場合と同じように何もしていません。
また、レイテンシとスループット、サイクルとバイトと待機などの違いもあります。
理論的には、ngx_phpまたはmod_phpのいずれかを使用したphp-ztsが先の方法です。大きな注意点は、php-ztsはphp-ntsと同じようにほとんど取り入れられず、注意も注意も払われていないため、PHP実行自体にオーバーヘッドが発生し、phpとの競合が非常に困難になることです。現在-fpmです。実装では、最適化に到達しません。場合によっては、次善策は控えめな表現かもしれません。スレッド化されたPHP動的なコンテンツのみを提供し、共有ホスティングサービスを実行していない場合は、それほど心配する必要はありません。これは、Apacheによって調整された恐怖キャンペーンの可能性があるようです。php-比較的安定している唯一のオプションであるプラットフォームのzts。
彼らはより多くの実践的なものかもしれませんが、他のオプションがあります。自分でUNIXソケットを開いてFCGIを解析し、selectなどで非同期に処理することも可能です。 PHP=で発生するイベントの注意点は、MySQLなどの主要な高レベルのライブラリのほとんどIOライブラリがそれを統一的にサポートしていないことです。
php-swooleはまだ始まったばかりですが、有望に見え始めています。 php-fpm、mod_php、php-ztsの状況は混乱しています。
3台のサーバーの負荷分散を実行しているWebサイトがあります。 2つはnginxでPHP-FPM(新しいもの)を実行しています。ただし、メインサーバーはApache + PHP FastCGI hittngおよそ40%のトラフィック上にあります。最近、Apacheもnginxに変更することを考えたので、別のIP用に同じサーバーにnginxをインストールし、いくつかを行いましたしかし、驚くべきことに、Apacheはヒットごとに10〜20ミリ秒でページを生成できますが、nginxは60〜70ミリ秒かかります。静的ファイルの場合、nginxの方が高速ですが、CDNを使用している場合は、静的コンテンツを心配する必要はありません。Apacheは素晴らしいサーバーですが、PHPモジュールではなく、FastCGIを試してください。