如何设置nginx的最大打开文件数?

32

尽管我已经进行了以下设置,甚至重新启动了服务器:

# head /etc/security/limits.conf -n2
www-data soft nofile -1
www-data hard nofile -1
# /sbin/sysctl fs.file-max
fs.file-max = 201558

特定进程的打开文件限制仍为1024/4096:

# ps aux | grep nginx
root       983  0.0  0.0  85872  1348 ?        Ss   15:42   0:00 nginx: master process /usr/sbin/nginx
www-data   984  0.0  0.2  89780  6000 ?        S    15:42   0:00 nginx: worker process
www-data   985  0.0  0.2  89780  5472 ?        S    15:42   0:00 nginx: worker process
root      1247  0.0  0.0  11744   916 pts/0    S+   15:47   0:00 grep --color=auto nginx
# cat /proc/984/limits
Limit                     Soft Limit           Hard Limit           Units
Max cpu time              unlimited            unlimited            seconds
Max file size             unlimited            unlimited            bytes
Max data size             unlimited            unlimited            bytes
Max stack size            8388608              unlimited            bytes
Max core file size        0                    unlimited            bytes
Max resident set          unlimited            unlimited            bytes
Max processes             15845                15845                processes
Max open files            1024                 4096                 files
Max locked memory         65536                65536                bytes
Max address space         unlimited            unlimited            bytes
Max file locks            unlimited            unlimited            locks
Max pending signals       15845                15845                signals
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us
我已尝试谷歌上所有可能的解决方案,但都没有成功。我错过了哪个设置?

我已尝试谷歌上所有可能的解决方案,但都没有成功。我错过了哪个设置?


2
重复:https://dev59.com/8HLYa4cB1Zd3GeqPc-nk? - T0xicCode
4个回答

65

在CentOS上 (测试于7.x版本):

创建文件 /etc/systemd/system/nginx.service.d/override.conf ,并将以下内容添加到其中:

[Service]
LimitNOFILE=65536

使用以下命令重新加载systemd守护进程:

systemctl daemon-reload

将以下内容添加到Nginx配置文件中:

worker_rlimit_nofile 16384; (has to be smaller or equal to LimitNOFILE set above)

最后重启Nginx:

systemctl restart nginx

您可以使用cat /proc/<nginx-pid>/limits命令验证它是否有效。


2
我确认这也适用于 Ubuntu Xenial。感谢您的方法。 - Thomas Urban
1
根据我的经验,你只需要更改 worker_rlimit_nofile 并重新加载 nginx。除非你达到了硬限制,否则可能不需要这样做。我曾经在 Debian Wheezy 上将 worker_rlimit_nofile 的限制提高到了主进程设置的硬限制之上。 - x-yuri
1
此外,在CentOS 7上,您可以执行以下操作: systemctl edit SERVICE_NAME ,在那里提供变量,保存该文件并重新加载服务。 - adrianTNT
我在Ubuntu20.04上尝试了这个,如果worker_rlimit_nofile > LimitNOFILE,则最大打开文件数等于worker_rlimit_nofile的值。 - ws_
我已经设置了所有这些,但还是不起作用 :/ - xeruf
显示剩余2条评论

13
对于nginx来说,只需编辑nginx.conf并设置worker_rlimit_nofile即可更改限制。我最初认为这是nginx自我施加的限制,但它增加了每个进程的限制。
worker_rlimit_nofile 4096;

您可以通过获取nginx进程ID(从top -u nginx中获取)来进行测试,然后运行:

您可以使用上述方式进行测试。

cat /proc/{PID}/limits

查看当前的限制

另一种方法 在CentOS 7上是通过systemctl edit SERVICE_NAME,在那里添加变量:

[Service]
LimitNOFILE=65536

保存该文件并重新加载服务。


12

发布这个问题后的几分钟内,我找到了答案...

# cat /etc/default/nginx
# Note: You may want to look at the following page before setting the ULIMIT.
#  http://wiki.nginx.org/CoreModule#worker_rlimit_nofile
# Set the ulimit variable if you need defaults to change.
#  Example: ULIMIT="-n 4096"
ULIMIT="-n 15000"

/etc/security/limit.conf被PAM使用,因此与www-data(它是nologin用户)无关。


4
/etc/default/nginx在哪里?我只看到了/etc/nginx/nginx.conf,尝试设置worker_rlimit_nofile没有成功。 - SathiyaS
你实际尝试过你自己的答案吗?我发现重新启动时nginx会返回“无效选项:n”。 - Hassan Baig

2

对于那些在使用 pre-systemd Debian 系统的人,nginx 的 init 脚本执行的是 /etc/default/nginx。所以,只需在该文件中添加以下行:

ulimit -n 9999

不需要操作init脚本,就可以更改nginx守护进程的限制。

像之前的回答中添加ULIMIT="-n 15000"在我的nginx版本中无效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接