web-dev-qa-db-ja.com

Nginx + php-fpmは、Apache + mod-phpよりもはるかに高速であると想定されていますか

私はPHPベースのWebアプリケーションをApacheサーバーで実行していますが、バックエンドでかなりの量のphp処理があります。全体的なパフォーマンスが低いので、アプリケーションのパフォーマンスの改善に取り組みました。最初に私は、クライアント側のキャッシュ、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を使用してストレステストを行い、以下は、それから生成できるグラフです。

これらすべてのグラフで、x軸は送信した各リクエストで、y軸は各リクエストの応答を取得するためのミリ秒です。

ログインページにアクセスします

enter image description here

ログインページを送信します

enter image description here

ホームページにアクセス

enter image description here

その後、両方のサーバー設定で要求のドロップを開始したため、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のパフォーマンスの大きな違いを観察できませんでした。

以下は私の質問です。

  1. Nginx + php-fpmは、メモリやその他のリソースを効率的に使用するため、Apache + mod-phpよりもはるかに高速にサーバー操作を行うと想定されていますか?
  2. Nginxはサーバーの静的な競合のみに推奨され、重いサーバー運用サイトには推奨されませんか?
  3. よりパフォーマンスを向上させるためにNginxを構成するより良い方法はありますか?
18
Thilanka

私はこれについてもう少し調査しましたが、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に切り替えますか?」

  • 短い答え:わかりません。
  • より長い答えはここにあります:

    1. 多くのWebサイトをホストし、ユーザーが.htaccessファイルを使用して頻繁に変更する場合、答えはおそらく「いいえ」です。 Nginxに切り替えてすべての構成を新しい形式に変換するコストは、通常、別のサーバーを購入するコストに達します。
    2. 複数のサーバー上に単一のアプリケーションがあり、ほとんどの処理能力が静的ファイルコンテンツの提供によって消費されない場合も、答えはおそらく「いいえ」です。
    3. 主に静的コンテンツを提供している場合、答えは明らかに「はい」です。
    4. Webホスティングソリューション用の新しいシステムを作成している場合、答えはおそらく「はい」です。ユーザーが.htaccess機能を見逃さないか、または他の方法で提供されることを前提としています。
    5. NginxはApacheよりもメモリフットプリントが小さい傾向があるため、仮想化テクノロジを使用してサービスを統合する場合、答えはおそらく「はい」です。
    6. PHPサーバー最適化としてNginxを探している場合は、Nginxではなく、アプリケーションコードをもう一度見てください。
24
Thilanka

それがより高速である、またはそうであるはずであるという多くの主張があるにもかかわらず、それは、少なくとも無条件ではなく、より高速であるはずではありません。

どちらが速いか、mod_phpまたはext-fpmはまだ証明されておらず、変化する可能性があります。パフォーマンスに関しては、理論、実装、使用例、リソース、負荷の3つの考慮事項があります。

理論的には、mod_phpが最も高速です。 mod_phpを使用すると、Webサーバーとインタプリタが直接通信し、同じリソースとメモリ空間を共有します。 ext-fpmを使用すると、直接通信するのではなく、リソースを複製する必要のある別個のプロセスがあります。

多くの異なるユーザー、異なるバージョンを同時に実行するなどの点で柔軟性が高くなる傾向があるため、伝統的に個別のプロセスが一般的です。多くの人は、free()fclose()など.

Ext-fpmは、FastCGIを使用して、個別のプロセスモデルをその理論上の最大速度に適合させる試みですが、理論上の最大速度は、統一されたプロセスの理論上の最大速度よりも低速です。

どちらが最も速いかを見つけるのは難しい場合があります。他の人のテストは、適切に調整されていても、ユースケースやセットアップに関連していない可能性があるため、信頼できません。あなた自身のテストでは、一方を他方よりも速くすることができますが、それは誰かがやって来てそれを変更できないことを意味しません。より多くの時間とあなたの自由に理解を持っている誰かがあなたであるかもしれないこと。

Mod_phpの実装は、必ずしも理論上の最大速度を実現するものではありません。静的リクエストを処理するときに発生する他のすべてのものと比較して、SAPIのオーバーヘッドが取るに足らないことが特に多いため、この2つはそれほど離れていない可能性があります。多くのベンチマークは、実質的にnoopスクリプトを使用してテストする必要があるため、違いが顕著に現れます。

Ext-fpmは「高速」であるという一般的な信念になっています。これを維持する多くの力があり、それらのいくつかは無実であり、他は無能から引き出され、いくつかは正しく操作されます。

  1. Apache httpdは、さまざまな理由でスレッド化されたMPMではmod_phpを使用できないことを推奨していません。スレッドモデルまたはイベントドリブンモデルを使用したApache httpd。これは、PHPを提供しないリクエストにパフォーマンスに影響を与える場合があります。 PHPは、スレッドモデルとイベントドリブンモデルの両方のサポートに向けて大きな進歩を遂げましたが、それでもイベントドリブンの道のりは遠く、スレッドサポートは、従来のプロセスごとのテストほど完全にはテストされていません。サポート。多くの人がこれに混乱しています。これは、PHPより速くなるものではありません。トレードオフです。PHPの速度が低下する可能性があり、静的コンテンツを高速化します。Apacheは、mod_phpに対して完全に推奨しています。多くの人々を混乱させる可能性が高いだけでなく、誤解の可能性が高い起源は、ext-fpmが「より速い」と信じています。
  2. Apacheの推奨事項などに駆り立てられ、多くの人々がext-fpmを試してから、会議やブログでのスピーチなどのプラットフォームを使用して、その現象をより印象的な聴衆に伝える事例的な「成功」を報告しました。
  3. 結果がext-fpmへの切り替えの方が良い場合、その理由は多くの場合、ユーザーが期待するものではありません。 mod_phpからext-fpmに切り替えるときに多くの人がそれ以上のことを行っているか、他の要因が働いています。
  4. テクノロジーでは、Wordの高速化が特に問題になります。多くの場合、それは実際には何の意味もありません。私が使用した最後のいくつかのシステムは、非常に高速な(非常に人気のあるテクノロジー)とブランド化されており、その逆です。多くの人々は最速を意味するものと間違えます。実際にはあまり意味がない傾向があります。知覚の点で高速ですか? 100RPMで回転するハードドライブは、ほとんどの人にとって「高速」で回転しているように見えます。 1000RPMで回転するハードドライブは、ほとんどの人にとって「高速」で回転しているように見えます。最速はあまり意味がない傾向があります。
  5. 利益相反。 nginxには商業ベンチャーがあり、それがext-fpmのマーケティングの源になるかどうかはまだ分からない。これは、競合するWebサーバーでのみ使用可能なmod_phpよりも高速であると人々が信じるようにするnginxに役立ちます。ただし、nginxとPHPで利用できるスレッドパーティーモジュールがあるため、ext-fpmのソースロビー機能の可能性は低いと思われます。ただし、Googleの上位の結果は、マーケティングによるものです。関係者が明らかに搾乳しているように、関連する詳細のほとんどをスキップする商用ホスティングサービスにトラフィックを取り入れようとしているブログ。

多くの場合、人々は異なる結果を目にしても、その理由を理解できません。プロセス、測定値、およびトラフィックの詳細は省略されています。その後、人々はしばしばこれらの成功を繰り返して失敗し、なぜそれがより速くないのかを尋ねる人々の無限の検索結果を残します。大きな問題は、静的コンテンツの負荷が高い状態で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の状況は混乱しています。

6
jgmjgm

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を試してください。

5
Gichan