nginx
Debian(8.3)で-daemonを実行しています。 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ワーカーは30,000個のファイルを開くことができます。
ただし、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設定は表示されません。
-masterプロセスの1024/4096ファイルなし制限を修正するにはどこで確認できますかnginx
?
答え1
そうだ質問言い換えれば、私はsystemdサービスが/etc/security/limits.conf
。
LimitNOFILE
systemdを介して設定されたデーモンは、実際にはLimit.confの設定を意図的に無視し、サービス設定ファイルで設定を要求することがわかりました。
私のシステムデバイスファイルを更新すると問題が解決しました。
/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
この問題へのいくつかのリンクとリソースは次のとおりです。
- https://serverfault.com/questions/628610/increasing-nproc-for-processes-launched-by-systemd-on-centos-7
- https://bugzilla.redhat.com/show_bug.cgi?id=754285
この方向を教えてくれた@ijaz-khanに感謝します。
答え2
これを達成する最善の方法は、サービスファイルをコピーすることです。
cp /lib/systemd/system/nginx.service /etc/systemd/system
それからで編集してください/etc/systemd/system
。存在する場合は、次のように生成して/etc/systemd/system/nginx.service.d
簡単なオーバーライドを実行できます。/etc/systemd/system/nginx.service.d/ulimit.conf
[Service]
LimitNOFILE=30000
/etc
システム定義ファイルを処理するときは、上書き方法を使用することをお勧めします。最後に忘れないでくださいsystemctl daemon-reload