我目前正在接收相当大的 HTTP 洪水,这导致我的 nginx 反向代理产生 502 错误网关。
我有一个前端服务器,它运行 nginx 作为后端服务器的代理,但它总是收到一堆connect() failed (110: Connection timed out) while connecting to upstream
错误。很多错误。如果我绕过代理服务器连接到后端,我可以正常运行网站,所以我知道它在反向代理的某个地方。但是,我不知道如何确定它超时的原因。
有什么帮助吗?
在 CentOS 6.2 上运行 nginx 1.2.3
答案1
我假设您已经将 Nginx 错误日志记录级别提升至调试级别。如果没有,请从那里开始。
最好的办法可能是使用strace
查看 Nginx 进行的系统调用。特别是,您需要关注connect()
调用,并留意这些调用的返回代码(man 2 connect
这里可以成为您的朋友)。
一旦您掌握了这些信息,您就可以更好地做出有根据的猜测,判断问题是否仅限于前端代理,或者与代理和后端应用程序服务器之间的交互有关。
答案2
除非你想放入 dtrace 探测器,否则它不会比这更复杂:
设置调试日志级别:/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
可以使用编译的 nginx 进行进一步调试--with-debug
。运行以下命令检查:
nginx -V 2>&1 | grep -- '--with-debug' # no output if not debug
另一个默认情况下未编译的好模块是:HttpStubStatus模块. 最有可能的是,任何像样的设置都需要自定义编译的 nginx(强烈建议使用发行版的打包工具进行打包)。
其中大多数不适合生产使用,如果您需要更多统计数据,请查看使用 gperf 编译 nginx。
答案3
看起来您正在调试一个高流量的网站。
使用debug
指令debug_connection
,因此 nginx 错误日志将仅显示来自您的 IP 的调试日志。
一旦您开始看到一些有用的错误日志,而不是激活整个 nginx 配置的调试选项,请在负责 reverse_proxy 连接的块error_log /path/to/some/file/ debug;
中添加一个单独的指令。location {..}
这样,您将能够仅从您的 IP 隔离调试错误日志。
尝试将其与您发出的请求(从您的浏览器)联系起来。
例如,请检查:https://easyengine.io/tutorials/nginx/debugging/
更进一步,你可以使用 Nginx 的HttpEcho模块
答案4
我从未发现 Nginx 是瓶颈,在大多数情况下,它比后端更有能力。但是,如果您在没有 Nginx 的情况下进行测试并且没有发现错误,那么它可能是以下任一原因(或两者兼而有之):
- Nginx 配置问题
- 上行超时值错误
- 上游探测 URL 错误
- 工人太少
- ETC。
- 操作系统 TCP/IP 瓶颈
- 可能是代理本身导致打开端口和状态重复。无论是文件描述符、端口、TCP 连接
如果没有看到你的 Nginx 配置,那么没人能对前者发表评论。如果没有操作系统的合适输出,那么没人能对后者发表评论。