デーモン nginx 基本プロセスに対して「最大オープンファイル数」の ulimit を設定します。

デーモン nginx 基本プロセスに対して「最大オープンファイル数」の ulimit を設定します。

nginxDebian(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

LimitNOFILEsystemdを介して設定されたデーモンは、実際には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

この問題へのいくつかのリンクとリソースは次のとおりです。

この方向を教えてくれた@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

関連情報