如何解决Nginx服务自动关闭问题
发布网友
发布时间:2022-02-27 00:58
我来回答
共1个回答
热心网友
时间:2022-02-27 02:27
首先排除是否为网络问题:检查了iptable等。同时思考,如果真的是网络问题,不应该运行一段时间后,才出现无法接受新连接的现象。
为了验证,当出现问题时,我又重新启动Nginx,发现又可以接收新的请求了。也就是说出现问题时,只需要重启Nginx就可以解决,那么自然不是网络因素。
判定是否是Nginx本身的问题(不一定是指代码包括我写的配置文件):因为这个代理服务器是为了测试fastsocket项目的稳定性,所以 Nginx是加载了fastsocket优化服务的。这时,就需要最纯粹的Nginx环境。我去掉了fastsocket服务,然后再用同样的配置启动 Nginx。这时,就排除了Nginx本身的问题。那么,究竟是否是fastsocket的bug呢?
这里先做一个小广告: fastsocket是新浪主导的一个开源项目,其通过封装socket套接字调用,无需改动服务程序,即可大幅提升服务程序性能。作者也是其中的维护者之一。这里小小推广一下:https://github.com/fastos/fastsocket。当使用fastsocket默认加载参数时,nginx运行一段时间就无法接受新连接请求了。
定位fastsocket问题:fastsocket的大部分优化功能都是有功能开关的,默认会使用一些功能,同时可以在加载动态模块时,使用参数指定是否打开开关。这时,先做实验,从所有功能关闭开始,逐渐打开功能开关,最后定位到enable_listen_spawn功能打开时,就会出现问题。并多次做实验,确定这是一个必现的问题。
当确定可以重现后,想这难道是一个fastsocket的bug吗?于是,先跟林晓峰同学说了一声,告诉他我的发现,毕竟fastsocket是他在sina时的工作,他最为熟悉代码。他说这可能是Nginx的配置使用了accept_mutex。我的配置文件虽然没有配置accept_mutex,但是没想到Nginx的accept_mutex是默认打开的。但是他忘了为什么会这样了?依稀记得是Nginx hang在了mutex中,具体原因记不清了。所以fastsocket的说明也是要求disable accept_mutex。
因为我一直以来有这还不错的求知欲,所以一定要搞清楚这个问题。同时我认为,如果真的是一启用accept_mutex,fastsocket和nginx就会有兼容问题,那也应该算是fastsocket的bug,应该将其解决掉。
定位Nginx hang在什么位置:这个很简单,使用strace -p跟踪Nginx的每个worer进程。发现大部分worker进程是在不断的epoll_wait,而其中一个worker进程,始终停留在epoll_wait中。重试多次,每次都是停留在epoll_wait中。
现在已经确定了本次问题,当使用fastsocket的enable_listen_spawn功能时,也就是fastsocket自动为当前CPU创建本地的listen socket套接字时,就会出现问题。
解决问题
当定位到问题时,就需要一步一步的找到原因,查看为什么一个worker进程始终停留在epoll_wait中。这时候,其实思考还是要优于动手。先思考,再动手,动手之后,看到结果,再做进一步思考。
查看该worker进程停留在epoll_wait的什么位置:只能通过日志形式来判断hang在epoll_wait的哪个位置?这时,不能用内核普通的printk来打印日志,不然就会淹没于大量正常工作worker进程打印的日志中。我们需要根据pid来打印日志。
再做一个小广告:我做了一个内核小工具git@github.com:gfreewind/unit_perf.git。是用来定位内核代码的性能瓶颈工具,和一些辅助工具。大家觉得还可以的话,就给赞个星星。
它提供一个宏UP_PID_INFO_LOG用于打印指定PID的日志,pid可以通过proc来指定。
这样我在epoll_wait中增加了大量的日志。在Nginx启动后,通过proc指定就打印某个worker进程的日志。
最后发现epoll_wait是因为指定了无限等待时间,所以该worker进程一直在hang住。
Nginx让一个worker进程无限等待,这稍微*了我对Nginx的认识。我认为Nginx一直都是使用无阻塞的系统调用,至少核心模块是这样处理的。那么为什么会出现这个现象呢?这时候,就需要思考,而不是动手了。
毫无疑问,accept_mutex是一个关键。它本身是用于均衡不同worker进程的负载。稍微阅读一点Nginx相关的 代码,就可以明白。在Nginx无法接收新连接请求时,一定是该轮到hang住的进程接收新连接请求。所以尽管其它进程没有hang住,但是它们是无法接 受新请求,而能够接收新请求的进程却hang住,这样就导致了问题的产生。
为什么hang住的进程无法接收到新的请求呢?这时还是思考优先。首先要勾画标准的内核TCP连接的过程,然后对比启用fastsocket 后,TCP连接的过程。很可能是这两者之间的区别,造成了问题。尤其是启用了spawn socket时,与标准流程的不同。spawn socket时,实际上为每个cpu都创建了一个本地listen 套接字的hash表,与全局的listen表区分开。这样一方面访问全局hash表时需要的锁,另一方面也做到了将TCP会话做到本地,可以尽量命中 cache。 对于同一个CPU,由于有两个listen表的存在,所以在收到新的TCP连接请求时,必须先检查本地的listen表,然后再检查全局表。 根据这样的流程和现象,应该是所有的连接请求,都被发到其它的CPU,并且匹配中了其它CPU的本地listen表,所以全局表中的listen socket套接字一直没有被匹配到。
那么hang住的进程,既没有连接请求匹配本地listen表中的套接字,而全局表也一样,因为被请求都被其它CPU命中了本地的套接字。
所以问题更为明朗了,hang住的进程所在的CPU不能收到任何新连接请求。
这时其实已经到了冲刺的时候了。开始的时候,我还想着,是否是fastsocket影响了数据包的分发,还想检查一下代码。但一想,还是先看看 RPS的设置吧——虽然我没有设置网卡的任何RPS。结果出乎我意料,原来阿里云ECS服务器默认就把网卡的RPS设置了,唯一的*网卡的RPS设置为 了0000,所以只有CPU 0能收到新连接请求,而另外的CPU1收不到任何的连接请求,这就造成了运行在CPU1上的worker进程hang住。
最后我修改了该网卡的RPS设置,使其可以将数据包分发到不同的CPU上。这样在加载了fastsocket后,即使打开了accept_mutex,Nginx也可以正常工作了。
本次过程,虽然最后发现只是服务器配置的问题,但整个儿过程还是收获不少。唯一的遗憾,是还没有定位Nginx对与epoll_wait的超时计算。开始的时候,都是500ms,后面因为什么因素变成了无限。这留到有时间的时候,再阅读Nginx源码吧。
Nginx服务怎么重启啊?
一、使用命令行重启 在Nginx安装目录下,可以通过命令行工具执行重启命令。对于大多数Linux系统来说,通常使用以下命令:1. 进入Nginx安装目录的sbin文件夹。2. 执行命令:`./nginx -s reload`。这条命令会优雅地重启Nginx服务,不会立即关闭已经建立的连接。当现有请求处理完成后,会重新加载配置文件并启...
还在找storm proxy?
作为上海圣钧信息科技有限公司的工作人员,我公司并不提供名为"Storm Proxy"的服务。我们致力于提供高质量的信息技术服务,包括但不限于云计算、大数据处理、人工智能等领域。我们的服务对象主要是企业客户,为其提供定制化的解决方案和技术支持。如果您正在寻找相关的服务,建议您通过搜索引擎或行业专业网站等途径进行查询。同时,请注意防范虚假信息和欺诈行为,确保您选择正规、可靠的服务提供商。如有其他问题或需要进一步了解,欢迎随时与我们联系。SmartProxy企业级海外住宅IP代理服务商,覆盖全球200+国家和地区,高匿稳定,动态住宅代理/静态住宅代理/账密提取,100%原生住宅IP,城市级定位,支持HTTP/HTTPS/SOCKS5协议,不限带宽,纯净高匿,网络集成更快捷,注册即送流量!Smartproxy代理...
Nginx服务器错误是什么原因?
解决方法:根据实际Nginx后端服务器的处理时间修改客户端超时时间。4、脚本错误(php语法错误、lua语法错误)。解决方法:查看nginx_err_log php_err_log。5、访问量过大,系统资源限制,不能打开过多文件。 磁盘空间不足。(access log开启可能导致磁盘满溢,服务器主动关闭)。解决方法:修改/etc/sysctl...
502 bad gateway怎么解决 nginx
解决方法主要包括:根据服务器负载和网站特性,调整缓冲区大小和header参数,使其保持在合理的范围内。对于php-cgi进程,需要增加max_children的设置,但需注意,这些配置会占用大量内存,因此必须根据服务器性能来合理调整,否则可能适得其反。总之,要解决502 bad gateway,关键在于找到问题的根源,对症下药...
解决nginx403forbidden
四、重新加载Nginx配置 在修改Nginx配置文件后,需要重新启动或重新加载Nginx服务以使配置生效。可以使用以下命令重新加载Nginx配置:shell sudo nginx -t # 检查配置文件是否正确 sudo systemctl reload nginx # 重新加载Nginx服务 具体解释如下:Nginx的403 Forbidden错误通常是因为权限问题导致的。可能是...
nginx反向代理,网站访问出现502,页面刷新之后可以正常访问?
1、nginx proxy的超时时间太短。解决方法:可以通过修改nginx配置调整。2、客户端主动关闭了连接。解决方法:检查客户端程序是否有问题。3、nginx两次提交post间隔过快。解决方法:检查代码有没有类似于循环提交POST的操作或者客户端有没有并发测试。4、数据库服务器连接失败,session服务器过期。解决方法:检查...
如何解决nginx504gatewaytime-out错误
解决nginx 504 Gateway Time-out错误的方法 一、增加代理连接的超时时间 1. 打开Nginx配置文件。2. 找到与代理相关的配置段,增加或修改`proxy_connect_timeout`和`proxy_read_timeout`的值。例如,将它们设置为更长的超时时间。二、优化后端服务性能 1. 检查后端服务的性能,确保其能够及时处理请求。...
Linux系统关闭Nginx服务器linux关闭nginx
第一步,使用root用户登录你的系统,然后在终端中使用以下命令查看Nginx服务器状态:sudo service nginx status 该命令将会显示Nginx服务的运行状态和配置信息。第二步,如果Nginx服务正在运行,则可以使用以下命令停止Nginx服务:sudo service nginx stop 该命令将停止Nginx服务,如果想终止运行的Nginx服务,请...
如何解决Nginx无法连接到服务器?
解决方案如下:1、打开你的浏览器,以360浏览器为例。2、点击最右上角的标志,如图所示,在下拉菜单中点击internet 选项.3、最后选高级,通过代理连接使用HTTP 1.1 勾上即可。
启动nginx服务的命令?
启动nginx服务的命令是:sudo service nginx start。详细解释如下:1. Nginx服务介绍 Nginx是一个高性能的HTTP和反向代理服务器。它可以作为独立的服务器使用,也可以作为负载均衡的服务器使用。在部署web应用或提供网络服务时,经常需要使用到Nginx。2. 启动命令构成 启动Nginx服务的命令由几个部分组成,...
windowsnginx怎么关闭?
要关闭Windows上的Nginx服务,您可以按照以下步骤操作:一、通过服务列表关闭Nginx 1. 打开“运行”对话框,输入“services.msc”并回车,打开服务列表。2. 在服务列表中找到“Nginx”服务。3. 右键点击“Nginx”服务,选择“停止”来关闭服务。二、...