当前位置: 首页 > 科技观察

[Nginx]并发太高,Nginx处理不了?这次我错怪Nginx了!!

时间:2023-03-12 06:51:22 科技观察

作者个人研发在高并发场景下提供了一个简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。开源半年多以来,已成功为十几家中小企业提供精准定时调度解决方案,经受住了生产环境的考验。为了造福更多的童鞋,这里给出开源框架的地址:https://github.com/sunshinelyz/mykit-delay前面写的,在服务器上搭建了一套压测环境,不为别的,只是为了测试Nginx在压力下的性能,是否如传说中的那么强大!具体环境为:11台虚拟机,全部安装CentOS6.864位操作系统,1台安装部署Nginx,另外10台同时作为客户端。CPU满载的线程向Nginx发送请求,对Nginx进行压力测试。没想到,出了问题!!Nginx报错。Nginx服务器流量非常大,Nginx错误日志中不断输出如下错误信息。2020-07-2302:53:49[alert]13576#0:accept()failed(24:Toomanyopenfiles)2020-07-2302:53:49[alert]13576#0:accept()failed(24:Toomanyopenfiles)2020-07-2302:53:49[alert]13576#0:accept()failed(24:Toomanyopenfiles)2020-07-2302:53:49[alert]13576#0:accept()failed(24:Toomanyopenfiles)2020-07-2302:53:49[alert]13576#0:accept()failed(24:Toomanyopenfiles)2020-07-2302:53:49[alert]13576#0:accept()failed(24:Toomanyopenfiles)2020-07-2302:53:49[alert]13576#0:accept()failed(24:Toomanyopenfiles)2020-07-2302:53:49[alert]13576#0:accept()failed(24:Toomanyopenfiles)2020-07-2302:53:49[alert]13576#0:accept()failed(24:Toomanyopenfiles)2020-07-2302:53:49[alert]13576#0:accept()failed(24:Toomanyopenfiles)根据错误日志的输出信息,我们可以看到打开的文件句柄过多,导致Nginx报错!那我们怎么解决这个问题呢?问题分析既然从Nginx的错误日志中我们基本可以确定问题的原因,请问这是不是Nginx本身的问题呢?答案是:是的,不是全部!为什么?原因很简单:Nginx打不开这么多文件句柄,一方面是因为我没有配置Nginx最大可以打开的文件数;另一方面,由于CentOS6.8操作系统本身对最大打开文件句柄数有限制,所以我也没有为操作系统配置最大文件句柄数。所以,这不全是Nginx的错!从某种意义上说,我对Nginx的看法是错误的!在CentOS6.8服务器中,我们可以在命令行输入以下命令来查看服务器默认配置的最大文件句柄数。[root@binghe150~]#ulimit-n1024可以看到在CentOS6.8服务器中,默认最大文件句柄数为1024,此时当Nginx的连接数超过1024时,会出现如下错误信息在Nginx的错误日志中输出。[alert]13576#0:accept()failed(24:Toomanyopenfiles)解决问题那么我们如何解决这个问题呢?其实也很简单,继续往下看!使用以下命令将打开的文件句柄数设置得足够大。ulimit-n655350也修改nginx.conf,增加如下配置项。worker_rlimit_nofile655350;注意:以上配置需要和error_log同级别。这样就可以解决Nginx连接数过多的问题,并且Nginx可以支持高并发(这里需要配置Nginx)。另外ulimit-n也会影响MySQL的并发连接数。提高它也可以提高MySQL的并发性。注意:用ulimit-n655350修改只对当前shell有效,退出后失效。永久解决问题如果想永久修改ulimits的值,就必须修改配置文件。您可以修改ulimit的命令并将其放在/etc/profile中。这种方法确实很不方便。另一种方法是修改/etc/security/limits.conf配置文件,如下所示。vim/etc/security/limits.conf在文件末尾添加如下配置项。*softnofile655360*hardnofile655360保存并退出vim编辑器。其中:星号代表全局,soft代表软件,hard代表硬件,nofile代表这里可以打开的文件句柄数。最后需要注意的是:要使limits.conf文件配置生效,必须保证在启动文件中加入pam_limits.so文件。查看/etc/pam.d/login文件中是否存在如下配置。sessionrequired/lib64/security/pam_limits.so不存在,需要添加以上配置项。