Nginx(エンジンエックス)について

勉強のために深堀をしてみたので、そのメモを残す。

Nginxの概要とアーキテクチャ

・軽量で高いスケーラビリティを誇るHTTPサーバ
・以下の機能を備えている
 - HTTPサーバ
 - アクセス制御
 - URI Rewrite
 - gzip圧縮
 - リバースプロキシ
 - L7・L4(TCP)ロードバランス
 - コンテンツキャッシュ
 - SSLターミネーション、HTTP/2ゲートウェイ
 - メールプロキシ

用途(ユースケース)
・テキストや画像といった静的コンテンツ配信
・StarmanやUnicornのようなwebアプリケーションサーバ前にNginxを配置して、リバースプロキシとして動作させる

アーキテクチャ
・イベント駆動とは、通常のプログラムは上から書かれた順に実行されるが、イベント駆動で動作するプログラムは何かしらのイベントが発生するまで待機し、発生したイベントの種類に応じて定められた手順を実行する
・HTTPサーバで発生する(プログラムに通知される)イベント
 - クライアントからの接続要求
 - クライアントとの通信用ディスクリプタが読み込む可能になる
 - クライアントとの通信用ディスクリプタが書き込む可能になる
・複数クライアントのディスクリプタ(プログラムが利用するファイルやソケットのための識別子)との入出力を発生したイベントごとに並行して行う

・nginxは、マスタプロセスとワーカプロセスのマルチプロセス構成で稼働する
・マスタプロセスは1つ、ワーカプロセスは設定することで複数起動可能
・各ワーカプロセスはクライアントからの接続要求に始まる一連の処理をイベント駆動で実行
・ワーカプロセスは通常シングルスレッドで動作。I/O MultiplexingやノンブロッキングI/Oを利用することで、複数クライアントとの入出力を並行して行うことが可能
・マスタプロセスの主な仕事は、ワーカプロセスの制御と管理

リバースプロキシ

・リバースプロキシとは、ユーザのリクエストを受け取りそれを上位サーバ(アップストリームサーバ)に転送する機能
・リバースプロキシには主に2つの役割がある
 ①ユーザのリクエストを最初に受けるフロントとして負荷を分散する役割
  ・フロントサーバしてのリバースプロキシには次の役割がある
   ロードバランス、コンテンツキャッシュ、HTTPS通信の終端化
 ②Webアプリケーションサーバにおけるリバースプロキシとしての役割
  ・一般的にWebアプリケーションと同じサーバ上で動作させる
  ・主な役割は次のような機能がある
   静的ファイルの配信、リクエストの書き換え、
   アクセス制限・不正なリクエストのフィルタリング、
   gzip圧縮転送、リクエストのロギング、
   リクエストとレスポンスのバッファリング

HTTPS通信

必要なモジュールと最低限の設定
・nginxでHTTPSを利用するにはngx_http_ssl_moduleが必要。モジュールはデフォルトで有効にならない
・サーバ証明書と秘密鍵を指示するだけでHTTPSを有効にできる

TLSの有効化
・nginxで443ポートを使用するにはlisenディレクティブの値にsslパラメータを追加する必要がある

HTTP/2
・HTTP/2はHTTPの新しいバージョン。Google によって開発されたSPDYベースである
・HTTP/2はnginx1.9.5以上でのみ使用可能
・HTTP/2を有効にするにはngx_http_v2_moduleが必要
 - デフォルトで組み込まれないので、ビルド時に指定する必要がある
 - lisenディレクティブにhttp2パラメータを追加する
・HTTP/2はTLSを用いない平文での通信もサポートしている
 - 現在のブラウザ実装はTLS上でのHTTP/2のみをサポートしているため、http2パラメータはsslパラメータと必ずセットで指定する必要がある
・HTTP/2ではHTTP/1.xとの判別にTLS-NPNまたはTLS-ALPNと呼ばれる機能を使用する。どちらもOpenSSLが必要

この記事が気に入ったらサポートをしてみませんか?