目前我正在收到一个相当大的HTTP洪水,这导致我的nginx反向代理产生一个502坏的网关。
我有一个前端服务器运行nginx作为我的后端服务器的代理,但它只是connect() failed (110: Connection timed out) while connecting to upstream
错误时得到一堆connect() failed (110: Connection timed out) while connecting to upstream
。 他们的吨。 如果我绕过代理服务器连接到后端,我可以运行该网站就好了,所以我知道这是在反向代理的地方。 但是,我不知道如何确定它为什么会超时。
任何帮助?
在CentOS 6.2上运行nginx 1.2.3
我假设你已经把你的Nginx错误日志logging级别debugging起来了。 如果没有,从那里开始。
您最好的select可能是使用strace
来查看Nginx所做的系统调用。 特别是,你要注意connect()
调用,并留意这些返回码( man 2 connect
可以是你的朋友在这里)。
一旦获得了这些信息,您就可以更好地猜测问题是否仅限于您的前端代理,或者与代理和后端应用程序服务器之间的交互有关。
除非你想要放入dtrace探针,否则它不会比这更迂腐。
设置debugging日志级别:/etc/nginx/nginx.conf:
... http { ... error_log /var/log/nginx/error.log debug; # todo testing remove me not for production use ... }
在另一个窗口中设置tcpdump:
tcpdump not port 22 -vvv -s0 -q -XXX
在另一个窗口中监视日志文件:
tail -f /var/log/nginx/*
用strace交互式启动nginx:
# top of /etc/nginx/nginx.conf: daemon off; # todo testing remove me not for production use
接着
$ strace nginx
用--with-debug
编译的nginx可以进一步--with-debug
。 通过运行检查它:
nginx -V 2>&1 | grep -- '--with-debug' # no output if not debug
另一个默认编译好的模块是: HttpStubStatusModule 。 很可能,任何体面的设置都需要一个定制编译的nginx(使用发行版的打包工具的高度推荐的包装)。
这些大多数不适合生产使用,如果你需要更多的统计资料,可以看看用gperf编译nginx。
看起来你正在debugging一个高stream量的网站。
使用debug
with debug_connection
指令,所以nginx错误日志将只显示来自IP的debugging日志。
一旦你开始看到一些有用的错误日志而不是激活整个nginxconfiguration的debugging选项,添加一个单独的error_log /path/to/some/file/ debug;
负责reverse_proxy连接的location {..}
块中的指令。
这样,您将能够从您的IP隔离debugging错误日志。
尝试将其与您正在制作的请求(从您的浏览器)联系起来。
例如,请检查: http : //rtcamp.com/tutorials/debugging-nginx-configuration/
提前一级,可以使用Nginx的HttpEchoModule
我从来没有发现Nginx是一个瓶颈,在大多数情况下,它比后端更有能力。 但是,如果你没有Nginx的testing,发现没有错误,那么它将是(或两者):
没有看到你的Nginxconfiguration,没有人可以评论前者。 没有合适的操作系统输出,没有人可以对后者发表评论。