我得到了很多499 NGINX错误码。我知道这是客户端的问题。这不是NGINX或我的uWSGI堆栈的问题。当a得到499时,我注意到uWSGI日志中的相关性。

address space usage: 383692800 bytes/365MB} {rss usage: 167038976
bytes/159MB} [pid: 16614|app: 0|req: 74184/222373] 74.125.191.16 ()
{36 vars in 481 bytes} [Fri Oct 19 10:07:07 2012] POST /bidder/ =>
generated 0 bytes in 8 msecs (HTTP/1.1 200) 1 headers in 59 bytes (1
switches on core 1760)
SIGPIPE: writing to a closed pipe/socket/fd (probably the client
disconnected) on request /bidder/ (ip 74.125.xxx.xxx) !!!
Fri Oct 19 10:07:07 2012 - write(): Broken pipe [proto/uwsgi.c line
143] during POST /bidder/ (74.125.xxx.xxx)
IOError: write error

我正在寻找一个更深入的解释,希望我的NGINX配置uwsgi没有问题。我只看表面。好像是客户的问题。


当前回答

在我的例子中,我有这样的设置

AWS ELB >> ECS(nginx) >> ECS(php-fpm).

我为ECS(php-fpm)服务配置了错误的AWS安全组,因此Nginx无法接触到php-fpm任务容器。 这就是为什么我在nginx任务日志中得到错误

499 0 - elb-healthchecker/2.0

健康检查配置为检查php-fpm服务并确认其正常运行并返回响应。

其他回答

Nginx中的HTTP 499意味着客户端在服务器响应请求之前关闭了连接。以我的经验,通常是由客户端超时引起的。据我所知,这是Nginx特定的错误代码。

就我而言,我没有耐心,最终误解了日志。

事实上,真正的问题是nginx和uwsgi之间的通信,而不是浏览器和nginx之间的通信。如果我在浏览器中加载了这个网站,并且等了足够长的时间,我就会得到一个“504 -坏网关”。但花了很长时间,我一直在尝试,然后在浏览器中刷新。所以我没有等待足够长的时间来看到504错误。当在浏览器中刷新时,也就是关闭前一个请求时,Nginx将其写入日志为499。

细化

在这里,我假设读者知道的和我刚开始玩游戏时一样少。

我的设置是一个反向代理,nginx服务器,和一个应用服务器,后面是uWSGI服务器。来自客户端的所有请求都将发送到nginx服务器,然后转发到uWSGI服务器,然后以同样的方式返回响应。我认为这是每个人使用nginx/uwsgi和应该使用它的方式。

我的nginx正常工作,但是uwsgi服务器出了问题。uwsgi服务器无法响应nginx服务器有两种(也许更多)方式。

1) uWSGI说:“我正在处理,请稍等,您很快就会得到回复”。Nginx有一段时间,它愿意等待,fx 20秒。之后,它将响应客户端,并返回一个504错误。

2) uWSGI死了,或者在nginx等待它的时候uWSGI死了。Nginx马上就看到了,在这种情况下,它返回一个499错误。

我通过在客户端(浏览器)中发出请求来测试我的设置。在浏览器中什么都没有发生,它只是一直挂着。大约10秒钟之后(比超时时间还短),我得出结论,有些地方不太对(这是真的),并从命令行关闭uWSGI服务器。然后我将转到uWSGI设置,尝试一些新的设置,然后重新启动uWSGI服务器。当我关闭uWSGI服务器时,nginx服务器将返回一个499错误。

所以我一直在调试499错误,这意味着在谷歌上搜索499错误。但是如果我等了足够长的时间,就会得到504错误。如果我得到504错误,我就能够更好地理解问题,然后能够调试。

所以结论是,问题出在uWGSI上,它一直挂着(“再等一会儿,再等一会儿,然后我就会给你一个答案……”)。

我不记得我是怎么解决这个问题的。我想这可能是由很多事情引起的。

对我来说,我已经启用了ufw,但我忘记暴露我的上行端口。_。

有一次,我得到499“请求已被反病毒禁止”作为AJAX http响应(卡巴斯基互联网安全与轻启发式分析的假阳性,深度启发式分析正确地知道没有任何错误)。

当你指向499时,nginx记录了一个连接中止。但这通常是在您的后端服务器太慢,另一个代理超时或用户软件终止连接时产生的。因此,检查uWSGI是否响应快,或者uWSGI /数据库服务器上是否有负载。

在很多情况下,在用户和nginx之间有一些其他的代理。有些可能在你的基础设施中,比如CDN,负载均衡器,清漆缓存等。其他可以在用户端,如缓存代理等。

如果你这边有代理,比如LoadBalancer / CDN……您应该将超时设置为先超时您的后端,然后逐步将其他代理超时给用户。

如果你有:

user >>> CDN >>> Load Balancer >>> Nginx >>> uWSGI

我建议你设置:

n秒到uWSGI超时 N +1秒到nginx超时 n+2秒超时到负载均衡器 n+3秒超时到CDN。

如果你不能设置一些超时(如CDN),找到它的超时是什么,并根据它调整其他的(n, n-1…)

这提供了一个正确的超时链。你会发现是谁给出了超时并将正确的响应代码返回给用户。