背景
最近在使用 Nginx 的过程中,访问网站的时候时常出现 500 Interval Server Error�。查看日志,发现错误原因是 Too many open files。
问题分析
在网上根据 500 Interval Server Error 解决方案,没有明确的解决方案。又根据 Too many open files 咨询阿兰,答复说应该是打开的 Linux 的文件句柄数达到上限了,因为 Nginx 把网络连接都映射成了文件。那解决问题的关键就在于修改 Linux 的文件打开数上限了。
解决方案
无效的解决方案
通过搜索,可以根据以下指令来查看系统文件限制。
ulimit -Hn
ulimit -Sn
临时可以使用以下命令提高上限。
ulimit -n 655350
但据说这种方式退出 Shell 以后会失效,因为当前还暂时涉及不到重启的问题,需要的时候再继续探讨解决。我原本以后退出 Shell 的意思是重启,原来就是退出控制台或者说是本次会话,所以这么修改实在没什么意义。而且最重要的是这种解决方案不好使。
有效的解决方案
看了歪果仁这篇文章以后才知道到底怎么解决。
看了很多解决这个问题的文章,都是把打开文件数提到 10000 或者 30000。我的服务器的打开上限已经是 65535 了,比他们调整后的都高。因此可能问题不是出现在这里。
根据这篇文章,我重点查了一下 Nginx 这个进程所允许的打开文件数量。
cat /proc/<pid>/limits
发现文件打开限制只有 1024,可能是这个地方是瓶颈。于是又在 Nginx 的配置文件中,单独加上了一行,用以设置该进程单独的上限。
worker_rlimit_nofile 10240;
目前为止,问题没有再出现。