初心者向けガイド
| 設定の開始、停止、再読み込み 設定ファイルの構造 静的コンテンツの配信 シンプルなプロキシサーバーの設定 FastCGIプロキシの設定 |
このガイドでは、nginxの基本的な概要と、nginxで実行できるいくつかの簡単なタスクについて説明します。nginxが既にインストールされていることを前提としています。インストールされていない場合は、nginxのインストールページを参照してください。このガイドでは、nginxの起動と停止、設定の再読み込み方法、設定ファイルの構造、静的コンテンツを提供するためのnginxの設定方法、プロキシサーバーとしてのnginxの設定方法、FastCGIアプリケーションとの接続方法について説明します。
nginxは、1つのマスタープロセスと複数のワーカープロセスで構成されています。マスタープロセスの主な目的は、設定の読み込みと評価、およびワーカープロセスの管理です。ワーカープロセスは、リクエストの実際の処理を行います。nginxは、イベントベースモデルとOS依存のメカニズムを使用して、ワーカープロセス間でリクエストを効率的に分散します。ワーカープロセスの数は設定ファイルで定義され、特定の設定に対して固定することも、使用可能なCPUコアの数に合わせて自動的に調整することもできます(worker_processesを参照)。
nginxとそのモジュールの動作方法は、設定ファイルで決定されます。デフォルトでは、設定ファイルはnginx.confという名前で、/usr/local/nginx/conf、/etc/nginx、または/usr/local/etc/nginxディレクトリに配置されています。
設定の開始、停止、再読み込み
nginxを起動するには、実行可能ファイルを実行します。nginxが起動したら、実行可能ファイルを-sパラメータで呼び出すことで制御できます。以下の構文を使用します。
nginx -s signal
ここで、signalは次のいずれかになります。
-
stop— 即時シャットダウン -
quit— 正常なシャットダウン -
reload— 設定ファイルの再読み込み -
reopen— ログファイルの再オープン
たとえば、ワーカープロセスが現在のリクエストの処理を完了するのを待ってnginxプロセスを停止するには、次のコマンドを実行します。
nginx -s quit
このコマンドは、nginxを起動したのと同じユーザーで実行する必要があります。
設定ファイルに加えられた変更は、設定を再読み込みするコマンドがnginxに送信されるか、nginxが再起動されるまで適用されません。設定を再読み込みするには、次のコマンドを実行します。
nginx -s reload
マスタープロセスは、設定の再読み込みシグナルを受信すると、新しい設定ファイルの構文の有効性をチェックし、その設定を適用しようとします。成功した場合、マスタープロセスは新しいワーカープロセスを起動し、古いワーカープロセスにシャットダウンを要求するメッセージを送信します。失敗した場合、マスタープロセスは変更をロールバックし、古い設定で動作を続けます。シャットダウンコマンドを受信した古いワーカープロセスは、新しい接続の受け入れを停止し、すべてのリクエストが処理されるまで現在のリクエストの処理を続けます。その後、古いワーカープロセスは終了します。
killユーティリティなどのUnixツールを使用して、nginxプロセスにシグナルを送信することもできます。この場合、シグナルは指定されたプロセスIDを持つプロセスに直接送信されます。nginxマスタープロセスのプロセスIDは、デフォルトでnginx.pidに書き込まれ、/usr/local/nginx/logsまたは/var/runディレクトリにあります。たとえば、マスタープロセスのIDが1628の場合、QUITシグナルを送信してnginxを正常にシャットダウンするには、次のコマンドを実行します。
kill -s QUIT 1628
実行中のすべてのnginxプロセスのリストを取得するには、たとえば、次のようにpsユーティリティを使用できます。
ps -ax | grep nginx
nginxへのシグナルの送信に関する詳細については、nginxの制御を参照してください。
設定ファイルの構造
nginxは、設定ファイルで指定されたディレクティブによって制御されるモジュールで構成されています。ディレクティブは、単純ディレクティブとブロックディレクティブに分けられます。単純ディレクティブは、名前とパラメータをスペースで区切り、セミコロン(;)で終わります。ブロックディレクティブは単純ディレクティブと同じ構造ですが、セミコロンの代わりに、中括弧({と})で囲まれた追加の命令セットで終わります。ブロックディレクティブが中括弧内に他のディレクティブを持つことができる場合、それはコンテキストと呼ばれます(例:events、http、server、location)。
設定ファイル内でコンテキストの外側に配置されたディレクティブは、mainコンテキストにあると見なされます。eventsディレクティブとhttpディレクティブはmainコンテキストに、serverディレクティブはhttpコンテキストに、locationディレクティブはserverコンテキストにあります。
#記号の後の行の残りの部分はコメントと見なされます。
静的コンテンツの配信
重要なWebサーバータスクは、ファイル(画像や静的HTMLページなど)を提供することです。リクエストに応じて、ファイルが異なるローカルディレクトリ:/data/www(HTMLファイルを含む場合がある)と/data/images(画像を含む)から提供される例を実装します。これには、設定ファイルの編集と、2つのlocationブロックを持つhttpブロック内にserverブロックを設定する必要があります。
まず、/data/wwwディレクトリを作成し、任意のテキストコンテンツを含むindex.htmlファイルを配置します。また、/data/imagesディレクトリを作成し、いくつかの画像を配置します。
次に、設定ファイルを開きます。デフォルトの設定ファイルには、既にserverブロックの例がいくつか含まれており、ほとんどがコメントアウトされています。ここでは、そのようなブロックをすべてコメントアウトし、新しいserverブロックを開始します。
http {
server {
}
}
一般に、設定ファイルには、リッスンするポートとサーバー名によって区別される複数のserverブロックを含めることができます。nginxは、どのserverがリクエストを処理するかを決定すると、リクエストヘッダーで指定されたURIを、serverブロック内で定義されたlocationディレクティブのパラメータと照合してテストします。
次のlocationブロックをserverブロックに追加します。
location / {
root /data/www;
}
このlocationブロックは、リクエストからのURIと比較して「/」プレフィックスを指定します。一致するリクエストの場合、URIはrootディレクティブで指定されたパス、つまり/data/wwwに追加され、ローカルファイルシステム上のリクエストされたファイルへのパスが形成されます。一致するlocationブロックが複数ある場合、nginxは最も長いプレフィックスを持つブロックを選択します。上記のlocationブロックは、長さ1の最も短いプレフィックスを提供するため、他のすべてのlocationブロックが一致に失敗した場合にのみ、このブロックが使用されます。
次に、2番目のlocationブロックを追加します。
location /images/ {
root /data;
}
これは、/images/で始まるリクエストと一致します(location /もそのようなリクエストと一致しますが、プレフィックスが短くなります)。
結果のserverブロックの設定は次のようになります。
server {
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
これは、標準ポート80でリッスンし、ローカルマシンのhttps:///でアクセスできるサーバーの動作設定です。/images/で始まるURIを持つリクエストに対して、サーバーは/data/imagesディレクトリからファイルを送信します。たとえば、https:///images/example.pngリクエストに対して、nginxは/data/images/example.pngファイルを送信します。そのようなファイルが存在しない場合、nginxは404エラーを示すレスポンスを送信します。/images/で始まらないURIを持つリクエストは、/data/wwwディレクトリにマップされます。たとえば、https:///some/example.htmlリクエストに対して、nginxは/data/www/some/example.htmlファイルを送信します。
新しい設定を適用するには、nginxがまだ起動されていない場合はnginxを起動するか、次のコマンドを実行してnginxのマスタープロセスにreloadシグナルを送信します。
nginx -s reload
期待どおりに動作しない場合は、/usr/local/nginx/logsまたは/var/log/nginxディレクトリにあるaccess.logファイルとerror.logファイルで理由を調べてみてください。
シンプルなプロキシサーバーの設定
nginxの一般的な用途の1つは、プロキシサーバーとして設定することです。プロキシサーバーとは、リクエストを受信し、プロキシされたサーバーに渡し、そこからレスポンスを取得してクライアントに送信するサーバーです。
ローカルディレクトリからのファイルで画像のリクエストを処理し、他のすべてのリクエストをプロキシサーバーに送信する基本的なプロキシサーバーを設定します。この例では、両方のサーバーが単一のnginxインスタンスで定義されます。
まず、次の内容の別の`server`ブロックをnginxの設定ファイルに追加して、プロキシされたサーバーを定義します。
server {
listen 8080;
root /data/up1;
location / {
}
}
これは、ポート8080でリッスンし(以前は標準ポート80が使用されていたため、`listen`ディレクティブは指定されていませんでした)、すべてのリクエストをローカルファイルシステム上の`/data/up1`ディレクトリにマップする単純なサーバーです。このディレクトリを作成し、`index.html`ファイルを配置します。 `root`ディレクティブは`server`コンテキストに配置されていることに注意してください。このような`root`ディレクティブは、リクエストの処理に選択された`location`ブロックに独自の`root`ディレクティブが含まれていない場合に使用されます。
次に、前のセクションのサーバー設定を使用して、プロキシサーバー設定になるように変更します。最初の`location`ブロックに、パラメータで指定されたプロキシサーバーのプロトコル、名前、ポート(この場合は`https://:8080`)を指定したproxy_passディレクティブを配置します。
server {
location / {
proxy_pass https://:8080;
}
location /images/ {
root /data;
}
}
現在`/images/`プレフィックスを持つリクエストを`/data/images`ディレクトリ下のファイルにマップしている2番目の`location`ブロックを変更して、一般的なファイル拡張子を持つ画像のリクエストと一致するようにします。変更された`location`ブロックは次のようになります。
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
パラメータは、`.gif`、`.jpg`、または`.png`で終わるすべてのURIと一致する正規表現です。正規表現の前に`~`を付ける必要があります。対応するリクエストは`/data/images`ディレクトリにマップされます。
nginxがリクエストを処理するためのlocationブロックを選択する際、まずプレフィックスを指定したlocationディレクティブをチェックし、最長のプレフィックスを持つlocationを記憶します。その後、正規表現をチェックします。正規表現に一致するものがあれば、nginxはそのlocationを選択し、そうでなければ、先に記憶したlocationを選択します。
プロキシサーバーの設定結果は以下のようになります。
server {
location / {
proxy_pass https://:8080/;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
このサーバーは、.gif、.jpg、または.pngで終わるリクエストをフィルタリングし、それらを/data/imagesディレクトリにマップします(URIをrootディレクティブのパラメータに追加することにより)。そして、他のすべてのリクエストは、上記で設定されたプロキシサーバーに渡されます。
新しい設定を適用するには、前のセクションで説明したように、nginxにreloadシグナルを送信します。
プロキシ接続をさらに設定するために使用できるその他多数のディレクティブがあります。
FastCGIプロキシの設定
nginxは、PHPなどのさまざまなフレームワークやプログラミング言語で構築されたアプリケーションを実行するFastCGIサーバーにリクエストをルーティングするために使用できます。
FastCGIサーバーと連携するための最も基本的なnginx設定には、proxy_passディレクティブの代わりにfastcgi_passディレクティブを使用すること、およびFastCGIサーバーに渡されるパラメータを設定するためのfastcgi_paramディレクティブを使用することが含まれます。FastCGIサーバーがlocalhost:9000でアクセス可能であると仮定します。前のセクションのプロキシ設定をベースとして、proxy_passディレクティブをfastcgi_passディレクティブに置き換え、パラメータをlocalhost:9000に変更します。PHPでは、SCRIPT_FILENAMEパラメータはスクリプト名を決めるために使用され、QUERY_STRINGパラメータはリクエストパラメータを渡すために使用されます。結果の設定は以下のようになります。
server {
location / {
fastcgi_pass localhost:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
これは、静的画像のリクエストを除くすべてのリクエストを、FastCGIプロトコルを介してlocalhost:9000で動作するプロキシサーバーにルーティングするサーバーを設定します。