これは何
以下記事のアンサーブログです。
以下のことはコメントに書いたんですが、書ききれなかった部分もあったり整理したほうがいいなと思い記事に起こしています。
- 現代のアプリケーションではC10K問題よりも先にDBやアプリケーションのボトルネックが先に来るため、C10K問題に遭遇するよりも先にやることがある
- ミドルウェアとしての成り立ちから設定ファイルの書き方に至るまで、それぞれのソフトウェアで思想が根本的に異なるので、単なるパフォーマンス比較をしてもあまり意味がない
NginxとApacheの違いをC10K問題を中心に語るのは時代が違う
この記事に限らず、多くの「Nginx vs Apache」系記事では「ApacheはC10K問題を抱えている」という論理をベースにそれぞれの違いを表現しています。
が、これは2022年においては(実際にはもっと前からですが)既に事実ではないはずです。
2012年の時点でevent_mpmを使った検証をしてくれた人がいて、以下のようにApacheでもNginxと同等かそれ以上のパフォーマンスを出せるということが示されています。10年前ですよ10年前。
自分はApacheにもNginxにも傾倒していない人間ですが、しいて言うならConfigの書き方と個人的な使い方の組み合わせによってNginxを選択することが多かったです1。ただし、それは自分自身がサーバーを触り始めた時期が遅かったからで、そのころにはもう単一のインスタンスでカリッカリにチューニングしたミドルウェアを使う必要が必ずしもない2ですし、ステートレスかつイミュータブルなインスタンスを管理することが最近はほとんどで、ぶっちゃけどうでもいいやってのが正直な感想です。
もちろん、このようなチューニングの知識を知っておくことは重要ですし、自分の手を動かして実験することに対する意義もあると思います。が、今になってC10Kを引き合いに出して結論付けるというのは結構無理があるのかな、というのが個人的な感想でした。
水平にスケールさせるか、垂直にスケールさせるかの問題
Apache httpdが生まれてからNginxが生まれるまで、インターネットはCGIや単なる静的なHTMLコンテンツが大半を占めており、レンサバなどのコンテンツを提供する側としても.htaccess
とLinuxのパーミッションを用いた分離でWebサーバーを共用で貸し出していても大きな問題がない時代が続いていました3。
この場合DBにも依存しないで単にコンテンツを読み取ればよいモデルではありますが、当時は仮想化技術が未発達だったこともあり1ホストでマルチテナントに管理するのが一般的でした。そのため垂直にスケールさせるのが基本形だったとも言えます。
仮想化の波が来るにしたがって、ホストを水平に並べるケースも増えましたが、こうなってくるとリクエストを捌くための仕組みとしてはリバースプロキシやハードウェアとしてのロードバランサー性能がまず支配的になって、後ろに構えるアプリケーションは必要なら横にどんどん並べていけばよくなります。そうした時代やシステムとしての設計の変化も相まって、ApacheやTomcatなどのCGI時代の知見は少しずつ影を潜め、動的で変化に強い構成が人気になっていったと自分は理解しています。
実際、もうここ10年くらいはApacheを頑張ってチューニングする時代というよりはS3やGCSなどのオブジェクトストレージにCDNをかませてキャッシュとクラウドの無限ストレージで殴るほうが安いし管理も楽なので、動的なコンテンツやAPIなどのアプリケーションとデータベースが必要な実装部分のボトルネックが、静的コンテンツ配信よりも先に来るのが今は一般的です。こうした背景からも、「単一のApacheで10Kを超えるクライアントからの接続を待ち受ける」という状況自体、一部のクソデカサービスを除けばもはや遭遇することすらない、というのが実情ではないでしょうか。
動的に強いNginxと静的に強いApache
結論、NginxとApacheの一番の違いは時代やアーキテクチャの変遷による使い方の違いなのであって、個々のパフォーマンス自体をそれらを同じものとして考えたうえで盲目的に比べるのは目的と手段を間違えているような印象を受けます。
単にミドルウェアを昔の知識で比較したうえでそのへんを論じている記事は非常に少ないように思えたので、今回今さら感あるこうした記事を書いてみたのでした。
これはApache全盛期を知らない時代のエンジニアの1意見なので、インターネット老人会の皆様におかれましてはご意見・ご感想をお待ちしております。
今日はこのへんで。