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

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

对于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

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

时间: 2024-07-30 11:46:11

Nginx中提示Too Many Open Files 错误解决办法的相关文章

Nginx中WordPress后台404的问题的解决办法

唉经常重启机器看样子还是有好处的啊..顺便提下经常重启机器有什么好处呢,重启会检查硬件的--你懂的.. 这个是因为后台被重写导致的 WordPress官方肯定已经解决了,所以我们看一下官方的文档.    代码如下 复制代码 http://www.111cn.net /Nginx # Add trailing slash to */wp-admin requests. rewrite /wp-admin$ $scheme://$host$uri/ permanent; 就是简单地加一行斜杠重定向而

linux提示could not open session错误解决办法

一.问题 一台现网主机在root用户登录时报错" could not open session " ,在这之前由于oracle需要进行过ulimit参数的调整.如下: #<item> can be one of the following: #        - core - limits the core file size (KB) #        - data - max data size (KB) #        - fsize - maximum files

mysql提示 Duplicate entry..for key错误解决办法

如:Duplicate entry for key 3的意思是表的第3个字段出现了唯一索引的限制,需要插入其它不重复的值或去掉字段的unique属性. 看一个实例 如果您的站点上有 phpMyAdmin ,还可以通过它他检查下您的数据库中出错的表的自增字段的当前自增值是否和该表中自增字段的最大值相同,如果相同则会出现该错误. 如何检查? 1)进入您的 phpMyAdmin ,然后在左侧选择您出错的数据库. 2)选择您出错的表,并找到该表的自增字段,有 auto_increment 标识的字段即为

oracle中查询v$session报ORA-04031错误解决办法

客户的数据库在出账期间有工具登录Oracle数据库偶尔性报ORA-04031,经过分析是因为该工具需要查询v$session,经过分析确定是Bug 12808696 – Shared pool memory leak of "hng: All sessi" memory (Doc ID 12808696.8),重现错误如下 节点1进行查询报ORA-4031  代码如下 复制代码 SQL> select count(*) from v$session;   COUNT(*) ---

nginx php升级后 socket方式502错误解决办法

nginx php升级php5.3.29后 socket方式会导致网站出现502错误打不开,原因是因为nginx无法操作/tmp/php-cgi.sock(例), 需要在php-fpm.conf里面取消权限部分的注释,改成如下即可,然后重启php进程 listen.owner = www listen.group = www listen.mode = 0666

win7安装提示output error file to错误解决办法

一.可能是在恢复ghost时出现外部出现震动,用户不小心碰到光驱的问题 解决方法:让光驱保持平稳,重新装一次. 二.ISO问题 解决方法:只能重新下载ISO. 三.光驱光盘问题 解决方法:用Daemontools.UltraISO等软件将ISO中的GHO文件进行解压,然后用GHOST软件直接将文件恢复到C盘. 四.硬盘分区的问题 解决方法:进入DOS,运行"FDSK/MBR"修复引导扇区,再执行"FORMAT C:"格式化硬盘再恢复. 五.内存分区问题. 解决方法:

ueditor提示not import language file错误解决办法

建议手动加在语言,避免在ie下有时因为加载语言失败导致编辑器加载失败这里加载的语言文件会覆盖你在配置项目里添加的语言类型比如你在配置项目里配置的是英文,这里加载的中文,那最后就是中文 按照此方法后的结果是,貌似在IE6下能出现编辑器,但是好像样式都没出来,看来是样式文件没有加载上. 往这个思路去想,国际化文件没加载上,然后样式没加载上,所以基本上可以肯定是路径问题. 如果是路径问题的话,就往配置文件里去找啊,在配置文件的最顶部 解决办法:  代码如下 复制代码 在引入ueditor.config

Win7系统打印机清零时提示not found dll files错误怎么办?

Win7系统打印机清零时提示not found dll files错误怎么办?   1.右击清零程序选择打开属性; 2.切换到兼容性标签页,勾选"以兼容模式运行这个程序",选择:Windows XP(service Pack3),此处根据程序而定,在特权等级,勾选"以管理员身分运行此程序",点击确定; 3.此时问题就解决了,用户可按照正常清零步骤进行操作了.

mysql保存查询数据提示:specified twice错误解决办法

错误提示 MySQL提示Column 'content' specified twice,根据英文我们知道是列"content"被使用了两次,这样就好解决了,找到sql语句中删除一个content字段即可. 解决办法 就是删除你重复的字段即可