为守护进程的 nginx 主进程配置 `max open files` 的 ulimit

Gre*_*und 2 debian nginx ulimit

我有一个nginx-daemon 在 Debian (8.3) 上运行。nginx 进程在尝试写入日志文件时偶尔会遇到资源限制:too many open files.

所述nginx主进程与根执行,而每个的四个工作进程与执行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
…
Run Code Online (Sandbox Code Playgroud)

每个 nginx worker 允许打开 30000 个文件。

nginx 主进程只允许打开 1024 个文件,分别是关于硬限制的 4096 个文件。

当我检查 root 用户 ulimit 设置时,我发现没有定义这样的限制!这个 1024/4096 设置可能来自哪里?

根 ulimit 设置

# logged in as root
ulimit -H
unlimited
Run Code Online (Sandbox Code Playgroud)

另外我检查了守护进程配置:

/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
Run Code Online (Sandbox Code Playgroud)

我在这里也没有看到 ulimit 配置。

我还可以检查哪些地方来修改nginx-master 进程的 1024/4096 nofile 限制?

Gre*_*und 7

可以这么说,问题似乎是我错误的假设,即 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
Run Code Online (Sandbox Code Playgroud)

以下是有关此问题的一些链接和资源:

感谢@ijaz-khan 为我指明了这个方向。