web-dev-qa-db-ja.com

デーモン化されたnginxマスタープロセスの `max openfiles`のulimitの構成

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設定はどこから来るのですか?

ルートulimit設定

# logged in as root
ulimit -H
unlimited

さらに、デーモン構成を確認しました:

/lib/systemd/system/nginx.service

[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制限を変更するために、他に確認できる場所はありますか?

2

問題は、いわば、systemdサービスが/etc/security/limits.conf

Systemdを介して構成されたデーモンは、limits.confの設定を意図的に無視し、サービス構成ファイルにLimitNOFILE構成を必要とすることが判明しました。

Systemdユニットファイルを更新すると、問題が修正されました。

/lib/systemd/system/nginx.service

[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に感謝します。

4