私たちが今日当たり前のものとして利用しているインターネットは90年代に急速に普及しました。ウェブプロトコル全体の仕組みを要約すると、訪問者が特定のウェブアドレスに対してコンテンツを要求し、DNSとIPがそのリクエストを対応するコンピュータに転送するという流れになります。最終的に、該当するウェブページをホストするコンピュータがそのページを訪問者に「提供(つまり“サーブ”)」します。
ウェブページは基本的にHTML形式の文書です。訪問者にウェブページを見てもらうには、「提供(サーブ)」を担うコンピュータにサーバープログラムが必要になります。そこでNginx、Apacheのようなソフトウェアがリクエストを処理・分析し、訪問者のブラウザで閲覧できるように対応するドキュメントを返します。
NginxとApache
NginxとApacheはどちらも、ウェブページをエンドユーザーのブラウザに配信するのに使用される人気のウェブサーバーです。簡単にご紹介すると以下の通りです。
・Apacheは1995年に最初にリリースされ、その後2004年にNginxが登場
・どちらも、世界中の一流企業(フォーチュン500企業等)が愛用
・Nginxの市場シェアは何年も着実に成長を遂げている
・パフォーマンスの面でNginxに注目が集まっている
Apache
先にリリースされたApacheから見てみましょう。
インターネット誕生から数年という時期の、Tim Berners-Lee氏のCERN httpd、そしてNCSA HTTPdを追うようにして1995年にリリースされたApacheは、すぐに市場を席巻し世界で最も人気のあるウェブサーバーになりました。今日でもまだ大きな存在感を誇りますが、それは主に歴史の深さによるものです。ApacheはApacheライセンスの下、Apache Foundationにより開発および保守されています。
Apacheという名前の由来については2つの説があります。1つは「かの有名なアメリカ先住民族アパッチ族に由来する」というもの。2つ目は「(いくつものソフトウェアパッチ—つまり修正—を経てきたことから)“パッチのサーバー”を意味する」というものです。
Linux
Apacheの圧倒的市場占有率は、Red Hat、CentOS、Ubuntuなど、Linuxの全ての主要ディストリビューションにプリインストールされているという事実に一部起因しています。
LinuxにおけるApacheの役割の重要性を示すひとつの例として、そのサーバープロセス名がHTTPdであり、Apacheがウェブサーバーソフトウェアの同義語となっていることが挙げられます。
ウェブサーバー市場で最初に本格的な役割を果たしたことに加えて、Apacheによる世界席巻の背景には、その設定システムと.htaccessファイルがあります。
.htaccess
Apacheではその設定に.htaccessを使用します。Apacheがリクエストを処理する方法を柔軟に設定でき、.htaccessファイルの設定、編集、使用方法に関する解説は豊富に存在します。例としては、様々なリダイレクトルール、最大アップロードファイルサイズ、URL書き換え、メモリ制限、ディレクトリ保護(htpasswd)、 expiresヘッダー、Cache-Controlヘッダー、Accept-Encodingヘッダー、クッキー、クエリ文字列の操作などがあります。
一方、Kinstaでは、.htaccessファイルをサポートしないNginxを採用しています。しかし、.htaccessファイルの設定と規則はNginx独自の書き換えルールに簡単に「変換」することができます。
Apacheの主な「長所」の1つとして、サーバールート(メインのウェブサイトディレクトリ)では、ディレクトリツリー内のすべてのレベルまたはディレクトリに、独自の設定を持つ固有の.htaccessファイルを確保することができます。
共用サーバー(一般的に格安レンタルサーバーと呼ばれるものに多い)にとって、これは夢のような状況です。なぜなら、他の利用者に影響を与えることなく、同じマシン上で何百人ものユーザーに独自のウェブサイトの設定方法を提供できるからです。利用者は、グローバルサーバーの設定に触れることなく、制限つきの共用サーバー環境で多くの事柄を設定できます。
公式文書によると以下のようになっています(英語からの翻訳)。
通常、メインサーバーの設定ファイルにアクセスできない場合にのみ、.htaccessファイルを使用してください
ただし、この柔軟性はパフォーマンスを犠牲にすることになります。「実際に使用するかどうかにかかわらず、.htaccessファイルを許可するとパフォーマンスが低下」するとのことです。
.htaccessファイルを許可すると、Apacheはリクエストがある度に要求されたURLまたはファイルから、サーバーのルートディレクトリまでの階層をさかのぼりディレクトリツリー全体を検索し、.htaccessファイルを読み込みます。その後、ファイルを処理し、この方法で設定された各ディレクトリに対して自らの再設定を行う必要があります。
WordPressサイトは時に複雑になることがあります。典型的なWordPressサイトであっても、あらゆるディレクトリから何百ものリクエストを受け取るものです。
/wp-content/uploads/yyyy/mmタイプのディレクトリから、通常1ページの読み込みで複数のリクエストがあり、多くの場合、月ごとのディレクトリが作成されます。また/wp-content/themes/parent-theme静的リソース、/wp-content/themes/child-themeリソースがあります。これらはJavaScript、CSSファイル、画像を含みます。
加えて、何十ものプラグインサブディレクトリから読み込まれる静的ファイルを含む/wp-content/pluginsもあるでしょう。Apacheでは、これらの各リソースについて設定を探すためにツリー全体を検索しなければなりません。
ある調査によると、(共用サーバー上のウェブサイトでは特に一般的に言えることですが)WordPressの一般的な設定には42の.htaccessの実行と249の.htaccessファイルの検索が含まれるとのことです。
これはウェブサーバーレベルでの話です。訪問者は、PHPプロセスがWordPressコールスタック全体を実行、データベースクエリを作成し、それをMySQLに渡しウェブページを組み立てサイト訪問者に送信するのを待つ必要があります。
モジュール
Apacheの普及に一役買ったもう1つの要因は、その動的モジュールシステムです。
モジュール(ユーザーによるウェブサーバー機能拡張を可能にする機能の一つ)は、NginxとApacheの両方に存在します。Apacheでは、ウェブサーバーのインストールとデプロイが完了した後に、モジュールをインストールし、 必要に応じて有効化/無効化できます。Debianベースのディストリビューションには、設定ファイルを編集しなくてもモジュールを有効または無効にできるコマンド、a2enmodおよびa2dismodがあります。
Apache標準ディストリビューションの一部として付随するモジュールの一覧はこちらにある通りです。圧縮、暗号化、ログ、リダイレクトから、要求の編集、シンタックスでの応答のような高度なものまであります。
Nginx
Nginx(nginxまたはNGINXとも表記される)は、ロシアの開発者によって2004年にリリースされました。Nginxのプロジェクトマネジャー、Owen Garrett氏は次のように述べています。
Nginxは、Apacheウェブサーバーのパフォーマンスの制限に対処すべく生み出されました
このサーバーは、2002年にウェブサイトrambler.ruのスケーリングツールとして作成されました。バージョンは2つあります。オープンソース(BSDタイプライセンス)とNginx Plus(サポートおよびエンタープライズ機能付き)です。
リリース後、Nginxは主に静的ファイルを提供するために、そしてApacheインストール前のロードバランサーまたはリバースプロキシとして使用されました。ウェブが進化し、速度とハードウェア使用効率の最後の一滴まで絞り出す必要性が増すにつれ、より成熟したソフトウェアの登場も背景に、多くのウェブサイトがApacheからNginxへの乗り換えを始めました。
2019年3月、Nginx IncはF5 Networksに6億7,000万ドルで買収されました。その時期、Techcrunchが報告するところによると、Nginxサーバーは「3億7,500万のウェブサイトを支え、約1,500の有料顧客」を保有していたとのこと。
w3techsのデータからわかるように、Nginxの市場シェアは着実に成長しています。
このデータは世界全体のウェブサーバー全体に関するものですが、上位100万のウェブサイトのサンプルを取ると、Nginxはしばらく前からその地位を独占していることがわかります。
Google トレンドもこの事実を反映しています。
Netcraftの調査によると、Apacheは2019年4月にNginxに追い越されています。
Nginxのコンフィギュレーション
Nginxは遥かに効率的で速いにもかかわらずApacheのような設定システムを持っていないため、リテールホスティングプロバイダ(格安共用サーバーなど)では広く採用されていません。共有されるタイプの環境ではApacheのような活躍はできていないことになります。
一方、ディレクトリレベルでの設定を許可しないことで、NginxはApacheよりも大きな優位性を持ちます。Nginxウィキにはパフォーマンスへの影響を比較した記事があります。
Nginxのモジュール
NginxのモジュールシステムもまたNginxの優位性を高める要因の一つとなっています。Nginxモジュールは通常ビルド時に有効にする必要があります。これには技術的な知識や経験が必要であり、インストール後の追加はやや複雑になります。
2016年のバージョン1.9.11では、状況が変わり、有料顧客向けに公式の検証済み動的モジュールがサポートされました。2019年5月現在、QUICとHTTP/3サポートの開発開始が発表されています。
キャッシュ─NginxとApacheの比較
キャッシュとは、簡単に言うと、ユーザーが訪問する前にウェブサイトのコンテンツをあらかじめ準備しておき、訪問があった時に探すことなくすぐに提供できるようにしておく仕組みです。
Apache同様、Nginxの典型的なキャッシュ機能は、サーバーとエンドユーザーの間にキャッシュサーバーとして置くことによりサーバー全体の負荷を軽減するために使われていました。そうすることで毎回オリジンサーバーからコンテンツを取得することなく静的コンテンツをキャッシュできます。
(Kinsta LXCコンテナの場合のように)Nginxをスタンドアローンサーバーとして利用する場合、別途キャッシュサーバーを置く必要はありません。Nginxはそれ単体で静的コンテンツを非常に効率的に提供できます。
また、動的に生成されるページのキャッシュにもNginxは対応しています。WordPressサイトにおいては、すべてのURLに対して生成されたWordPressサイトのページをメモリまたはディスクに保存することを意味します。
そんな時に便利なFastCGIキャッシュを標準のNginxパッケージで利用することができます。どちらかと言えばあまり一般的に使われていないNginxの機能の一つですがシンプルで非常に便利です。
これをApacheと比較してみましょう。Apacheにはmod_cacheモジュールがありますが、バグが発生する傾向にあり、他のモジュールとの干渉が懸念されることもあります。そのため、Apacheで展開されている標準のキャッシュソリューションはVarnish HTTPアクセラレータとなっています。Varnishは専門性の高いソリューションですが、複数のテストの結果、NginxがVarnishよりも優れたキャッシュ性能を記録しました。
Kinstaでは、動的WordPressキャッシュをNginxで構成しています。キャッシュ対象ページとKinsta CDNによりキャッシュされた静的アセットを細かく制御できるよう独自のキャッシュプラグインもご用意しています。
リクエストの処理─NginxとApacheの比較
ApacheとNginxの最大の違いは、リクエスト処理の基盤となるアーキテクチャにあります。
Apacheはマルチプロセッシングモジュール(MPM)を使用してリクエストを処理します。MPMが担うのは「マシン上のネットワークポートへのバインド、リクエストの受け入れ、およびその処理のための子プロセスの割り当て」です。
Apacheが登場した当初から使用されている最も古いMPMはpreforkモジュールです。Apacheのパフォーマンスに関する悪評の原因はこのモジュールによるものと言っても過言ではないでしょう。このモードでは、Apacheはリクエストごとに1つのスレッドで新しいプロセスを起動します。
このモジュールがmod_phpと共に使用されます。つまり、CSSファイルや画像を提供する場合であっても、すべてのプロセスにPHPインタプリタが組み込まれるということです。
これは非効率的です。PreforkモジュールはデフォルトモジュールとしてApacheに付属します。これによりHTTP/1への接続も制限されます。
後年、Apacheはマルチスレッドモデルのワーカーmpmを、その後イベントmpmを開発しました。どちらもApacheのパフォーマンス面での問題の多くを軽減しています。php-fpmへ切り替えることで、今でもApacheは競争力を保っており、同時に.htaccessを使用せずに済むことにもつながりますが、その本来の目的にはそぐわないかもしれません。
Nginxは非同期のノンブロッキング、イベント駆動型アーキテクチャを採用しています。
この違いをご説明します。Linux/Unixsでは、プロセスがプログラムを実行します。
スレッドはプロセスのサブセットであり、一つのプロセス実行に複数のスレッドが介在する可能性があります。ブラウザウィンドウ内に複数のタブを開くようなものです。このようにして、プログラムは複数のCPU、さらにマルチコア、マルチスレッドCPUを活用して高速に動作できます。Linus Torvalds氏がこの違いを詳しく解説しています。
つまり、Apacheではすべての接続に対してプロセスが使用されます(ワーカーmpmではスレッドを使用)。トラフィックが増加すると、すぐに費用がかさみます。
新しいプロセスやスレッドの生成はコンピュータやプログラムの起動に例えることができます。最速のコンピュータであっても、それなりの時間がかかります。今日のウェブサイトでは、1ページの読み込みで数百ものリクエストが行われ、これはすぐに膨大な数になります。
イベントmpmは最適化に関してもう少し進歩を遂げていますが、複数のテストからはNginxの優位性が明らかになっています。特に静的ファイルでは、NginxはApacheのおよそ2倍のリクエストを処理することができます。
Nginxでは、理想的にはCPU/コアごとに一つのプロセスが使用されます。Nginxのプロセスの違いとして、プロセスあたり何十万ものネットワーク接続を処理可能です。接続ごとに新たにスレッドやプロセスを生成する必要はありません。
このような理由から、Cloudflare、MaxCDN、そしてKeyCDNなどの大手CDN、さらにNetflixなどのサイトにおいて、Nginxがコンテンツ配信の要として採用されています。
Nginxを利用する企業は枚挙にいとまがありません。WordPress.comでおなじみのAutomattic社もその一例です。
Automatticは2008年にWordPress.comのすべてのロードバランサーをNginxに切り替え(詳細はこちら)、サーバースタックを完全にNginxに移行しています。
サイトのサーバー情報を確認する
HTTPレスポンスヘッダーからウェブサイトでの使用状況を確認できます。サイト上で右クリックから「検証」を選択し、デベロッパーツールでネットワークパネルを選択してから、ウェブサイトを再読み込みすると、ウェブサイトに読み込まれているすべてのリソースが表示されます。特定のリソースとその「ヘッダー」タブを選択するとサーバー情報が表示されます。「Server」の行を見てみると、ウェブサイトでCDNを使用している場合にはCloudflareなどが、HTTPアクセラレータを使用している場合にはVarnishなどが表示されます。
cPanel、Apache、PHPで共用サーバーを使用したWordPressサイトの例が以下の通りです。
そして、以下がNginxを使用するウェブサイトです。
左側に展開すると、すべてのリソースの時間を分析し、それがページ全体の読み込み時間に与えている影響も確認できます。
まとめ
今回の記事では、NginxとApacheの違いに迫り、それぞれの特徴やNginxがウェブサーバー業界で多くの注目を集める理由をご紹介しました。リソースを大量に消費する分野では特にパフォーマンスの違いが顕著になるでしょう。
もちろん、プロジェクト次第で求められる要素は変わるもので、ApacheやLighttpd、IIS、LiteSpeed、Caddyなどの他のツールがすぐれた選択肢となることはあります。
Kinstaでは、WordPressサイトに強いパフォーマンス最適化をいくつも施し、その基盤にはNginxを採用しています。すべてのWordPressサイトが、実行に必要なソフトウェアリソース(Nginx、Linux、PHP、MySQL)を配した独立コンテナに格納されることで、他サイトからリソースが分離されます。
コメントを残す