いつNGinxに切り替えるべきですか?


11

Apacheを介して、いくつかのドメインとアプリケーションが実行されているサーバーがあります。現時点ではすべてが順調ですが、テスト用にサーバーから始め、準備ができたらこのアプリケーション専用のサーバーを取得するなど、パフォーマンスを集中的に使用するWebアプリケーション(CPPCMSでC ++を使用)を開発する計画があります。

とにかく、Apacheよりもパフォーマンスが高いと思われるNGinxについて多くのことを聞いたので、その新しいプロジェクトで作業する価値があるかどうかを自問していました。NGinxがどのようなパフォーマンスのボトルネックを正確に修正するのかわからないので、私の頭の中では明確ではありません。

私はApacheのパワーユーザーではなく、貧弱なLinux管理者であり、Webアプリをあまり開発していません(しかし、概念はあります)。私は主にソフトウェアの作成に専念しているため、Webサーバーの部分は非常にわかりにくい場合があります。apachを使用してWebサイトを構成する必要があるたびに、すべてを壊さないようにドキュメントを参照するのに多くの時間が必要です。

そうは言っても、私はこの面でかなり良くなっていると思うが、まだアドバイスが必要だ。私はいくつかのnginx設定ファイルを見てきましたが、それはApacheのものよりもはるかに理解しやすいようですが、おそらく間違っていますか?

私が収集した情報から、NGinxはロードバランシングが必要な場合に最適な選択肢です。したがって、アプリケーションを複数のマシンに分散させる場合は正しいでしょうか。私はスケーリング(およびパフォーマンス)のアプリケーションを考えているので、必要なもののように見えますが、ApacheからNGinxに移行するのがいつ面白いかについてもっと知る必要があるかもしれません。現在のすべてのアプリでもNGinxに切り替える価値はありますか?それはどれくらいしますか?(つまり、一方から他方に切り替えるのに時間がかかりますか?)ApacheとNGinxの両方を同じマシンで問題なく使用できますか?

サイドノート:C ++の代わりにインタープリター言語を使用するように促さないでください。質問とは関係ありません。参照してくださいCPPCSM根拠のページをそれfromt種類のアプリケーションのどのような利益をもたらすことができます参照してください。欠点(RubyやPythonのアプリと比較して、電力消費量の少ないWebアプリで既に使用している)を完全に理解しており、それで問題ありません。

回答:


10

いくつかのポイント:

ApacheとNginxまたはLighttpd(私が個人的に非常に気に入っている)の主な違いはアーキテクチャです:

  1. Apacheはプロセスごとまたはスレッドごとに1つの接続を処理します(mod-XYZに依存)
  2. NginxとLighttpdは、単一イベントループ内の複数の接続を処理する単一スレッドです。

結果として:

  1. NginxとLighttpdは、多数の同時接続の下で非常によくスケーリングします。たとえば、1000の接続では、mod-preforkで1000プロセスまたはmod-workerで1000スレッドが必要になるため、Apacheはほとんど死にます。

    各接続に長いポーリングHTTP接続が必要なCometテクノロジーの使用を計画している場合、Apacheは適切にスケーリングされないため受け入れられません。

  2. NginxとLighttpdは、各接続に2つのソケット(HTTPとFastCGI)、中間メモリバッファー、およびいくつかの状態が必要なため、メモリの消費が少なくなりますが、Apacheはスタックなどを含むスレッド全体を必要とします。

ベンチマークでの個人的な経験から、Lighttpd(およびNginxも同様)はFastCGIバックエンドの方がApacheよりもわずかに高速ですが、これは接続量が少ないためです。

もう1つのポイントは、FastCGI接続を使用していくつかの負荷分散を行いたい場合です。

伝統的な建築には

                               |
                              HTTP
                               |
         Balancer (Nginx/Lighttpd/Cherooke/something-else)
            /      |           |            |      \
         HTTP    HTTP         HTTP        HTTP     HTTP
         /         |           |            |         \
 Apache+PHP   Apache+PHP   Apache+PHP   Apache+PHP   Apache+PHP   
  Server 2    Server 3     Server 4      Server 5     Server 6

Apacheはmod-PHP(または他のモード)を実行するプロセスのプールを処理するため

プールを単独で処理するCppCMSを使用する場合は、別のことができます。

                               |
                              HTTP
                               |
         Balancer (Nginx/Lighttpd/Cherooke/something-else)    
                           Server 1
            /      |           |            |      \
         FCGI    FCGI         FCGI        FCGI     FCGI
         /         |           |            |         \
    CppCMS App  CppCMS App  CppCMS App    CppCMS App  CppCMS App
     Server 2    Server 3     Server 4      Server 5     Server 6

CppCMSはプロセス、スレッド、接続プールを処理するため、基本的に別の間接レベルは必要ありません。PHP / Ruby / PerlはApache mod-XYZを必要とするか、独自のFastCGIコネクターを処理します。


+1 CppCMSの作者による素敵な完全な説明;)わかりました。今では全体的な問題がよく見えます。サーバーが1つしかない(最初から)場合は、HTTP-> Balancer-> FCGI-> CPPCMSです(正しく理解している場合)。FastCGIは高速ではないと言うJesper Mortensenのコメントからのアドバイスについてどう思いますか?
クライム

@Klaim:上記の優れた図面を見てください-このアーキテクチャでは、FastCGIは複数のサーバー間の相互接続として使用され、それぞれがマルチスレッドCppCMSインスタンスを実行しています。この場合、FastCGIの相対速度はそれほど重要ではありません。代替手段は、HTTP、AJP、および「高速」ではない他のネットワーク対応プロトコルです。この回答はおそらく承認済みとマークされ、質問は編集されます。これは、nginxがいつ価値があるかについてではないためです。
ジェスパーM

@Jesper Mortensen>私は同意しますが、質問に対して正確にどのような修正を提案しますか?
クライム

6

Nginxは、非常に(非常に)一般的言えば、ページをWebに提供する問題に対する異なるアーキテクチャのアプローチのおかげで、Apacheよりもはるかに高いスループットを得ることができます。Nginxは、主にリバースプロキシとしても構築されており、その役割を非常によく果たします(これは、あなたが言及した負荷分散ビットです)。一方、ApacheはWebページを提供するために構築され、後にプロキシ機能を獲得しました。

ただし、Apacheが一貫してNginxを上回る領域があることはほぼ確実ですが、Nginxが一貫してApacheを上回る領域もあります。

簡単な答えは、Apacheがあなたのために働いているなら、切り替える必要はないということです。(そして、これは完全に変換されたNginxの弟子になった元のApacheユーザーとして言っています。)サーバーへのトラフィックがApacheがボトルネックになっているレベルに達したときのみ(これは数千の同時接続、サーバーの仕様や他のサーバーの負荷に応じて大きく異なります)、またはApacheをリソースに乏しい環境で実行しようとしている場合、Nginxに切り替えると確実なメリットが得られます。

そうは言っても、もしあなたがNginxに切り替えたいなら(これをお勧めします!)何かメリットはありますか?10回中9回:いいえ、あなたはしません。しかし、あなたはそれは、あなたが良く、アパッチよりも設定Nginxはより快適に感じることができそうだとすれば、より良いnginxののコンフィギュレーション・ファイルの言語のようなことを述べているあなたのための利益!(個人的には、Apacheの設定は一般に読みやすいと思いますが、それは私がそれらを読むのに何年も費やし、Nginxにほんの数ヶ月しか費やしていないからかもしれません!)

サイドノートで:あなたはC ++でウェブアプリを構築したいというあなたの願いに言及しました。正気のために、代わりにPHP、Python、またはJavaなどの高レベル言語を使用することを強くお勧めします。次に、コードのプロファイルを作成し、特定のボトルネックに対処するためにC ++ベースのモジュールを作成することを検討します(PythonとPHPはどちらもこれをかなり簡単に許可します。Javaについては知りません)。全体的なパフォーマンスが心配な場合は、これを考慮してください:EVE Onlineは、世界最大の単一の非シャーディングMMORPGであり、C ++で記述された主要コンポーネント(グラフィックライブラリなど)のみを含むPythonのバリアント(Stackless Python)で構築されています。Pythonがそれを処理できるなら、確かにあなたのWebアプリを処理できますか?


+1ありがとう。C ++については、Jesper Mortensenの回答に対する私のコメントをご覧ください。また、PythonがEve Onlineのサーバー側で使用されていても(これについてはよく知っています)、ゲームプレイコード(大きな)のみを管理し、他の一部は実際にはC ++にあります。グラフィックスコードはクライアント側にあるため、このようなタイプのグラフィックパフォーマンスにはC ++が必須です。私が言ったように、私がそれを選んだ理由についてはCPPCMS Rationaleページを参照してください。あなたのアドバイスに従えば、アプリケーションを2回書く必要がありますが、非常に電力を消費することは既にわかっています。また、私は欠点を理解し、それで大丈夫です。
クライム

3

「いつ切り替えるべきか」という部分には、誰も実際に答えることができません。それは、負荷、独自のアプリケーションコードのパフォーマンスなどに依存します。

NGinx、Apacheよりもパフォーマンスが高いようです

nginxは、単一のプロセス(または非常に少数のワーカープロセス)を使用して、イベントI / Oを使用してすべてのクライアント接続を処理します。Apacheにはいくつかの「マルチプロセッシングモジュール」が用意されていますが、それらはすべて、多くのプロセスやスレッドに依存しています。その結果、Apacheは通常、基本的なHTTP接続処理のためにnginxよりも多くのRAMとCPUを消費します。KegelのC10Kページで、さまざまな接続処理アプローチの概要を取得できます

非常にパフォーマンスを重視するWebアプリケーション(CPPCMSでC ++を使用)

私はなり強く、より高いレベルの言語(Pythonの、または多分ルビー、スカラ座)で基本的なWebアプリケーションを行うことを検討することをお勧めし、非同期「パフォーマンス集約型」のタスクを処理ワーカーマシンに作業チケットを送信するためにmesssageキューを使用しています。

負荷分散が必要な場合は、NGinxが最適です。

nginxは優れたロードバランサーです。しかし、そのスペースには多くのオプションがあります

ApacheとNGinxを同じマシンで問題なく使用できますか?

はい。異なるIPポート番号やIPアドレスで実行するだけです。


「基本的なwebappを高レベル言語で実行することを検討することを強くお勧めします」>それは基本的なwebappとは言いませんでした-些細なことすらありません。CPPCMSを使用する理論的根拠を見ると、著者はそれが役立つ可能性のあるいくつかの点を指摘しています。私は他の選択肢を検討しましたが、少なくとも私が書いている種類のwebappでは、C ++を使用するよりも高価です。したがって、それは問題の一部ではありません。しかし、私はあなたのアドバイスを理解しており、WebアプリにC ++を使用すべきかどうかを尋ねる人々にも同じことをします。また、別のよりシンプルなアプリにPythonを使用する予定です。
クライム

とにかく、詳細については+1。
クライム

@Klaim:適切に調整されたC#/ Java実装よりも優れた「桁違いの」パフォーマンス改善を実現したい場合は、WebサーバーでインプロセスでCppCMSとアプリケーションコードを実行できるかどうかを確認してください。 nginx / Apache。CppCMSページには、WebサーバーとCppCMS間の接続としてFastCGIが表示されるようです。実際、FastCGIは高速ではありません。
ジェスパーM

>興味深いアイデア。周りのアドバイスのほとんどは、fastcgiを使用するべきだということです。これは、代替手段よりも高速だからです。これができるかどうかを確認します。CPPCMS作成者に、なぜそれが最速だと思うのかを見てみましょう。
クライム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.