「nginx実践ガイド」の感想・備忘録2

スポンサーリンク
「nginx実践ガイド」の感想・備忘録1の続き

設定ファイル

ディレクティブとコンテキスト

  • 設定ファイルには、ディレクティブと呼ばれる設定項目を記述する。
  • ディレクティブにはセミコロンで終わるものと{}で囲ったブロックでコンテキストを作成するものがある。
  • どのブロックにも含まれない最も外側のコンテキストをmainコンテキストと呼ぶ。
  • ディレクティブには記述できるコンテキストが決まっている。
    例えば、httpディレクティブはmianコンテキスト、serverディレクティブはhttpコンテキストの中にしか書けない。

#から行末まではコメントとなる。
ディレクティブには改行を含めることができ、コメントとは異なり、行末ではなくセミコロンやブロックの終了までがディレクティブとなる。

includeディレクティブ

引数に絶対パス、または/etc/nginxからの相対パス、でファイル名を指定する。
globパターンを使うこともできる。
include conf.d/*.conf;

「conf.dディレクトリにserverディレクティブを記述した設定ファイルを配置し、httpコンテキストでincludeする」というやり方はよく使われる。

mainコンテキスト

nginx.confのmainコンテキストには、nginx全体に関するディレクティブが記述されている。
デフォルトでは以下の設定になっている。

user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid

・userディレクティブ

worlerプロセスが動作するユーザー名。通常は変更しない。
アクセスするファイルやディレクトリのパーミッションをこのユーザーからアクセスできるようにする必要がある。

・workerディレクティブ

workerのプロセス数。
workerはシングルスレッドで動作するため、CPUはプロセスにつき1個しか使われない。
性能を出したい場合は設定値をCPUコア数にする必要があるが、worker_prosesses auto;と記述することができる。

eventsコンテキスト

nginx.confのeventsコンテキストには、1つのworkerプロセスが同時に受け付けられる接続数がworker_connectionsディレクティブで設定されている。

events {
    worker_connections 1024;
}

worker_connectionsには接続された数だけでなく、接続する数も含まれる。
例えば、リバースプロキシとして動作する場合は、バックエンドのサーバとも通信するため、1回のアクセスで2つの接続を使う。

httpコンテキスト

nginx.confのhttpコンテキストには、Webサーバ全体の設定が記述されている。
httpコンテキストに記述できるディレクティブの多くは、httpコンテキストの中でバーチャルホストを記述するserverコンテキストや、serverコンテキストの中でURLごとの動作を記述するlocation contextにも記述することができる。
よって、httpコンテキストには、全てのバーチャルホストに共通の設定を記述する。

http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}
  • default_type
    mime.typesをincludeしているが、定義されていない場合はdefault_typeで指定したContent-Typeが使われる。
  • log_format
    Apacheに似たフォーマットをmainという名前で定義している。
  • access_log
    main形式を指定している。出力形式を指定しない場合は、combinedという形式になる。
  • sendfile
    ファイル送信方式を示すディレクティブで性能向上のために指定されている。
  • keepalive_timeout
  • Keep-Aliveのタイムアウトを指定している。

静的サイトの設定例

以下の内容で/etc/nginx/conf.d/hoge.confを生成する。
※ nginx.confのhttpコンテキストでincludeされる

server {
    listen 80;
    server_name www.hoge.com
    access_log /var/log/nginx/hoge-access.log
    error_log /var/log/nginx/hoge-error.log
    location / {
        root /www/dir;
        index index.html index.php
    }
}

rootディレクティブ

location /files/ {
alias /data/;

の場合、/files/a.htmlが示すファイルは/data/a.htmlとなる。
rootディレクティブはhttp, server, location, ifコンテキストに書けるため、特定の条件に一致する場合のドキュメントルートの設定になる。

locationディレクティブ

引数に指定されたパスに対応するコンテキストを作る。
書式がいくつかあり優先順位のルールが複雑なため、最もつまづきやすいディレクティブである。

  • location パス名 {...}
    パス名は前方一致となる。
    location / {...}とすると全てのパスが一致する。
  • location = パス名 {...}
    完全一致。
  • location ~ パターン {...}
    正規表現でのパス名指定。

locationディレクティブはネストさせることができるが、その場合もパス名は先頭から比較される。

location /path/ {
  location /path//subpath/ {...}
  location /subpath/ {...}

の場合、 /path//subpath/はマッチすることはあるが、 /subpath/はマッチすることはない。

IP制限

allow, denyディレクティブを利用する。
優先順位は記述順で、最初に一致したディレクティブに従う。

location /private {
    deny 192.168.1.1:
    allow 192.168.1.0/24:
    deny all;
}

の場合、192.168.1.1は拒否、192.168.1.2〜255は許可、それ以外は拒否。

Basic認証

location /private {
    auth_basic "enter password";
    auth_basic_user_file /etc/nginx/htpasswd;
}

パスワードファイルはApacheと同じものを使うことができ、htpasswdコマンドで作成する。
sudo yum install httpd-toolsでインストール可能。

コメント