LinuxでNginxを使ったWebサイトを運営している場合、サイトの規模が大きくなったときに「Too many open files」というエラーでNginxが停止してしまうことがあります。
そこでここでは、「Too many open files」エラーの発生原因と、このエラーが発生しないようにする対処方法を紹介します。
目次
Too many open filesの原因
Nginxが「Too many open files」というエラーで停止してしまう原因は、Nginxで一つのworkerプロセスが開くことできるファイル数に制限があり、その制限値を超過したためです。
そのため、このエラーを回避するには、workerプロセスが開くことできるファイル数「Max open files」の制限値を変更する必要があります。
Max open filesの制限値を変更
現状の設定値を確認する
Nginxのworkerプロセス番号から「Max open files」の現在の設定値を調べます。
# ps axf | grep nginx
・・・
120161 ? S 0:02 \_ nginx: worker process
# cat /proc/120161/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 15543 15543 processes
Max open files 1024 4096 files
・・・
上の通り、現状の「Max open files」の制限値では、1プロセスでハードリミットの4096以上はファイルを開くことができないことがわかります。
設定値を変更する
そこで、この制限値を以下の手順で変更します。
まずは、設定ファイルを作成します。
# mkdir /etc/systemd/system/nginx.service.d
# vi /etc/systemd/system/nginx.service.d/limit.conf
[Service]
LimitNOFILE=32768
上で作成した設定ファイルを反映させます。
# systemctl daemon-reload
# systemctl restart nginx
設定の反映確認
設定変更後、設定が反映されているか先ほどと同じ手順で確認します。
# ps axf | grep nginx
・・・
221848 ? S 0:02 \_ nginx: worker process
# cat /proc/221848/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 15543 15543 processes
Max open files 32768 32768 files
・・・
設定した制限値になっていればOKです。
あとがき
エラーが出てから対応しても良いですが、あらかじめ制限値を緩和しておけばサイトが止まるリスクを減らせますね。