Nginxが「Too many open files」で止まる原因と対処方法

Nginxが「Too many open files」で止まる原因と対処方法

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です。

あとがき

エラーが出てから対応しても良いですが、あらかじめ制限値を緩和しておけばサイトが止まるリスクを減らせますね。