概要
- 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の場合、
- $ ab -n 10000 -c 100 http://hogehoge/
同時接続数 | 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より機能が低下するという経験がある方募集。