ApacheとNginx


29

私は最近ApacheとNginxの違いを調査してきましたが、どちらを選択すべきか混乱しています。

私はいくつかの検索を行いましたが、2つの間に明確な比較はなく、ここの誰かが2つの違いについて意見を述べることができるかどうか疑問に思いました。

私の現在の知識は、mod_phpがfastcgiよりも高速で安全であることを理解させてくれますが、Apacheは同時接続とメモリ消費に関してははるかに悪いです。

私のサイトは多くの長いポーリングを使用していますが、非AJAX Webベースがあります(つまり、上部に長いポーリングがあるApache)。

Apacheのメモリ問題に対する私の最初の解決策は、長いポーリングをnode.jsを介して送信し、node.jsが2秒ごとにApacheにアクセスするようにすることでした。私はこれが十分ではないかもしれないと気づき、さまざまな解決策を検討しています。私の元のアイデアがうまくいったかどうかについては、まだ興味があります。

それでは、現代のウェブにとってどちらが良いでしょうか?ApacheまたはNginx?

更新:提示された提案はすべて適切で有効でした。私は、完全なNginxサーバーを使用するという元の2番目のアイデアに取り組んでいます。専用サーバーであるため、fastcgiのセキュリティの問題に悩まされることはなく、長いポーリングスクリプトをPHPで作成する必要があるため、高負荷の同時接続に対応できるサーバーが必要であり、Apacheはそれがいくらでもできない構造を変更しますが、それでもメモリが不足します。

私はマーティンFの答えにマークを付けました。彼が私の質問ポイントに非常に明確で完全な答えを与えたからです。 Nginxがプロキシでできる非常に非常にクールなものを見つけたからです。

おかげで、

回答:


28

あなたは私が対処する必要があると思ういくつかの誤解を持っているようです。

まず第一に、mod_phpはわずかに速いだけです。私のテストはすべて、差が非常に小さく、それを考慮する価値がないことを示しています。また、専用のサーバーを見て、 mod_phpは共有環境でのみ利点があります。実際、専用環境ではphp-fpmが利点を持ち、PHPとWebサーバーが異なるプロセスとして実行されるようになります。これは、php-スローログなどのfpm。

もし世界が白黒だったら、純粋なnginx設定でphp-fpmでphpをコンパイルしてください。すでにApacheが動作している場合、より現実的には、nginxをApacheのリバースプロキシにすると、セットアップ時間を数時間節約でき、パフォーマンスの違いはわずかです。

しかし、これははるかに素晴らしいセットアップを可能にするため、世界が一瞬白黒であると仮定しましょう。Webサーバーに対してnginx + php-fpmを実行します。アップロードを解決するには、nginxのアップロードモジュールとアップロード進行モジュールを使用します。これは、Webサーバーがアップロードを受け入れ、ファイルパスをPHPに渡すと、fastcgiプロトコルを介してnginxとPHPの間でファイルをストリーミングする必要がないことを意味します。(私はこれをライブセットアップで使用していますが、うまく機能しています!)

ユーザーのダウンロードには、x-accel-redirectと呼ばれるnginxs x-send-fileのような機能を使用します。基本的には、PHPで認証を行い、nginxが取得してそのファイルの転送を開始するヘッダーを設定します。PHPは実行を終了し、Webサーバーが転送を処理します。(繰り返しますが、私はこれをライブセットアップで使用していますが、うまく機能しています)

サーバーまたは他の長時間実行される操作にファイルを配布するために、PHPはこれに最適ではないことがわかります。そのため、異なるサーバー上のワーカー間でジョブを分散できるジョブサーバーであるgearmanをインストールします。言語。したがって、分散ワーカーを作成し、PHPが使用する100 MBの代わりに合計200 KBのメモリを使用して5つのワーカーを生成できます。甘い。(私もこれをライブで実行しているので、実際にはすべて可能です)

まだ取り上げていない場合、あなたの問題の多くはあなたのウェブサーバーとはまったく関係ないと思います。Apacheがその構造のためにあなたのウェブサーバーとの関係を強制するため、多くの場合、PHPよりもはるかに優れたツールがあり、PHPはこれを知っている言語であり、PHPを離れることなく作業をオフロードする優れたオプションを提供します。

私はnginxを強くお勧めしますが、スケーリングやパフォーマンスの問題がある場合はお気軽に私に書いてください。ここからメッセージを送信できるかどうかはわかりませんが、nginxでタグ付けされていないものについてはサーバーフォールトを追跡しないので、それ以外の場合はmartin@bbtn.usに書き込みます。:)


1
本当に物事をクリアしたくそー:)それは私が探していた説明だったおかげで。Apacheが私のサイトを使用して窒息死してしまうので、私はNginxの学習でかなり売れていると思います。幸いなことに、それは非常に簡単に移動できます。私はnode.jsの人々がその中にほとんどのものを書いて、本当に必要な場合にのみPHPセッションクラスをポーリングすると言っていることを意味します(ユーザーがウィンドウを閉じたときに検出する方法がない限り、これを行います:P)。うん、私は大規模なサーバーファームで実行しているので、セキュリティ上の脅威がないことを知っていると、非常に良い説明をありがとう:)
Sammaye

私はこれを見てきました:joeandmotorboat.com/2008/02/28/…そしてこれ:blog.webfaction.com/a-little-holiday-presentそしてそれは本当に私が長くできることの考えで子供を抱かせました私の心のコンテンツに本当に投票してください。Apacheとは異なり、単一のメモリの問題ではありません:)
サマエ

Javaとphpでマルチスレッドワーカーを作成できると言っているので、待ってください。私が見る最大の問題は、長いポーリングを使用してApacheで大量のメモリの問題が発生するため、サーバーであるということです。
サマエ

1
基本的に、Cで記述されたファイル配布ワーカーがあり、PHPのGearman拡張機能を使用して、Gearmanジョブサーバーに配布ジョブを送信し、それをワーカーに送信します。PHP、Java、Cなど。このワーカーは仕事を行い、ステータスをgearmanに報告します。ギアマンはPHPに報告します。(バックグラウンドジョブが選択されていない場合。この場合、PHPは待機せずに終了します)
Martin Fjordvald

2
これは古い投稿であることは知っていますが、nginx vs apacheのテーマで見つけた最も有益な投稿の1つです。タンス・マーティン、+ 1。
アコイMeexx

5

nginxをリバースプロキシとして実行することをお勧めします。すべての静的ファイルとキャッシュファイルを処理し(Apacheよりもかなり高速で、メモリオーバーヘッドが少ない)、動的コンテンツに対するすべてのリクエストをApacheに転送します。


はい、これはほとんどの人が、私は間違いなくこの:)を検討する必要があるでしょう気圧やっているように見えるものです
Sammaye

1
Apacheのmod_rpafを忘れずにインストールして、ロギングの目的でクライアントIPアドレスをパススルーできるようにします(そうでない場合、Apacheログはすべてのリクエストを127.0.0.1からのものとして表示します)。
グレッグアナンデール

今夜これを試す前に、一つのことを考えています。Nginxを介してPHPにサービスを提供するApacheにルーティングしている場合、長いポーリングにはまだApacheと同じ問題があるか、リバースプロキシで呼び出すとApacheが何らかの方法で異なる動作をしますか?
サマエ

1

mod_phpが他の選択肢よりも高速かどうかはわかりませんが、どこでこれを読みましたか?私はnginx + php-fpmを使用していくつかのラボテストを行いましたが、測定したところから他のすべてのセットアップに勝っています。

このセットアップをご覧くださいhttp : //interfacelab.com/nginx-php-fpm-apc-awesome/

http://www.dotdeb.org/の PHPパッケージを使用することを除いて、ほぼ同じように設定しました-php-fpmパッケージとすぐに使用できるinitスクリプトが含まれています。memecacheやsyckは使用しません。


stackoverflow.com/questions/78108 / ...ここから入手し、phpマニュアルを確認しましたが、php_modはcgiバージョンよりも大幅に優れていると言っています。セットアップは良好です。それも非常に簡単に見えます。調べてみます:)
サマエ

2
それは、CGIがFastCGIではなく組み込みモジュールよりもはるかに遅いことを示しています:)
pauska

1
さて、PHPプロセスの死(またはタイムアウト)が心配な場合は、FastCGI(またはPHP-FPM)が最適です。他の活動を中断することなく、死んだ子プロセスを殺すことができます。
pauska

1
はい。または、まあ、それは依存します。同時に処理できる低速リクエストの数(最大)はいくつですか?PHP FPMの最大スレッド数をそれに設定し、さらに必要な「高速」cgiの数を設定します。4GBのRAMを搭載したサーバーで200人のPHP-FPMの子を実行している人の話を聞いたことがあります。PHPの次のバージョン(5.3.3)には、標準でPHP-FPMが含まれます。このエンジンには、適応エンジンも含まれます。保留中のリクエストの数に応じて拡張されます。
-pauska

1
私は複数のサーバー(おそらく最大10台)で簡単に実行できますが、4GBサーバーで長時間ポーリングできる200の要求に適合することができれば、Apacheを実行する必要がある20サーバーのほぼ半分になります。うーん...今夜これをテストする必要があります
サマエ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.