近年急速にシェアを伸ばしています。C10K問題を開発されたことが影響していると言われます。
C10K問題とは?
1台のサーバが1万ものクライアントを同時の処理をしようとすると処理が追いつかない問題。nginxは、イベント駆動、I/O Multiplexing、ノンブロッキングI/O、非同期I/Oというテクニックを組み合わせてこの問題を解消しています。
特徴
Apacheに比べて大量アクセス処理が得意
Apacheの場合は、1つのリクエストに対してスレッドを割り当てるので大量のリクエストを捌くのが苦手。
高速で軽量
メモリを節約でき、結果として大量リクエストにも耐えることができます。
静的コンテンツの配信が得意
静的コンテンツの配信が得意です。HTMLや画像などをキャッシュしておくことができます。それに対してApacheは動的コンテンツの処理が得意です。
リバースプロキシ
StarmanやUnicornなどのアプリケーションサーバの前に配置してリバースプロキシとして動作させる構成も非常によく使われています。リクエストを受け取ることで、バックエンドサーバの負荷を低減することが可能です。
ロードバランシング
各サーバへの負荷を分散できる。
イベント駆動モデル
何かしらのイベントが発生するまで待機して発生したイベントに応じて定められた手順を実行します。定められた手順のことを「コールバック関数」と呼びます。非常に少ないプロセス数で大量の同時処理を捌けるので、性能が劣化しにくいです。
イベントの種類
システムコール
- epoll
- inotify
- sigaction
イベント駆動処理をサポートするライブラリ
- libevent
- libuv
イベントの例
クライアントからの接続要求
マスタプロセスとワーカープロセス
マスタプロセス
主な仕事は、ワーカープロセスの制御と管理です。シグナルを送られて処理します。(例えば、設定ファイルの再読み込みのシグナルを受けて再起動するなど。)
各ワーカープロセス
クライアントからの接続要求に始まる一連の処理をイベント駆動で実行します。通常シングルスレッドで動作しますが、I/O Multiplexing、ノンブロッキングI/Oなどを利用することで複数クライアントからの要求を同時並行で処理することが可能になります。
また、ワーカープロセス自体も複数起動が可能なので容易にスケールできます。
ビルドイン変数
nginxの設定ファイルでは、「$」をつけると変数になります。
ユーザーで直接定義もできますが、「ビルドイン変数」も用意されています。
$remote_addr
クライアント(リクエスト元)のIPアドレスを指します。
$uri
パラメータなしのリクエストURIです。
$proxy_add_x_forwarded_for
リクエストに応じて定義される変数
$http_フィールド名(例えばhostなど)
リクエストヘッダの値です。
この記事へのコメントはありません。