ビギナーのガイド
開始、停止、設定のリロード 設定ファイルの構造 静的コンテンツの提供 単純なプロキシサーバの設定 FastCGIプロキシの設定 |
このガイドではnginxの簡単な紹介とそれによるいくつかの簡単なタスクを説明します。nginxは既に読者のマシーンにインストールされているとします。そうでなければ、nginxのインストール ページを見てください。このガイドはnginxの開始、停止、設定の再読込みを説明し、nginxが静的コンテンツを提供するように設定する方法、nginxをプロキシサーバとして設定する方法、FastCGIアプリケーションを使って接続する方法について説明します。
nginxには一つのマスタープロセスと幾つかのworkerプロセスがあります。マスタープロセスの主な目的は設定の読み込みと評価、そしてworkerプロセスを保守することです。workerプロセスが実際のリクエストの処理を行います。nginxは効果的にworkerプロセスにリクエストを分配するためにイベントベースのモデルとOSに依存した仕組みを採用しています。workerプロセスの数は設定ファイル内で定義され、指定された設定に固定されるか、または自動的に利用可能なCPUのコアの数に調整されます(worker_processesを参照してください)
nginxとそのモジュールの動き方は設定ファイルで決定されます。デフォルトでは、設定ファイルはnginx.conf
という名前で、/usr/local/nginx/conf
, /etc/nginx
, または /usr/local/etc/nginx
のディレクトリの中にあります。
開始、停止、設定のリロード
nginxを開始するには実行ファイルを実行します。nginxが開始されると、実行ファイルに-s
パラメータを付けて実行することで制御することができます。次の構文を使います:
nginx -s signal
signal は次のうちのどれかです:
-
stop
— fast シャットダウン -
quit
— graceful シャットダウン -
reload
— 設定ファイルの再読込み -
reopen
— ログファイルを開きなおす
例えば、workerプロセスの現在のリクエストの提供が終了するのを待ってnginxプロセスを停止するには、次のコマンドが実行されるでしょう:
nginx -s quit
このコマンドはnginxを開始したのと同じユーザで実行されるべきです。
設定の再読込みのコマンドがnginxに送られるか再起動されるまで、設定ファイルへの変更は適応されません。設定を再読込みするには、次を実行します:
nginx -s reload
マスタープロセスが設定の再読込みシグナルを受け取ると、新しい設定ファイルの構文の妥当性をチェックし、その設定を適用しようとします。成功した場合は、マスタープロセスは新しいworkerプロセスを開始し、古いworkerプロセスにメッセージを送り、シャットダウンするようにリクエストします。さもなければ、マスタープロセスは変更を巻き返し、古い設定で動作し続けます。古いworkerプロセスはシャットダウンのコマンドを受け取り、新しい接続の受け入れを止め、現在の全てのリクエストの提供が終わるまで提供を続けます。その後、古いworkerプロセスは終了します。
シグナルはまたkill
ユーティリティのようなUnixツールの助けをかりてnginxプロセスへ送られるかも知れません。この場合、シグナルは指定されたプロセスIDを使ってプロセスに直接送られます。nginxマスタープロセスのプロセスIDは、デフォルトでは /usr/local/nginx/logs
または /var/run
ディレクトリのnginx.pid
に書かれます。例えば、マスタープロセスIDが1628の場合、nginxのgraceful シャットダウンを起こすQUITシグナルを送るには、次のものを実行します:
kill -s QUIT 1628
全ての実行中のnginxプロセスのリストを取得するには、例えば次のようにps
ユーティリティが使われるでしょう:
ps -ax | grep nginx
nginxにシグナルを送るための情報はControlling nginxを見てください。
設定ファイルの構造
nginxは設定ファイルで指定されたディレクティブによって制御されるモジュールから出来ています。ディレクティブはシンプルディレクティブとブロックディレクティブに分けられます。シンプルディレクティブは名前とパラメータが空白で分けられセミコロン(;
)で終わるものから出来ています。ブロックディレクティブはシンプルディレクティブと同じ構造をしていますが、セミコロンの代わりに大括弧({
と}
)で囲まれた追加の指示のセットで終わります。ブロックディレクティブが大括弧内に他のディレクティブを持つことが出来る場合は、コンテキストと呼ばれます(例: events, http, server および location)。
設定ファイル中のどのコンテキストの外部にあるディレクトティブはmain コンテキストにあると見なされます。events
と http
ディレクティブは、main
コンテキスト、http
の中のserver
、server
の中のlocation
の中にあります。
#
記号の後にある行はコメントと見なされます。
静的コンテンツの提供
webサーバの重要なタスクは(画像または静的なHTMLページのような)ファイルを提供することです。ffYou will implement an example where, depending on the request, files will be served from different local directories: /data/www
(which may contain HTML files) and /data/images
(containing images). こうするには、二つのlocationブロックを使ってhttpブロックの中にserverブロックを設定する必要があるでしょう。
まず、/data/www
ディレクトリを作成し、なんらかの内容が入ったindex.html
を置き、なんらかのイメージが置かれた/data/images
ディレクトリを作成します。
次に、設定ファイルを開きます。デフォルトの設定ファイルは既に幾つかのserver
ブロックの例が含まれていて、多くはコメントアウトされています。ここでそのような全てのブロックをコメントアウトし、新しいserver
ブロックを始めます:
http { server { } }
一般的に、設定ファイルにはlistenしているポート番号とサーバ名によって識別されるサーバ
ブロックが幾つかあるでしょう。nginxがどのserver
がリクエストを処理するかを決定すると、nginxはリクエストヘッダで指定されたURIをserver
ブロックの中で定義されたlocation
ディレクティブに対してテストします。
次のlocation
ブロックをサーバ
ブロックに追加します:
location / { root /data/www; }
この location
ブロックは、リクエストのURIと比較される"/
"プリフィックスを指定します。リクエストのマッチングのために、URIはローカルファイルシステムのリクエストされたファイルへのパスを形成するために、rootディレクティブで指定されたパス、/data/www
、に追加されるでしょう。もし幾つかの一致するlocation
ブロックがある場合は、nginxは一番長いprefixのものを選択します。上のlocation
ブロックはもっとも長さが短いプリフィックスを提供し、他の全てのlocation
ブロックが一致しなかった場合に、このブロックが使われるでしょう。
次に二つ目のlocation
ブロックを追加します:
location /images/ { root /data; }
それは/images/
で始まるリクエストに適合するものです (location /
もそのようなリクエストに適合しますが、prefixが短いです)。
結果的にserver
ブロックの設定は次のようになります:
server { location / { root /data/www; } location /images/ { root /data; } }
これは標準ポート80でlistenし、http://localhost/
でローカルマシーンにアクセス可能な、すでに動作しているサーバ設定です。URLが/images/
で始まるリクエストに応答するために、サーバは/data/images
ディレクトリからファイルを送信するでしょう。例えば、http://localhost/images/example.png
リクエストに応答するために、nginxは/data/images/example.png
ファイルを送信するでしょう。もしそのようなファイルが存在しなければ、nginxは404エラーを示す応答を返すでしょう。URIが/images/
で始まらないリクエストは/data/www
ディレクトリに割り振られます。例えば、http://localhost/some/example.html
リクエストに応答するために、nginxは/data/www/some/example.html
ファイルを返すでしょう。
新しい設定を適用するには、nginxがまだ開始されていない場合は開始するか、次のようにnginxのマスタープロセスにreload
シグナルを送信します:
nginx -s reload
何かが期待しているように動作しない場合は、/usr/local/nginx/logs
または/var/log/nginx
ディレクトリにあるaccess.log
とerror.log
ファイルの中から理由を見つけようとするかも知れません。
単純なプロキシサーバの設定
nginxの良くある使い方の一つはproxyサーバとして設定する事です。サーバがリクエストを受け取り、プロキシされているサーバにリクエストを渡し、サーバから応答を回収し、クライアントに応答を送信します。
画像のリクエストをローカルディレクトリのファイルから提供し、その他の全てのリクエストをプロキシされているサーバに送るような基本的なプロキシサーバを設定しましょう。この例では、どちらのサーバも一つのnginxインスタンス上で定義されるでしょう。
まず、nginxの設定ファイルに次の内容のserver
ブロックを追加しプロキシされるサーバを定義します:
server { listen 8080; root /data/up1; location / { } }
これはポート8080でlistenする単純なサーバ(これまでは、標準のポート80が使われたためlisten
は指定されませんでした)で、全てのリクエストをローカルファイルシステムの/data/up1
ディレクトリにマップします。このディレクトリを作成し、index.html
ファイルを中に置きます。root
ディレクティブがserver
コンテキストの中に置かれていることに注意してください。リクエストの提供のためのlocation
ブロックが独自のroot
ディレクティブを含んでいない時に、そのようなroot
ディレクティブが使われます。
次に、前のセクションのサーバ設定を使って、それをプロキシサーバの設定に使うために修正します。最初のlocation
ブロックにproxy_pass ディレクティブをプロキシされるサーバのプロトコルと名前とポート番号をパラメータとして指定して置きます。(この場合、http://localhost:8080
):
server { location / { proxy_pass http://localhost:8080; } location /images/ { root /data; } }
二つ目のlocation
ブロックを修正して、現在は/images/
プリフィックスをもつリクエストを/data/images
ディレクトリの下のファイルにマップしているものから、特有のファイル拡張子を持つ画像のリクエストにマッチするようにします。変更されたlocation
ブロックは次のようになります:
location ~ \.(gif|jpg|png)$ { root /data/images; }
パラメータは.gif
, .jpg
, または .png
で終わるURL全てに合う正規表現です。正規表現の前には~
がある必要があります。対応するリクエストは /data/images
ディレクトリに割り当てられるでしょう。
nginxがリクエストに応えるlocation
ブロックを選択する時は、まずプレフィックスを指定するlocationディレクティブをチェックし、もっとも長いプリフィックスのlocation
を記憶し、それから正規表現をチェックします。正規表現にマッチするものがあれば、nginxはこの location
を取り出します。そうでなければ、以前に記憶したものを取り出します。
プロキシサーバ設定の結果は以下のようになるでしょう:
server { location / { proxy_pass http://localhost:8080/; } location ~ \.(gif|jpg|png)$ { root /data/images; } }
このサーバは.gif
, .jpg
, or .png
で終わるリクエストをフィルターし、 /data/images
ディレクトリ(root
ディレクティブのパラメータにURLを追加することで)に割り当て、それら以外の全てのリクエストを上で設定されたプロキシサーバへ渡します。
新しい設定を適用するには、前のセクションで説明したようにreload
シグナルをnginxに送ります。
プロキシ接続をもっと設定するために使えそうなさらに多くのディレクティブがあります。
FastCGI プロキシの設定
nginxはリクエストをさまざまなフレームワークやPHPのようなプログラム言語で構築されたアプリケーションが実行されているFastCGIサーバに導くために使うことができます。
もっとも基本的なFastCGIサーバと動作するようなnginxの設定には、proxy_pass
ディレクティブではなくfastcgi_pass ディレクティブを使い、fastcgi_param ディレクティブを使ってFastCGIサーバにパラメータを渡します。FastCGI サーバはlocalhost:9000
でアクセス可能とします。前のセクションのプロキシ設定をベースとして、fastcgi_pass
ディレクティブ付きでproxy_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; } }
これにより、静的なイメージを除く全てのリクエストがlocalhost:9000
上でFastCGIプロトコルを使ってプロキシされたサーバへ導かれます。