Nginx + PHP-FPM vs Apache2 Prefork + mod_php

フォーラムのこのトピックからすべてが始まりました。多くの人々が真剣に推論を始めたとき、nginxはApacheよりも速くはなく、公式サイトからのドキュメントの翻訳も納得がいかないと言いました。 ご存知のように、注意を引くためのスケジュールをテストして示すことほど楽しいものはありません。 たとえば、総サーバー負荷のグラフでは、Nginxのテストステージがどこにあり、Apacheがどこにあるかを推測してみてください。

画像

さて、あなたが正しい答えを見つける前に-サーバーとテストメカニズムについて少し。

VDSを「ねじる」疑いを排除するために、この構成のフォーラム参加者の1人からテストのために親切に提供されたサードパーティサーバーでテストを実行しました。

AMD Athlon X2 5600+ 4 GB DDR2 2 x 400 GB HDD 、Linux Debian、最小インストール。 すべてのソフトウェアは、apt-getを介して標準的な方法でインストールされました。 PHPとApacheは両方とも最小モードに設定されていました。

テストオブジェクト用に、MySQLなしで動作する非常に軽量なMoscquitoブログを設定し、そこにいくつかの投稿とコメントを書き込みます。



まず、NginxとApacheのベンチマークを開始する前に、サーバーを再起動したことを伝えたいと思います。 ネットワークサブシステムは、操作を高速化するために少し工夫されています。

sysctl -w net.core.rmem_max=16777216

sysctl -w net.core.wmem_max=16777216

sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"

sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"

sysctl -w sysctl net.ipv4.tcp_window_scaling=1

sysctl -w sysctl net.ipv4.tcp_timestamps=1

sysctl -w sysctl net.ipv4.tcp_sack=1

sysctl -w net.ipv4.tcp_no_metrics_save=1

sysctl -w net.ipv4.tcp_moderate_rcvbuf=1

sysctl -w net.core.netdev_max_backlog=1000

sysctl -w net.ipv4.tcp_congestion_control=htcp

sysctl -w net.core.somaxconn=1000

ifconfig eth0 txqueuelen 1000







そして、テストされたベンチマークとベンチマーク自体の正しい作業の制限が増加しました。

ulimit -s unlimited

ulimit -n 1024000







両方のWebサーバーで、300秒のタイムアウトが設定されました(Apacheの標準、Nginxではそれよりも短い)。



PHP-FPM


プロセスはTCPソケットに関連付けられ、4つのプロセスからなる2つのプールがそれぞれ静的モードで作成されました。



nginx


それぞれ10240の接続を持つ2つのワーカー。phpはアップストリームとして接続されます。

upstream php {

server 127.0.0.1:9000 max_fails=1 fail_timeout=60s;

server 127.0.0.1:9001 max_fails=1 fail_timeout=60s;

}









アパッチ


キープアライブは無効で、MaxClientsとServerLimitは10240に設定されています



ベンチマークについて



20万個のボットがメインページに侵入し、5,000人の合法的なユーザーがサイトにアクセスするときに、DDOS攻撃の下でWebサイトの状況を作成しようとしました。

即興のDDOS攻撃はabで簡単に可能です。 しかし、ユーザーの場合、サイトマップを生成しそれを包囲する必要がありました。



テストには1時間かかり、abを使用してサイトの可用性レコードが記録されました。 以下は、画面で並行して実行した2つのコマンドです。

while true; do ab -r -t 300 -n 20000 -c 20000 213.239.211.15 >> nginx.log; sleep 5; done



while true; do siege -i -f urllist.txt -c 5000 -b -t1M ; sleep 5; done








当然、Apacheベンチマークでは、ログはapache.logに書き込まれました



チャートに移りましょう




画像

ご覧のように、プロセスの数はApacheの操作中にのみ変更されます。MPMPreforkと呼ばれる理由もあります。 NginxとPHP-FPMは静的であり、大きなプラスです。



画像

残念ながら、メモリグラフはあまり美しくありませんが、注意深く見ると、Apacheはより多くのメモリを消費しています。



画像

画像

プロセスとフォークの切り替えのグラフは、互いに非常に興味深い相関があります。



画像

CPU使用率のレイアウトも明らかにApacheを支持していません。



ログを突破します



Nginx:


 #grep -c nginx.logに失敗しました 
 38
 #grep Failed nginx.log |  grep -v '失敗したリクエスト:0'
失敗したリクエスト:10629




復号化-1時間の操作で、Nginx + PHP-FPMバンドルは38回の反復を実行し、そのうち1回-10629回の誤った要求を埋めることができました。 これは、アップストリームにアクセスできないためでした-メインページへのリクエストのほとんどを実行することで包囲が試みられました。



Apache:


 #grep -c失敗したapache.log 
 23
 #grep Failed apache.log |  grep -v '失敗したリクエスト:0'
失敗したリクエスト:8730
失敗したリクエスト:2124
失敗したリクエスト:10539
失敗したリクエスト:7599
失敗したリクエスト:6027
失敗したリクエスト:1986
失敗したリクエスト:7578
失敗したリクエスト:270
失敗したリクエスト:9819
失敗したリクエスト:60
失敗したリクエスト:9369
失敗したリクエスト:8193
失敗したリクエスト:10248
失敗したリクエスト:684
失敗したリクエスト:7968




しかし、Apacheの場合、すべてが悪いです。たとえ「成功」した2回の包囲攻撃を取り消しても、エラーがあり、割り当てられた時間内に完了したリクエストが少なくなります。



したがって、テスト結果によると、Nginx + PHP-FPMバンドルは、38:23のスコアでApacheを破ります



All Articles