Edited at

apacheとnginxの比較表とベンチマーク

More than 3 years have passed since last update.


概要


  • websocketを使ったAPサーバをmodproxyでバランシングしたいっ!

  • そうなるとapache2.4.5以降か、nginxか。

  • 調べてみました。

  • 今回はapache2.4.12。CentOSでのお話。

apache2.4.12
nginx

バージョン管理

nginx-buildで楽々。依存関係も解決

情報
2.4系は少ない
多い

動的ファイルの読み込み速度
普通
普通

静的ファイルの読み込み速度
遅い。
event_mpm(非同期型IO処理)を採用したので、チューニングすると爆速になるかも。
apache2はrailsのimgファイル読み込む際遅くなるんだよ的なの知ってる方募集

速い

設定の反映時の再起動
必要
不要

構成
centos7はyum。
centos6はソースからインストール。
yum

アーキテクチャ
マルチプロセス + マルチスレッド
(ただし、event_mpmを使うとイベント駆動
イベント駆動

アーキテクチャによるメリット
シンプルで分かり易い
同時接続数が増えてもプロセス、スレッドが増えないため、
オーバーヘッドも増えない。 ➡高性能

アーキテクチャによるデメリット
プロセス、スレッドのオーバーヘッドが大きい。
大きな同時接続数に対応しようとすれば、
それだけ負荷が増える
特になし

開発元
コミュニティ
営利企業(Nginx Inc.)

開発者
コミュニティ
nginx社員 + 一般

有償 / 無償
無償
無償だが、商用サポート購入者のみの機能がある

開発スピード(個人的感想)
遅い
過去の遺産の修正が大変みたいです。

速い

X-Forward-for
(プロキシした際、送信元IPをログに吐く)
投入したバージョンに適したmod_rpafを適用する
基本機能で付いている。

DoS対策
mod_dosdetector
nginx-maxconn-module

個人的にapache2.4系から期待している機能
mod_spdyでSPDY対応(nginxは対応ずみ)


nginxでのX-Forward-for設定方法

proxy_set_header Host $http_host;

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for


abテスト


  • 下記の3つで戦わせます


    • apache2.4.12(with prefork)

    • apache2.4.12(with event_mpm)

    • nginx(1.7)



  • どちらもインストールしたばかりのチューニングなし状態

  • apacheって2.4.5からMaxClient➡MaxRequestWorkerって項目になってるんですね。。

  • リクエスト数は10000固定。

  • コマンドは、例えば同時接続数100の場合、



同時接続数
apache2.4.12(with prefork)
apache2.4.12(with event_mpm)
nginx(1.7.10)

100
118.548 seconds
117.127 seconds
118.538 seconds

300
126.351 seconds
51.424 seconds
40.685 seconds

500
エラー

Completed 10000 requests
Completed 20000 requests
apr_socket_recv: Connection timed out (110)
140.633 seconds
42.298 seconds

100で画像系にアクセスしてみました
836.973 seconds

(ちょー時間かかりそうだったので、2000req行ったところで断念しました。)
33.891 seconds
8.823 seconds


個人的総評


  • CentOs6しか使ってない人はソースからインストールしたくないと思うので、
    websocketを使ったmodproxyならnginx一択かなと。

  • まずはnginxを試して、CentOS7からはapacheを考えても良いと思います。

  • nginx採用理由は機能も十分ですし、枯れていたapacheをイベント駆動型に開発していた間に、nginxのほうが新しい機能を追加するスピードが速くなってます。

    営利企業であるのも大きいかもしれませんね。

    ただやはりapacheは大きなリクエストに対しては速いという噂。


  • nginxだと数が多いリクエストが来た場合、apacheより機能が低下するという経験がある方募集。