nginx-vs-apache

Nginx vs Apache,それぞれの特徴と実際運用においての選び方

HTTPミドルウェア

ブラウザーでリンクをクリック、もしくはURLを入力したら,ブラウザーがHTTP(s)でサーバーにリクエストを送信して,サーバーがリクエストを処理して返信の情報をブラウザーに送ります。ブラウザーがサーバーから返されたHTTPデータを解析してようやくウェブページが表示されます。

この一連の流れの中で、サーバーの中では概ね2つの部分でリクエストを処理しています。それはHTTPの送受信を担当しているHTTPサーバーと実際にリクエストを処理するアプリ
ウェブサイトの内容によってアプリの挙動が大きく変わってきますが、HTTPの送受信をしているHTTPサーバーの部分はほとんど共通です。そのため、HTTPサーバーにとしての専用ミドルウェアが存在しています。

今広く使われているのHTTPミドルウェアと言えばApacheとNginxです。

Apache

apache logo

正式名称は「Apache HTTP Server」,オーブンソースのHTTPサーバーミドルウェアです。1995年に誕生してから人気が絶えず,2018年までは業界のシェアNo.1でした。
ApacheはWordpressなどのPHPベースのCMSに相性が良くて、簡単な設定でサイトを立ち上げることが可能ですので、多くのVPSでも「標準装備」としてApacheをユーザーに提供しています。

Apacheの動作方式

サーバーは複数のクライアントと接続することがほとんどで。複数のリクエストを同時に処理するため、Apacheはマルチプロセスのアプローチを取りました。
具体的に言うと、クライアントからの接続が来ると、Apacheが新しいプロセスを立ち上げて(fork)、そのクライアントのリクエストを処理します。セッションが終了までこの専用のプロセスが存在し続けるので、同時アクセス数だけのプロセス数がメモリ上に存在しています。
メリットとして:

  • 異なるクライアントがそれぞれのプロセスで接続しているため、重い処理をしているクライアントがあっても他のクライアントに影響しにくい。

ただ、欠点も明らかです:

  • 同時アクセス数が増えると、大量のプロセスを作り上げて、メモリ枯渇を招きます。
  • 大量のプロセスが同時に動作できますが、OSの負担が重く、CPUの処理能力を無駄にしてしまいます。

Apacheの誕生当初では同時接続がそんなに問題になりませんでしたが、インタネットの普及について、C10Kという問題が浮上しました。
マルチプロセスのアプローチだと、サーバーの性能をどう上げても、1万(10K)クライアント(Client)を同時に処理するのが限界です。それはOSがそれほど多くのプロセスを効率よくスケジューリングできないからです。

Nginx

nginx logo
C10K問題を解決するために誕生したのはNginx、読み方はEngine-X。
Apacheと同じくオープンソースのミドルウェアですが、大量のアクセスを捌くため、全く異なるアプローチで実装しています。

Nginxの動作方式

NginxはWindowsみたいに、イベント駆動の方式を採用しています。リクエストはまず非同期キューに積まれ、ワーカースレッドがキューからリクエストをポーリングして処理します。ワーカースレッド数はCPUコア数に合わせて設定できます。

  • メモリの大量消費やスケジューリング効率が悪くなるなどの問題を解決し、且つマルチコアCPUの処理能力も十分に活かすことができるため、処理能力はApacheの10倍から100倍であるといわれています。

ただし、Nginxのポーリング方式にも弱点があります

  • PHPベースのCMSなどが1つのセッションに対して重い処理をする場合、他のクライアントからのリクエストがキューの中で待機することになってしまいますので、ユーザーの視点から見るとラグが気になることがあります。

この問題はコア数が少なく、コア当たりの処理能力も低い格安VPSで特に発生しやすいと言われています。

まとめ

Apache Nginx
処理能力 限られています Apacheの10-100倍
時間のかかる処理にブロックされる しない 性能の低いサーバーではあり得る
設定の手間 比較的に簡単 ちょっと複雑
コミュニティ リソースが豊富 比較的に資料が少ない

Apacheを選ぶケース:

  • 個人ブログなど、アクセス数がそれほど多く無いウェブサイト。
  • 細かい設定がよく分かりません、とりあえず速やかにサイトを立ちあげたい。
  • 何かの資料またはツールはApache前提で作成されていて、それを利用したい。

Nginxを選ぶケース

  • 大量なアクセスが想定される場合。
  • とりあえず高性能のが良い、弄ってみたい。
  • 情報が少なくても自分で研究して何とかできる。

Nginxが大型サイトで活躍しています

インタネットの発達につれ、近年Nginxのシェアがどんどん高まっていて、2019年の時点でApacheと同じぐらにのシェアになって来ました。その中でも下の図のように、大きいウェブサイトになればなるほど、Nginxのシェアが高くなっていく傾向があります。
これもNginxの優れた処理効率の証になるでしょう。
nginx-apache-IIS-share
*出典 https://kinsta.com/blog/nginx-vs-apache/

ロードバランシング

実はNginxはHTTPサーバーとして使われるだけではなく、リバースプロキシ機能を利用して、ロードバランサーとしても広く使われています。

Nginxのコンフィグファイルで複数のupstreamサーバーを定義して、HTTPリクエストが来たら一定のルール(ポーリング、IPハッシュ、ランダム、負荷状態など)でリクエストをupstreamサーバーに転送することがリバースプロキシと言い、アクセスを均等にupstreamサーバーに分散できます。

2019年、ハードウェアベースのロードバランサーメーカーF5 networksがNginxを買収して、企業向けにNginx+というNginxベースの有料ロードバランスソリューションを提供し始めた。Nginxがこれから実質的にロードバランシング業界のスタンダードになると期待されています。

実はこのブログも現在1台のサーバーしかないですが、Nginxのリバースプロキシを利用してWordPressの環境を複数のVMに分離し、将来の拡張性や変更対応の柔軟性を図っています。
具体的なデザインと手順はこれからの記事で紹介したいと思います。