这篇文章是关于当Nginx请求本地机器,而主机运行缓慢时该怎么办。我觉得边肖很实用,就和大家分享一下作为参考。让我们跟着边肖看一看。
00-1010在这台机器上安装了一个Discuz!在X3.4的论坛中,使用UCenter作为统一用户登录。在其应用程序管理页面上,通信状态始终提示为“正在连接”:
00-1010关于这个问题,网上绝大多数的说法都是Windows上的nginx服务器有问题,建议换成Apache。当我换成Apache的时候,问题确实解决了,但是我还是觉得nginx不会有这个问题,一定有解决的办法。
继续搜索,发现nginx日志中报告了一个499错误。在线上,据说499错误的原因是客户端主动与服务器断开连接。但是,看了ucenter的代码,似乎没有断线操作,但是看了日志报告的时间,我们发现了一个线索:
127 . 0 . 0 . 1--[18/Jul/2018 :22:35336048 0800]' GET/UC _ server/admin . PHP?m=appa=ls…
127 . 0 . 0 . 1--[18/Jul/2018 :22:36336019 0800]' GET/API/UC . PHP?代码=434 ermr/D/tjz 357 v3s a9 rlpqp0rpgfi 7 ryntpyveyeyay 3 xgen 8 oqk 9 etjgexnbyebkithypzqs HTTP/1.0 ' 499…
127 . 0 . 0 . 1--[18/Jul/2018 :22:36336019 0800]' GET/UC _ server/admin . PHP?m=appa=pinginajax=1url=…
日志的第一行是到ucenter应用程序管理中心页面的链接。在此页面中,ucenter向本地Discuz服务器发送通信验证请求(第三行日志),而第二行日志是Discuz服务器收到的通信验证请求,这一行出现499错误。
仔细看这三个日志的时间,我们发现第二个和第三个日志与第一个日志的时间间隔差不多是29秒。我们知道,PHP的默认超时时间是30秒,在统计一些错误时,29秒几乎是一样的。因此,可以认为这个499错误是由discuz服务器的499错误引起的,因为ucenter服务器发起了ping请求(第3行日志),从未收到返回值,因此超时并断开连接。
整个过程如下:
知道是499错误,就找怎么解决499问题。因此,他们中的大多数人建议向nginx服务器添加以下配置:
proxy _ ignore _ client _ abort on
fastcgi _ ignore _ client _ abort on
上述配置已添加到Discuz的配置项中:
位置~ \。php $ {
root c :/PHPackage/workspace/github/DiscuzX/BBS;
fastcgi _ pass 127 . 0 . 0 . 1:9090;
index.php指数;
fastcgi _ param SCRIPT _ FILENAME $ document _ root $ fastcgi _ SCR
ipt_name;
include fastcgi_params;
proxy_ignore_client_abort on;
fastcgi_ignore_client_abort on;
}
再运行服务器,发现499问题果然没了,但是通信问题依然没有解决,只是日志变为如下了:
127.0.0.1 - - [18/Jul/2018:22:35:48 +0800] "GET /uc_server/admin.php?m=app&a=ls&… 127.0.0.1 - - [18/Jul/2018:22:36:19 +0800] "GET /api/uc.php?code=434eRMR%2FD%2FtjZ357V3sA9RLPqp0rpGfi7ryntpyVEEYay3xgen8Oqk9ETjgEXNbyEbKItHYPZqs HTTP/1.0" 200 … 127.0.0.1 - - [18/Jul/2018:22:36:19 +0800] "GET /uc_server/admin.php?m=app&a=ping&inajax=1&url=… |
配置生效了,但是有个毛用啊,通信还是不成功。第1条日志和下面两条日志还是差了差不多30秒左右。回过头来仔细分析上面的两个配置项,应该是让nginx服务器忽略客户端断开的错误,注意,仅仅是让服务器忽略这个错误,也就是说,当ucenter请求超时,断开连接的时候,discuz服务器忽略了这个错误,从而返回200,可是ucenter实际上已经断开了,也收不到discuz的返回值,所以实际上还是通信失败。
不过再进一步分析上面的流程,从nginx与php的关系来看,发现整个请求处理如下图:
nginx收到请求后,发现是需要执行PHP代码,于是将请求就转给了PHP-CGI进程,由该进程找到PHP代码并执行,但是在PHP代码中,又再次向本机的另一个服务器发出HTTP请求,nginx收到后,发现同样要执行PHP代码,于是将请求又转回给PHP-CGI进程,但是系统中PHP-CGI进程只开了一个,后面的PHP代码要等到上面的执行完毕才能执行,而后面的PHP代码却又是上面的代码请求产生的,于是就阻塞了。
1.1.3 解决
分析至此,解决的思路就已经很清晰了,既然一个PHP-CGI线程处理不过来,那么就增加一个线程好了,修改启动nginx服务器的批处理代码如下,仅修改一个数字,见红色字体部分:
@echo off REM Windows 下无效 REM set PHP_FCGI_CHILDREN=5
REM 每个进程处理的最大请求数,或设置为 Windows 环境变量 set PHP_FCGI_MAX_REQUESTS=1000
echo Starting PHP FastCGI... rem RunHiddenConsole C:/PHPackage/PHP/php-cgi.exe -b 127.0.0.1:9090 -c C:/PHPackage/PHP/php.ini RunHiddenConsole xxfpm "C:/PHPackage/PHP/php-cgi.exe -c C:/PHPackage/PHP/php.ini" -n 2 -i 127.0.0.1 -p 9090
echo Starting nginx... RunHiddenConsole C:/PHPackage/nginx-1.15.1/nginx.exe -p C:/PHPackage/nginx-1.15.1 |
该数字原来是1,现在改为2,重新启动服务器,看任务管理器,果然有两个PHP-CGI进程:
再回到ucenter的应用管理页面,刷新,结果如下:
啥情况?我们上面折腾了半天,只是从“正在连接”变成了“通信失败”,问题还是没有解决啊!
不过呢,跟踪代码可以验证,499的问题的确是彻底解决了,至于为什么还是“通信失败”,那是另外一个问题了。
感谢各位的阅读!关于“Nginx下请求本机另外Host很慢怎么办”这篇文章就分享到这里了,希望
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/115161.html