基本ディレクティブ

nginxの設定ファイルの基本ディレクティブ(simple directives)に関して、本家サイトのリファレンスを元に説明します。

本章では、参考ドキュメントに記載したnginx-modules-reference.pdfファイルの「1.1 Core functionality」節をベースに記載します。

尚、2017年6月初旬時点で本家サイトのドキュメント、は1.11.10をベースにしており、本サイトも同バージョン以降を対象とします。

「1.1 Core functionality」に定義された基本ディレクティブの内worker_関係は以下になります。

基本ディレクティブのうち、まずはworkerプロセスに関係するディレクティブにいて、
本家サイトを和訳及び検証機で確認します。

参考ドキュメント

英語に抵抗が無い方は直接以下のpdfファイルを確認して下さい。

worker_processes

workderプロセスの数を制限するworker_processesはnginxの特徴である1コアに対して
Httpリクエストを処理実行するworkerプロセスの数を決定するディレクティブです。

worker_processes
構文
worker_processes 数値 | auto;
デフォルト値
1
コンテキスト
main
version
設定値autoの利用は1.2.5及び1.3.8以上から
必須
設定推奨

LinuxにおけるCPUのコア数は、/proc/cpuinfoファイルに定義されています。

CPUのコア数確認(Linux)
$lscpu
rchitecture:          i686
CPU 操作モード:   32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                2
On-line CPU(s) list:   0,1
コアあたりのスレッド数:1
ソケットあたりのコア数:2
Socket(s):             1
ベンダー ID:       GenuineIntel
CPU ファミリー:   6
モデル:             23
Model name:            Intel(R) Core(TM)2 Duo CPU     T8100  @ 2.10GHz
ステッピング:    6
CPU MHz:               800.000
CPU max MHz:           2101.0000
CPU min MHz:           800.0000
BogoMIPS:              4189.32
仮想化:             VT-x
L1d キャッシュ:   32K
L1i キャッシュ:   32K
L2 キャッシュ:    3072K
						

または、「/proc/cpuinfo」ファイルをcatで確認することで、LinuxサーバのCPUが確認できます。

私の古いPCでは上記のように出力され、CPU(s)項目からコア数が2コアであることを示しています。
よって、私の古い検証用PCでのworker_processは2に設定します。

workerプロセス数の確認(サービスの場合)
$sudo systemctl status nginx
● nginx.service - The NGINX HTTP and reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: en
   Active: active (running) since 木 2017-06-08 20:08:20 JST; 8min ago
  Process: 2199 ExecStop=/bin/kill -s QUIT $MAINPID (code=exited, status=0/SUCCE
  Process: 2230 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 2226 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
 Main PID: 2232 (nginx)
   CGroup: /system.slice/nginx.service
           └2232 nginx: master process /usr/sbin/ngin
           └2233 nginx: worker proces
           └2234 nginx: worker proces

 6月 08 20:08:20 yourserver systemd[1]: Starting The NGINX HTTP and reve
 6月 08 20:08:20 yourserver nginx[2226]: nginx: the configuration file /
 6月 08 20:08:20 yourserver nginx[2226]: nginx: configuration file /etc/
 6月 08 20:08:20 yourserver systemd[1]: Started The NGINX HTTP and reve
 
						
workerプロセス数の確認(プロセスで確認)
$ps -aux | grep nginx 
root      2289  0.0  0.0   7248   544 ?        Ss   20:28   0:00 nginx: master process /usr/sbin/nginx
nginx     2290  0.0  0.1   7412  2500 ?        S    20:28   0:00 nginx: worker process
nginx     2291  0.0  0.1   7412  2500 ?        S    20:28   0:00 nginx: worker process
						

上記のように2行worker proces と表示され、2つのworkerプロセスが起動しました。
autoに変更した場合には、私の2コア(Core 2 Duo)の環境では、2つのworkerプロセスが起動しました。
サーバー設定時には、コア数とautoの両方の値を検証して下さい。

worker_cpu_affinity

worker_cpu_affinity
構文
worker_cpu_affinity cpumask...;
構文
worker_cpu_affinity auto [cpumask]...;
デフォルト値
-
コンテキスト
main
version
autoの設定値は、1.9.10以上から
必須
設定推奨

例えば

worker_cpu_affinityの設定例1
worker_processes 4; 
worker_cpu_affinity 0001 0010 0100 1000;
						

各workerプロセスを別のCPUにバインドします。

worker_cpu_affinityの設定例2
worker_processes 2; 
worker_cpu_affinity 0101 1010;
						

第1のワーカープロセスをCPU0 / CPU2にバインドし、第2のワーカープロセスをCPU1 / CPU3にバインドします。
2番目の例は、ハイパースレッディングに適しています。

1.9.10からリリースされたworker_cpu_affinityの設定値autoは、workerプロえセスにCPUを自動に割り当てます。

worker_cpu_affinityの設定例3
worker_processes auto; 
worker_cpu_affinity auto;
						

オプションのmaskパラメータを使用して、自動バインディングで使用可能なCPUを制限することができます。

worker_cpu_affinityの設定例4 使用可能なCPUを制限する例
worker_processes auto; 
worker_cpu_affinity auto 01010101;
						

※.この設定4の方法は、LinuxとFreeBSDだけ利用可能です。

worker_priority

worker_priority
構文
worker_priority 数値;
デフォルト値
0
コンテキスト
main
version
-
必須
-

worker_rlimit_core

worker_rlimit_core
構文
worker_rlimit_core サイズ数値;
デフォルト値
-
コンテキスト
main
version
-
必須
-

RLIMIT_CODEとはコアダンプファイルサイズの上限を意味します。
以下の参考サイトの内容に関してコアダンプを確認して下さい。

workerプロセスがCPUの操作時の致命的なエラーが発生するとコアダンプファイルを出力するため、
このファイルが肥大化が起因としてトラブルを回避するための設定項目です。

Linuxのコアダンプの制限の状態を確認するコマンド
$ulimit
$unlimited
						

私の検証用PC(Ubuntu16.04LTS)では、未制限でした。

worker_rlimit_nofile

worker_rlimit_nofile
構文
worker_rlimit_nofile 数値;
デフォルト値
-
コンテキスト
main
version
-
必須
-

RLIMIT_NOFILEは、プロセスが開くことができるファイルディスクリプタの上限値を決めます。
Linuxのファイルディスクリプタの上限値を確認します。

Linuxのファイルディスクリプタ上限の確認
$ulimit -n
1024
						
OS全体のファイルディスクリプタ上限の確認
$cat /proc/sys/fs/file-max
201103
						

Too many open filesエラー

nginxのログファイル(/var/log/nginx/error.log)に「Too many open files」が出力された時には、
前項で説明した「worker_rlimit_nofile」の値を超えてworkerプロセスがファイルを開く処理を実行しようとした結果、
ファイルディスクリプタの上限値を超えたためファイルの読み込みができなかった事を意味します。

error.logの出力内容
$tail /var/log/nginx/error.log
2017/06/09 16:05:33 [crit] 2288#2288: accept4() failed (24: Too many open files)
						
workerプロセスのファイルディスクリプタの上限値確認
$ ps aux | grep nginx
root      2339  0.0  0.0   7248   544 ?        Ss   16:16   0:00 nginx: master process /usr/sbin/nginx
nginx     2340  0.0  0.0   7412  2004 ?        S    16:16   0:00 nginx: worker process
nginx     2341  0.0  0.0   7412  2004 ?        S    16:16   0:00 nginx: worker process
$cat /proc/2340/limits
Limit                     Soft Limit           Hard Limit           Units
Max cpu time              unlimited            unlimited            seconds
Max file size             unlimited            unlimited            bytes
Max data size             unlimited            unlimited            bytes
Max stack size            8388608              unlimited            bytes
Max core file size        0                    unlimited            bytes
Max resident set          unlimited            unlimited            bytes
Max processes             15743                15743                processes
Max open files            1024                 1024                 files
Max locked memory         65536                65536                bytes
Max address space         unlimited            unlimited            bytes
Max file locks            unlimited            unlimited            locks
Max pending signals       15743                15743                signals
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us
						

「Max open Files」(Ubuntu16.04LTS)項目の1024(Soft Limit)が最大値となっています。
Too many open filesエラーが発生した場合には、worker_processesで指定した値(workerプロセス数)×worker_rlimit_nofileが、
OSの上限数を超えないようにulimitコマンドでファイルディスクリプタ(Soft Limit)を調整します。

working_directory

working_directory
構文
working_directory ディレクトリ;
デフォルト値
-
コンテキスト
main
version
-
必須
-

https://www.nginx.com/resources/admin-guide/debug/に記載されているように、
nginxの挙動がおかしい時にworking_directory設定を有効及びdebug系設定を有効にして、コアダンプを確認するときに利用するようです。

worker_aio_requests

worker_aio_requests
構文
worker_aio_requests 数値;
デフォルト値
32
コンテキスト
events
version
1.1.4及び1.0.7~
必須
-

eventコンテキストに属するディレクティブのため、利用時には以下のようにeventコンテキスト内に設定します。

worker_aio_requests設定箇所
event {
    worker_aio_requests 32;
    worker_connections 1024;
}						
						

worker_connections

worker_connections
構文
worker_connections 数値;
デフォルト値
512
コンテキスト
events
version
-
必須
設定推奨

このworker_connectionsは、TCPコネクション数(http接続数)に該当します。
そのため、設定できる最大値は、OSのlocal portで許可されている範囲になります。

Linuxのlocal portを確認し、設定できる最大値を検討します。

Linuxのlocal port確認
$ cat /proc/sys/net/ipv4/ip_local_port_range
32768   60999
						

私の検証機Ubuntu16.04LTSでは上記のような値が表示されました。
すると60999-32768=28231個をエフェラルポートとして利用可能という事になります。

すると1つのworkerプロセスに割り当てる同時接続数のため、worker_processes×worker_connectionsが28231以内にする必要があります。
私のCPUのコア数が2つしか無い検証機では、worker_connectionsの最大値を8192として、512,1024の倍数で調整すれば良いと思います。
更に、このディレクティブは、worker_rlimit_nofileと関連しており、
worker_connectionsの設定値は、worker_rlimit_nofile以内の値で設定する必要があります。
※.worker_connectionsがworker_rlimit_nofileより大きな値を設定した場合は、nginx -t の確認で警告が出力されます。

大規模なシステムのサーバでは、worker_processと利用できるエフェラルポート数から計算し、
worker_connectionsに対して512又は1024の倍数で設定値を調整し、負荷試験で適切な値を設定するのが望ましいでしょう。

eventコンテキストに属するディレクティブのため、利用時には以下のようにeventコンテキスト内に設定します。

worker_connections設定箇所
event {
    worker_aio_requests 32;
    worker_connections 1024;
}