我目前正在接收相当大的 HTTP 泛洪,它导致我的 nginx 反向代理生成 502 Bad Gateway。
我有一个前端服务器运行 nginx 作为我的后端服务器的代理,但它只是收到一堆connect() failed (110: Connection timed out) while connecting to upstream
错误。很多。如果我绕过代理服务器连接到后端,我可以很好地运行网站,所以我知道它在某个地方的反向代理中。但是,我不知道如何确定它超时的原因。
有什么帮助吗?
在 CentOS 6.2 上运行 nginx 1.2.3
除非您想放入 dtrace 探测器,否则没有比这更迂腐的了:
设置调试日志级别:/etc/nginx/nginx.conf:
在另一个窗口中设置 tcpdump:
在另一个窗口中监视日志文件:
使用 strace 交互启动 nginx:
接着
可以使用用
--with-debug
. 通过运行检查它:另一个默认不编译的好模块是:HttpStubStatusModule。很可能,任何体面的设置都需要自定义编译的 nginx(强烈推荐使用发行版的打包工具进行打包)。
其中大部分不适合生产使用,如果您需要更多统计信息,请查看使用 gperf 编译 nginx。
我假设您已经将 Nginx 错误日志记录级别提高到调试级别。如果没有,从那里开始。
你最好的选择可能是
strace
用来查看 Nginx 进行的系统调用。特别是,您需要注意connect()
电话,并留意这些电话的返回码(man 2 connect
可以是您的朋友)。获得该信息后,您可以更好地猜测问题是否仅限于您的前端代理,或者与代理和后端应用程序服务器之间的交互有关。
看起来您正在调试高流量站点。
使用
debug
withdebug_connection
指令,这样 nginx 错误日志将仅显示来自您的 IP 的调试日志。一旦您开始看到一些有用的错误日志而不是激活整个 nginx 配置的调试选项,请在负责 reverse_proxy 连接
error_log /path/to/some/file/ debug;
的块中添加一个单独的指令。location {..}
通过这种方式,您将能够仅从您的 IP 中隔离调试错误日志。
尝试将它与您正在发出的请求(从您的浏览器)联系起来。
例如,请查看:https ://easyengine.io/tutorials/nginx/debugging/
更进一步,你可以使用 Nginx 的HttpEchoModule
我从来没有发现 Nginx 是瓶颈,在大多数情况下,它比后端更强大。但是如果你在没有 Nginx 的情况下进行测试并且没有发现错误,那么它将会是其中之一(或两者):
没有看到你的 Nginx 配置,没有人可以评论前者。如果没有来自操作系统的合适输出,没有人可以对后者发表评论。