大規模システムにおけるApache HTTP Serverとnginxの使い分け

2018/7/19に発表されたNetcraftの情報によると、2018年7月のWebサーバシェアは、Apache HTTP Serverが36%、nginxが25%という結果になっており、nginxが徐々にシェアを伸ばしていることがわかります。 https://news.netcraft.com/archives/2018/07/19/july-2018-web-server-survey.html Netcraft

nginx

nginxがシェアを伸ばしている背景には、C10K問題と呼ばれるものがありました。Apache HTTP Serverの場合、大量の同時アクセスへの対応が難しく、サーバがパンクしてしまいます。そこで注目されたのがnginxでした。詳細なアーキテクチャについては割愛しますが、Apache HTTP Serverよりも同時アクセスに対応していると言われています。

どちらを利用すればいいのか

それでは同時アクセスに対応しているnginxを使えばいいのでしょうか。実はnginxが同時アクセスに向いているのは静的なコンテンツのみであり、スクリプト言語により動的なコンテンツを返す必要がある場合は、Apache HTTP Serverの方が優れています。これではどちらを使えばいいのか迷ってしまいます。 エンジニアによりその答え分かれるところかと思いますが、私はシステムの成長とともに両方を上手く使い分ければいいと思います。次の例は、私が主に携わることが多いスタートアップのプロジェクトであり、そのチームの状況も加味されています。そのため、最初からエンジニアが揃っているプロジェクトでは、下記の通りではないことに注意して下さい。

サービス立ち上げ期

スタートアップなどでこれからプロジェクトを始めようとしているとき、エンジニアの数も少なく、インフラエンジニアが存在していないこともあるでしょう。そんな時期にスケールアウトするサーバを構築するよりも、システムを構築することのほうが優先度が高いはずです。そんなときは大人しくApache HTTP Serverを利用しシステム開発だけに注力します。

サービス公開期

サービスが完成し一般に公開する段階に入りました。クライアントとサーバの間にロードバランサだけ用意しておけば、サーバのレスポンス速度に応じてサーバ台数を増やせばいいでしょう。このときはまだApache HTTP Serverのままです。

サービス爆発期

あなたのサービスが評価され多くのユーザがサイトを訪れるようになりました。このままスケールアウトによりサーバ台数を増やしてもいいですが、サーバ台数が増えすぎコスト面が気になり始めました。ついにnginxの出番がやってきました。ではどこでnginxを使うのでしょうか。その答えは、Webシステムを噛み砕き理解することで解決します。

Webシステム

Webシステムは大きく
  • Webサーバ
  • アプリケーションサーバ
  • データベースサーバ
の3層に分けることができます。 一般的なMVCフレームワークを利用しているとしましょう。実務ではやや異なりますが、単純に考えると
  • ビュー(V) … Webサーバ
  • コントローラ(C) … アプリケーションサーバ
  • モデル(M) … データベースサーバ
と分けることができます。 ビュー(V)は静的なコンテンツを返します。動的な処理が必要な場合は、コントローラ(C)がモデル(M)からデータを取得しビュー(V)にデータを渡します。つまり、アプリケーションサーバはApache HTTP Serverのままとし、Webサーバにnginxを採用します。 またWebサーバとアプリケーションサーバの間にもロードバランサを用意しましょう。これでWebサーバのパフォーマンスが上がり、全体的にサーバ台数が減ることが期待できます。下図でいうところの、Web TierがWebサーバに相当し、Internal Tierがアプリケーションサーバに相当します。 https://cloudplatform.googleblog.com/2016/12/building-scalable-private-services-with-Internal-Load-Balancing.html ロードバランサ

まとめ

Apache HTTP Serverとnginxを比較し、どちらが優れていると評価している記事を見かけることが多いですが、エンジニアはそれぞれの特徴を理解し、それがプロジェクトやその成長にどのように活かせるかを検討する必要があるかと思います。
» エンジニア登録はこちら