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