Debian(8.3)でnginx
-デーモンを実行しています。ログファイルを書き込もうとすると、nginxプロセスがリソース制限に遭遇することがあります:too many open files
.
nginx
マスタープロセスはrootで実行され、4つのワーカープロセスはそれぞれwww-data
ユーザー権限で実行されます。
Nginx-masterと各ワーカープロセス制限の構成を確認したところ、奇妙なことがわかりました。
cat /proc/{nginx-master-process-id}/limits
Limit Soft Limit Hard Limit Units
…
Max open files 1024 4096 files
…
cat /proc/{nginx-any-worker-process-id}/limits
…
Max open files 30000 30000 files
…
各nginxワーカーは30000ファイルを開くことができます。
ただし、nginxマスタープロセスでは、ハード制限に関して1024ファイル、それぞれ4096ファイルしか開くことができません。
Rootユーザーのulimit設定を確認すると、そのような制限が定義されていません。この1024/4096設定はどこから来るのですか?
# logged in as root
ulimit -H
unlimited
さらに、デーモン構成を確認しました:
[Unit]
Description=A high performance web server and a reverse proxy server
After=network.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --signal QUIT --retry QUIT/5 --pidfile /run/nginx.pid
# Give Passenger a chance to clean up before being killed by systemd.
ExecStop=/bin/sleep 1
TimeoutStopSec=5
KillMode=mixed
[Install]
WantedBy=multi-user.target
ここにもulimit構成はありません。
nginx
- masterプロセスの1024/4096 nofile制限を変更するために、他に確認できる場所はありますか?
問題は、いわば、systemdサービスが/etc/security/limits.conf
。
Systemdを介して構成されたデーモンは、limits.confの設定を意図的に無視し、サービス構成ファイルにLimitNOFILE
構成を必要とすることが判明しました。
Systemdユニットファイルを更新すると、問題が修正されました。
[Unit]
Description=A high performance web server and a reverse proxy server
After=network.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --signal QUIT --retry QUIT/5 --pidfile /run/nginx.pid
# Give Passenger a chance to clean up before being killed by systemd.
ExecStop=/bin/sleep 1
TimeoutStopSec=5
KillMode=mixed
LimitNOFILE=30000 # <= This line was added
[Install]
WantedBy=multi-user.target
この問題に関するリンクとリソースは次のとおりです。
私をその方向に向けてくれた@ ijaz-khanに感謝します。