nakochi’s log

freeeのエンジニア。たまにモデル。

Nginxって何?。

この記事をシェアする

まずそもそもこれはどうやったら「エンジンエックス」と読めるんだ意味がわからないと思っているところからのスタートです。

Nginxサマリ

1日に数億リクエストを処理するような大規模サイトを中心に、近年急速にシェアを拡大しているWebサーバーが「Nginx(エンジンエックス)」です。HTMLドキュメントや画像ファイルといった静的コンテンツを高速で配信し、消費メモリが少なく、リバースProxyやロードバランサーといった機能も有した注目の軽量Webサーバーです。

リバースプロキシとは

リバースプロキシ(Reverse proxy)または逆プロキシは、特定のサーバへの要求を必ず経由するように設置されたプロキシサーバのこと。

一般的なプロキシとは異なり不特定多数のサーバを対象としない。リバースプロキシは、不特定多数のクライアントから寄せられる要求に対して、応答を肩代わりすることにより特定のサーバの負担を軽減したり、アクセスを制限することにより特定のサーバのセキュリティを高めたりする目的に用いられる。

使用理由に関しては下記の7つがあげられる。

  • セキュリティ: リバースプロキシサーバを前置することで防御が一段階増える。リバースプロキシに認証・認可の機能を持たせる場合もある。複数台のサーバがある場合にリバースプロキシで認証・認可を行うとシングルサインオンを実現できる。シングルサインオンができることでユーザーのUXの向上が見込まれる。

  • 暗号化/SSL高速化: SSL による暗号化でセキュアなWebサイトを作るとき、暗号化をWebサーバ自体が行うのではなく、SSL高速化のためのハードウェアを備えたリバースプロキシサーバで行う。この用途で用いる場合、SSLオフローダとも呼ばれる。

  • 負荷分散: リバースプロキシは負荷を複数のサーバに分散させることができる。Webサーバ群にリバースプロキシを組み合わせる場合、リバースプロキシが各WebページにあるURLを書き換えることもある(外部に公開されているURLを内部の位置に変換する)。

  • 変化しないコンテンツのキャッシュ:リバースプロキシはWebサーバ内の画像などの変化しないコンテンツのキャッシュとして作用し、Webサーバの負荷を低減する。Webサイトアクセスの大部分は参照のみであるため、これによってWebサーバの負荷は大幅に低減される。

  • 圧縮: リバースプロキシはコンテンツを圧縮して最適化し、ロード時間を短縮できる。

  • 速度の調整: Webサーバ上のプログラムがコンテンツを生成している場合、直接クライアントと通信を行うと、クライアント側がダウンロードするのを待たないとプログラムを終了できない。リバースプロキシはWebサーバが生成したコンテンツをまとめてキャッシュし、プログラムはその時点で終了可能となり、クライアントはクライアント側の速度でダウンロードが可能となる。

  • 仮想的なサーバ統合: 複数のサーバがそれぞれ独自のサービスを提供している場合にリバースプロキシを導入して、利用者には1台のサーバとして見せることができる。

高速処理

ginxが大量のリクエストでも同時に高速処理できるのは、イベント駆動方式を採用しているためです。

 Webサーバーのように同時に複数の処理を行うには、ディスクやネットワークといったI/Oの多重化が必要になります。I/O多重化の実装には「select」や「poll」といったシステムコールが従来使われています。

 Apache HTTPでプロセスベースやスレッドベースのMPM(マルチプロセッシングモジュール)を選択すると、こうしたシステムコールが使用されます。select/pollでは、プログラムがアクセスするファイルネットワークソケットなどをOSが識別するための「ファイルディスクリプター」を1つ1つチェックします。チェックするディクリプタが増えれば処理にかかる時間も比例して長くなり、同時リクエスト数が2倍になれば処理に掛かる時間も2倍に膨らみます。

 Niginxのイベント型では、I/O多重化を実装するのに「epoll」システムコールを使用します。epollではディスクリプターの状態がカーネル内で管理されるため、プログラムが1つ1つチェックする必要がなくなります。この場合、処理にかかる時間はリクエストによらず一定になります。そのためNginxは、万単位のリクエストも高速に効率良く処理することができます。

 また、メモリの使用量が少ないのも特徴です。Apache HTTPのプロセスベースやスレッドベースのMPMでは、リクエストを処理するのにプロセスやスレッドを起動するため、使用するメモリもリクエスト数に応じて増加します。一方Nginxは単一プロセスで全てのリクエストを処理するため、リクエスト数に応じてメモリ使用量が変化することはありません。

 Nginxの省リソースの恩恵は、数万単位のリクエストを処理するような大規模サイトだけではなく、組み込みPCやマイクロサーバーのように限られたリソースしか使用できない状況にも有効です。

注)処理数nに比例して計算量が増える場合「0(n)」と表記します。

注)処理数によらず計算量が一定の場合「0(1)」と表記します。

Nginxの主な機能

基本的なHTTP機能

  • スタティックなインデックスファイルの提供、自動インデクシング、オープンなファイルディスクリプターキャッシュ

  • キャッシングで高速化されたリバースプロキシ、シンプルなロードバランシングとフォールトトレランス

  • リモートのFastCGIサーバーのキャッシングによる高速化サポート、シンプルなロードバランシングとフォールトトレランス

  • モジュールアーキテクチャ

  • SSLTLS SNIサポート

その他のHTTP機能

  • ホスト名ベースとIPベースの仮想サーバー

  • KeepAliveとパイプライン接続のサポート

  • 柔軟な設定

  • クライアント処理を中断させることなく再構成、オンラインアップグレード

  • アクセスログフォーマット、バッファーされたログ書き込み、素早いログローテーション

  • 3xx-5xxエラーコードのリダイレクト

  • rewriteモジュール

  • クライアントのIPアドレスをベースにしたアクセスコントロールとHTTPベーシック認証

  • PUT、DELETE、MKCOL(コレクションの作成)、COPY(コレクションを含むリソースおよびプロパティの複製)、MOVE(コレクションを含むリソースの移動)メソッド

  • FLVストリーミング(動画ストリーミング再生)

  • 速度制限

  • 同一アドレスからの同時接続もしくは同時リクエストの制限

  • 組み込みPerl