Skip to content

Nginx の設定概要

Posted on:2012年3月11日 at 13:30

Nginx に関して、とりあえず最初の一歩としてこれだけ知っておけば何とかなる、という内容をまとめておきたくメモを残すことにした。

Basic Nginx Configuration – Linode Library のページがとてもよくまとめられていたので、このページの内容をベースに書かせてもらった。

Table of Contents

Open Table of Contents

全体的な構成

Nginx の設定に関しては、まずは、ディレクティブブロックコンテキストという言葉をおさえておく。

Nginx はインストール直後ですぐに使える状態になっており、設定は $NGINX_ROOT/conf/nginx.conf に記載されている。($NGINX_ROOTは Nginx がインストールされているルートディレクトリに読み替えること。)

その設定ファイル内のざっくりとした構成は以下のような感じになっている。

#user  nobody;
worker_processes  1;
...
events {
  ...
}

http {
  ...
  server {
    ...
    location / {
      ...
    }
    ...
  }
  ...
}

worker_processeseventshttpserverocation というのがディレクティブであり、eventshttpserverlocation などは{ } (中括弧)で囲まれたブロックを引数に持っている。 このブロックを含めたディレクティブの引数に Nginx で記載可能なシンタックスを使用して条件文などを混じえてディレクティブを記載していく。

Nginx はネストされたブロックの構文を使用でき、上記のように http ディレクティブserver ディレクティブがネストされている構文をとれる。この時、server ディレクティブhttp ディレクティブコンテキストにあると言う。

ディレクティブは、コンテキストによって使えるもの、使えないものとがあるので、ドキュメント Modules で確認する。
ドキュメントの記載は以下のように、ディレクティブ名、シンタックス、デフォルト動作、コンテキストの記載があり、その後にそのディレクティブの詳細説明が続く構成となっている。

location

syntax: location [=|~|~*|^~|@] /uri/ { ... }

default: no

context: server

インストール時のオプション、パッケージマネージャー等で多少の違いはあるが、インストール直後の $NGINX_ROOT ディレクトリ配下は以下の構成となっている。(include ディレクティブでは起点が nginx.conf の存在するディレクトリになる。後述。)

$ ll
total 42
drwx------  2 nginx root 4096 2012-03-04 15:21 client_body_temp
drwxr-xr-x  4 root  root 4096 2012-03-10 14:46 conf
drwx------  2 nginx root 4096 2012-03-04 15:21 fastcgi_temp
drwxr-xr-x  2 root  root 4096 2012-03-04 15:14 html
drwxr-xr-x  2 nginx root 4096 2012-03-10 17:22 logs
drwx------  5 nginx root 4096 2012-03-05 22:30 proxy_temp
drwxr-xr-x  2 root  root 4096 2012-03-04 15:14 sbin
drwx------  2 nginx root 4096 2012-03-04 15:21 scgi_temp
drwx------  2 nginx root 4096 2012-03-04 15:21 uwsgi_temp

設定内でのパスの指定には、絶対パスと相対パスが使えるが、相対パスを使った場合の起点は、$NGINX_ROOT となる。

デフォルトの設定ファイルは、 $NGINX_ROOT/conf/nginx.conf.default として残されており、このファイルを読みながら、Nginx の設定の概要を掴むことにする。

グローバルな設定

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}

上記の記載で nginx.conf.default は始まっている。

さらに読み進める。

http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

http ディレクティブのブロック({ })が書かれている。

access_log ディレクティブの設定サンプルを見てみる。

access_log logs/example.access.log;
access_log /srv/http/example.org/logs/access.log;
access_log /var/log/nginx/access/example.org;
access_log off;

サーバの設定 - server ディレクティブ

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

上記の server ディレクティブは、http ディレクティブに内包されている(http ディレクティブのコンテキストにある)。

server ディレクティブのブロックはそれぞれのサーバ自体の設定を行うところとなる。

listen ポートの設定 - listen ディレクティブ

まず listen ディレクティブだが、上記は 80 番ポートで待機していることを意味する。更に柔軟な記載が行えるようになっているので、詳細は、HttpCoreModule::listen を参照のこと。

バーチャルホストの設定 - server_name ディレクティブ

server_name ディレクティブは、名前ベースのバーチャルホストを実現する。
1 つの IP アドレスで待機しているサーバは、リクエストヘッダーの HOST 名に基づいて、複数のドメインのホスティングを行える。

# サンプル1
server_name   example.com;
# サンプル2
server_name   example.com www.example.com;
# サンプル3
server_name   *.example.com;
# サンプル4
server_name   .example.com;
# サンプル5
server_name   example.*;
# サンプル6
server_name   example.com exmaple.net example.org;
# サンプル7
server_name   localhost example1 example2;
# サンプル8
server_name   "";

上記サンプルは、Basic Nginx Configuration – Linode Library の例から使わせてもらっている。

個々の名前は、スペース区切りで記述できる。Nginx はサーバに対して1つ以上の名前を持たせることができ、特定の server_name ディレクティブは 1 つ以上の名前のリクエストに応答する。また、ワイルドカードの定義や、正規表現での定義も行える。

リソース(ロケーション)の設定 - location ディレクティブ

次に location ディレクティブ。location ディレクティブは、クライアントによってリクエストされたロケーションに対する振舞いを定義する。

location ディレクティブは、そのブロックの前に適用するパターンを記載する。シンタックスは以下の通りとなっており、まずはこの動作概要を掴んでおくことが必要。

location [=|~|~*|^~|@] pattern { ... }

Basic Nginx Configuration – Linode Library の例を利用させていただき、その動作を理解する。

# パターングループ1
location / { }
location /images/ { }
location /blog/ { }
location /planet/ { }
location /planet/blog/ { }

# パターングループ2
location ~ IndexPage\.php$ { }
location ~ ^/BlogPlanet(/|/index\.php)$ { }

# パターングループ3
location ~* \.(pl|cgi|perl|prl)$ { }
location ~* \.(md|mdwn|txt|mkdn)$ { }

# パターングループ4
location ^~ /images/IndexPage/ { }
location ^~ /blog/BlogPlanet/ { }

# パターングループ5
location = / { }

ここまでの記述だけでは、location ディレクティブの全体の適用順がイマイチ掴みきれない。location ディレクティブのパターン適用ルールは以下の通りとなる。

  1. 完全一致(=)が最初に処理される。マッチするものが見つかった場合、Nginx はそこでパターンの検索を中止し、リクエストを実行する。
  2. 次に残りのリテラル文字列ディレクティブが処理される。もし、^~ が使用されていれば、Nginx はそこでパターンの検索を中止し、リクエストを実行する。それ以外の場合は、Nginx は location ディレクティブを処理し続ける。
  3. 正規表現で定義された(~~*)全ての location ディレクティブが処理される。正規表現がマッチしたら、Nginx はそこでパターンの検索を中止し、リクエストを実行する。
  4. 正規表現がない、または、正規表現がマッチしなかったときは、最も適切なリテラル文字列のパターンが使用される。

一旦 Nginx が特定のリクエストに対してリソースを提供する ”location” を選択したら、このリクエストに対するレスポンスは、”location” ディレクティブのブロックによって定義される。

location / {
    root   html;
    index  index.html index.htm;
}

ドキュメントルートは、root ディレクティブによって、html ディレクトリに定義されている。上記は相対パスでの指定なので、実際のディレクトリは、$NGINX_ROOT/html となる。/blog/includes/style.css へのリクエストは、他の location ディレクティブがマッチしていないと想定した場合、$NGINX_ROOT/html/blog/includes/style.css にあるファイルがリソースの対象となる。root ディレクティブには絶対パスを指定することもできる。

index ディレクティブはリクエストがファイル名を含んでいない場合に、ファイルシステムのどのファイルが使用されるべきかを指定する。http://example.com/ へのリクエストは、$NGINX_ROOT/http/index.html のファイルがリソースの対象となる。複数のファイル名指定されている場合、Nginx は順にそのリストを処理し、存在するファイルにリクエストを適用する。上記の例の場合、index.html が存在しなければ、index.htm が使用される。仮にどちらも存在しない場合には、404 メッセーが送出される。

設定ファイルの管理

include ディレクティブを活用し、ベースとなる $NGINX_ROOT/conf/nginx.conf には必要最低限の記述のみを行い、各サーバ毎の固有の設定は別ファイルに切り出しておくとメンテナンス性があがる。

例えば、以下のような書き方。$NGINX_ROOT/conf/nginx.conf の内容は至ってシンプルになる。

user nginx;
worker_processes 4;
pid /var/run/nginx.pid;

events {
        worker_connections 768;
        # multi_accept on;
}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Gzip Settings
        ##

        gzip on;
        gzip_disable "msie6";

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

最後の include ディレクティブによって、個々のバーチャルホスト毎の設定は別ファイルに定義を行っている。

参考情報