如何在错误日志之外进一步调试 nginx?

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 探针,否则没有比这更迂腐的了:

  1. 设置调试日志级别:/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)
  2. 在另一个窗口中设置 tcpdump:

    tcpdump not port 22 -vvv -s0 -q -XXX
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在另一个窗口中监控日志文件:

    tail -f /var/log/nginx/*
    
    Run Code Online (Sandbox Code Playgroud)
  4. 使用 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可以在这里成为您的朋友)。

获得该信息后,您可以更好地猜测问题是否仅限于您的前端代理,或者与代理和后端应用程序服务器之间的交互有关。


rah*_*286 5

看起来您正在调试一个高流量站点。

使用debugdebug_connection指令一起因此 nginx 错误日志将仅显示来自您 IP 的调试日志。

一旦您开始看到一些有用的错误日志而不是为整个 nginx 配置激活调试选项,请error_log /path/to/some/file/ debug;location {..}负责 reverse_proxy 连接的块中添加一个单独的指令。

通过这种方式,您将能够仅将调试错误日志与您的 IP 隔离。

尝试将其与您(从您的浏览器)发出的请求相关联。

例如,请检查: https //easyengine.io/tutorials/nginx/debugging/

领先一级,可以使用 Nginx 的HttpEchoModule