一聚教程网:一个值得你收藏的教程网站

热门教程

Nginx中提示Too Many Open Files 错误解决办法

时间:2022-06-30 18:53:07 编辑:袖梨 来源:一聚教程网

做了点实验看了些源码,印证了自己的猜想。

对于get方法,send header+output_filter 就可以结束一次请求,因为GET方法是同步的,nginx会在handler返回之后的步骤中关闭链接,但对于post方法,由于nginx是使用异步的方式处理post数据,因此必须显式的关闭链接。

 nginx的content handler同步返回后会调用ngx_http_finalize_request,在这个函数里,如果handler返回值为ngx_done则会直接ngx_http_finalize_connection,但后者并非如其名字那样结束一个连接,如果开启了keepalive,那么这个函数结束的是这次请求,而并非关闭连接。何时启用keepalive由客户端决定,如果客户端的版本大于1.0或者在header中指定只用keepalive,则r的keepalive标记位置为1,表明启用keepalive,如果nginx也开启了keepalive支持,则在此次请求结束后,客户端未关闭连接的情况下,此连接依然存在。

 对于异步调用的post方法而言,post_handler是实际生成并返回http content的最后一步,如果返回码不是属于NGX_HTTP_SPECIAL_RESPONSE,那么,finalize_request的责任在posthandler自身,nginx不会在post_handler之后调用ngx_http_finalize_request结束请求关闭连接,所以如果你的content handler在post方法中处理请求,那么一定要记得ngx_http_finalize_request,否则,就会出现 accept too man open files。

好了讲了一堆道理如果你看不到没关系直接过滤上面,看下面设置办法


下面这个就是其中之一:

24: Too many open files

详细错误代码如下:

2011/05/01 23:00:49 [alert] 7387#0: *6259768 socket() failed (24: Too many open files) while connecting to upstream

次错误容易让人摸不着头绪,不知道是哪里出了问题,配置检查过没问题。程序代码的错误也不应该是这个错误信息啊。
其原因是Linux / Unix 设置了软硬文件句柄和打开文件的数目,解决方法如下:
简单修改方法:
使用如下命令可以把打开文件数设置足够大

ulimit -n 30000同时修改nginx.conf添加

 代码如下 复制代码

worker_rlimit_nofile 30000;

这样就可以解决Nginx连接过多的问题,Nginx就可以支持高并发。

注意: 用ulimit -n 30000 修改只对当前的shell有效,退出后失效。

感觉还是通过下面的房改修改比较稳定
一、通过修改硬件配置来实现更改
你可以使用’ulimit’命令来查看系统文件限制。

 代码如下 复制代码

ulimit -Hn
ulimit -Sn

在nginx服务器可以打开的文件数量受你操作系统的限制,编辑/etc/sysctl.conf 添加如下内容:

 代码如下 复制代码

fs.file-max = 70000

保存退出,从新读取系统配置

 代码如下 复制代码

sysctl -p

再编辑 /etc/security/limits.conf

添加内容:

 代码如下 复制代码

* soft nofile 10000
* hard nofile 30000

此修改内容需要reboot系统才能生效,所以务必从新启动下服务器。
二、修改Nginx系统的文件限制,使用nginx worker_rlimit_nofile Option
打开你相应的配置文件位置,我用的ubutnu12.04 所以路径如下

 代码如下 复制代码

vim /etc/nginx/nginx.conf

添加内容

 代码如下 复制代码

# set open fd limit to 30000
 worker_rlimit_nofile 30000;

保存退出从新读取nginx配置

 代码如下 复制代码

sudo service nginx reload

再次查看系统输出

ulimit -Hn
ulimit -Sn

结果如下:

30000
10000

到此结束。希望对大家有用.

热门栏目