nginxの設定 その1

メモ:

nginxを稼働していくにあたり、nginxの設定について確認していきます。ここでは、インストール時に作成される設定ファイルの設定内容について一つずつ確認していきたいと思います。

設定ファイルについて

yumなどのパッケージシステムを使ってnginxをインストールすると、nginxの設定ファイルを配置するディレクトリは次のディレクトリとなります。このディレクトリ配下に設定ファイルを配置します。

/etc/nginx
  |- /conf.d/
  |- /default.d/
  |- nginx.conf
  ・・・

nginxの設定は、/etc/nginxディレクトリのnginx.conf設定ファイルに設定していくこともできますし、他のファイルから設定を読み込むincludeディレクティブを次のような内容でnginx.confに記述して、conf.dというサブディレクトリ内の拡張子がconfであるファイルを読み込み設定を行うことも出来ます。

include /etc/nginx/default.d/*.conf;

インストール時に作られる設定ファイルを確認すると、conf.dにはモジュール関係の設定を配置しdefault.dにはバーチャルホストの設定をするようコメントが書かれています。

nginxの設定ファイル用ディレクトリには、インストール時に次のファイルも作成されています。

fastcgi.conf
  FastCGI用の変数を定義するファイル。fastcgi_paramディレクティブの設定など。
fastcgi_params
  FastCGI用の変数を定義するファイル。fastcgi_paramディレクティブの設定など。(fastcgi.confと同じ?)
koi-utf
  ロシア語のキリル文字koi8-rとUTF-8の文字コードのマッピングを行うファイル。
koi-win
  ロシア語のキリル文字koi8-rとwindows-1251の文字コードのマッピングを行うファイル。
mime.types
  MIMEタイプと拡張子の関連付けを設定するファイル。
scgi_params
  SCGI用の変数を定義するファイル。scgi_paramディレクティブによる設定など。
uwsgi_params
  uWSGI用の変数を定義するファイル。uwsgi_paramディレクティブによる設定など。
win-utf
  ロシア語のキリル文字windows-1251とUTF-8の文字コードのマッピングを行うファイル。

これらは、必要に応じてincludeディレクティブで読み込みます。

設定ファイルの書き方

設定ファイルは、ディレクティブとそのパラメータで構成されています。単一行のディレクティブはセミコロンで終わり、その他のディレクティブは関連するディレクティブをグループ化して中括弧({})で囲んだブロックとして記述します。

ディレクティブの中でもコンテキストと呼ばれるいくつかのトップレベルディレクティブは、次のようなものが用意されておりグループとして記述します。このコンテキストは、nginxにおけるモジュールの分類と関連がありモジュールの分類は、次のコンテキストにcoreを追加した5つに分類されます。

コンテキスト 内容
event イベント処理に関する設定(coreに含まれる)
http httpに関する設定
mail mailに関する設定
stream TCPの処理に関する設定(TCPロードバランシング等)

これらのコンテキストの外側には、coreモジュールに関する設定があり、プロセスの制御や設定ファイル、ログに関する設定を記述します。

coreモジュールに関連する設定

events {
    eventモジュールに関連する設定
}

http {
    httpモジュールに関連する設定
}

mail {
    mailモジュールに関連する設定
}

stream {
    streamモジュールに関連する設定
}

httpコンテキストは、バーチャルホスト毎の設定を行うserverディレクティブ、URI毎の設定を行うlocaltionディレクティブにより階層化され、次のような構成となります。

http {
    httpモジュールの設定

    server {
        サーバ毎の設定

        location PATH {
            URI毎の設定
        }
        location PATH {
            URI毎の設定
	}
        ...
    }

    server {
        ...
    }
}

各ディレクティブについて

ここからは、インストール時に作成される設定ファイルを基にして各ディレクティブについて見ていきます。

全般的な設定(core)

まず、全般的な設定であるcoreについて確認していきます。

いちばん外側に記述できる設定は、コアモジュールで提供されるディレクティブとなります。ここで確認するディレクティブ以外にどのようなディレクティブがあるかは次のサイトで確認することができます。

それでは、順に確認していきます。設定ファイルnginx.confの最初には次の設定が書かれています。

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

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

この設定が何を行っているのか一つずつ確認していきます。

userディレクティブ (実行ユーザの設定)

userディレクティブは、nginxのworkerプロセスを実行する権限のあるユーザを設定します。

user nginx;

この例では、nginxというユーザで実行します。psコマンドで確認するとnginx: worker processがnginxユーザで動作していることを確認することができます。

# ps -aux | grep [n]ginx
root       2417  0.0  0.2 122272  2244 ?        Ss    7月06   0:00 nginx: master process /usr/sbin/nginx
nginx      2420  0.0  0.3 122728  3792 ?        S     7月06   0:00 nginx: worker process

worker_processesディレクティブ (workerのプロセス数を設定)

worker_processesディレクティブは、nginxのworkerプロセスの数を設定します。workerプロセスの数は、CPUのコア数より多く設定してもパフォーマンスは上がらないとのことです。

この例では、workerプロセスの数を自動検出により設定するように設定されています。

worker_processes auto;

error_logディレクティブ(エラーログの出力先とロギングレベルの設定)

error_logディレクティブは、エラーログの出力先ファイル名とロギングのレベルを指定します。このディレクティブは、main, http, server, locationのどのコンテキストでも設定でき、必要に応じてエラーログの出力先を変えることができます。 ロギングレベルは、オプションとなっておりdebug, info, notice, warn, error, crit, alert, emergを指定することができます。省略した場合は、errorが適用されます。

この例では、/var/log/nginx/error.logへログを出力します。

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

pidディレクティブ(PIDの保存先を設定)

pidディレクティブは、メインプロセスのプロセスIDを格納するファイルを設定します。

この例では、nginxのメインプロセスのプロセスIDを/run/nginx.pidに保存します。

pid /run/nginx.pid;

includeディレクティブ(モジュールの読み込み)

includeディレクティブは、外部の設定ファイルを読み込むよう指定します。

この例では、/usr/share/nginx/modules/ディレクトリにある設定ファイルを読み込みます。

include /usr/share/nginx/modules/*.conf;

/usr/share/nginx/modules/ディレクトリには、次のファイルがインストールされており各モジュールが読み込まれるよう設定されています。

  • mod-http-geoip.conf
  • mod-http-image-filter.conf
  • mod-http-perl.conf
  • mod-http-xslt-filter.conf
  • mod-mail.conf
  • mod-stream.conf

eventsコンテキスト

eventsコンテキストでの設定について確認していきます。eventsコンテキストは接続処理に関する設定を行います。

設定ファイルnginx.confのeventsコンテキストには次の設定が書かれています。

events {
    worker_connections 1024;
}

worker_connectionsディレクティブ(最大同時接続数を設定)

worker_connectionsディレクティブは、1つのworkerプロセスが同時に処理できる最大接続数を設定します。初期設定ではworker_connectionsは1024に設定されており、通常のブラウザでは一回の接続につき複数のコネクションを消費します。例えば、1つの接続につき2コネクション消費する場合、worker1つあたりの最大同時接続数は512となります。

この例では、一つのworkerあたり最大1024個のコネクションを処理します。

worker_connections 1024;

コネクション数を増やしたい場合は、OSに設定された使用可能な資源を確認・設定しておくよ良いそうです。

# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 3819
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024       ← 影響するパラメータ
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 3819       ← 影響するパラメータ
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

最大同時接続数を増やす場合は、open files とmax user processesが影響をするため、次のコマンドで設定を変更します。

# ulimit -n [設定したい数値]
# ulimit -u [設定したい数値]

httpコンテキスト

httpコンテキストでの設定について確認していきます。

httpコンテキストに記述できる設定はhttpモジュールで提供されるディレクティブが主なものになります。httpモジュールの種類とディレクティブについては次のサイトにて確認することができます。

設定ファイルnginx.confのhttpコンテキストには次の様に設定が書かれています。

http {
    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;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

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

    include /etc/nginx/conf.d/*.conf;

    server {
        ...省略
    }

この設定が何を行っているのか一つずつ確認していきます。

log_formatディレクティブ

log_formatディレクティブは、書き込まれるログのフォーマットを設定します。

この例では、フォーマットにmainという名前を設定し、出力するパラメータを設定しています。このmainという名前は、後に出てくるaccess_logディレクティブで使用されます。

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ディレクティブ(アクセスログの出力先を設定)

access_logディレクティブは、アクセスログの出力先ファイル名を指定します。このディレクティブは、http, server, location, limit_exceptのコンテキストに設定でき、必要に応じてログの出力先を変えることができます。

この例では、mainという名前でlog_formatディレクティブに定義した形式で/var/log/nginx/access.logへ出力されます。

access_log  /var/log/nginx/access.log  main;

sendfileディレクティブ

sendfileディレクティブは、コンテンツファイルの読み込みとクライアントへのレスポンスの送信にsendfile() APIを使うかどうかを設定します。sendfile()を使うとノンブロッキングI/Oが使用されるそうです。

この例では、sendfile()を利用するように設定されています。

sendfile            on;

tcp_nopushディレクティブ

tcp_nopushディレクティブは、sendfileが有効なときにFreeBSDの場合はTCP_NOPUSHソケットオプション、Linuxの場合はTCP_CORKソケットオプションを使うかどうかを設定します。

この例では、tcp_nopushを利用するように設定されています。

tcp_nopush            on;

tcp_nodelayディレクティブ

tcp_nodelayディレクティブは、TCP_NODELAYソケットオプションを使うかどうかを設定します。このオプションは、接続がキープアライブ状態に移行した場合にのみ有効です。

この例では、cp_nodelayを利用するように設定されています。

tcp_nodelay            on;

keepalive_timeoutディレクティブ

keepalive_timeoutディレクティブは、サーバ側でのキープアライブのタイムアウトの秒数を設定します。

この例ではキープアライブのタイムアウトを65秒に設定しています。

keepalive_timeout   65;

types_hash_max_sizeディレクティブ

types_hash_max_sizeディレクティブは、コンテンツ配信などの最適化に利用するハッシュテーブルのサイズを設定します。

この例では、ハッシュテーブルのサイズを2048バイトに設定しています。

types_hash_max_size 2048;

mime.typesの読み込み

この例では、/etc/nginx/mime.typesを読み込んでいます。

include             /etc/nginx/mime.types;

mime.typesファイルの内容は、次の様にtypesディレクティブに設定されます。

types {
    text/html                             html htm shtml;
    text/css                              css;
    text/xml                              xml;
    image/gif                             gif;
    image/jpeg                            jpeg jpg;
    application/javascript                js;
    application/atom+xml                  atom;
    application/rss+xml                   rss;

    text/mathml                           mml;
    text/plain                            txt;
    text/vnd.sun.j2me.app-descriptor      jad;
    text/vnd.wap.wml                      wml;
    text/x-component                      htc;
    ...

default_typeディレクティブ

default_typeディレクティブは、デフォルトで応答するMIMEタイプを設定します。

この例では、デフォルトのMIMEタイプがapplication/octet-streamとなります。

default_type        application/octet-stream;

conf.d/ディレクトリにある設定ファイルの読み込み

この例では、/etc/nginx/conf.d/にある設定ファイルを読み込みます。インストール後の状態では、ファイルが存在しないため何も読み込まれません。

include /etc/nginx/conf.d/*.conf;

serverディレクティブ

serverディレクティブは、バーチャルホストの設定となります。が、大分長くなりましたので、「nginxの設定 その2」で見ていきたいと思います。