初心者向けガイド
設定の開始、停止、再読み込み 設定ファイルの構造 静的コンテンツの配信 シンプルなプロキシサーバーの設定 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でリッスンし、ローカルマシンのhttp://localhost/
でアクセスできるサーバーの動作設定です。/images/
で始まるURIを持つリクエストに対して、サーバーは/data/images
ディレクトリからファイルを送信します。たとえば、http://localhost/images/example.png
リクエストに対して、nginxは/data/images/example.png
ファイルを送信します。そのようなファイルが存在しない場合、nginxは404エラーを示すレスポンスを送信します。/images/
で始まらないURIを持つリクエストは、/data/www
ディレクトリにマップされます。たとえば、http://localhost/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`ブロックに、パラメータで指定されたプロキシサーバーのプロトコル、名前、ポート(この場合は`http://localhost:8080`)を指定したproxy_passディレクティブを配置します。
server { location / { proxy_pass http://localhost: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 http://localhost: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
で動作するプロキシサーバーにルーティングするサーバーを設定します。