除了错误日志之外,我怎样才能进一步调试 nginx?

除了错误日志之外,我怎样才能进一步调试 nginx?

我目前正在接收相当大的 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 探测器,否则它不会比这更复杂:

  1. 设置调试日志级别:/etc/nginx/nginx.conf:

    ...
    http {
            ...
            error_log /var/log/nginx/error.log debug; # todo testing remove me not for production use
            ...
    }
    
  2. 在另一个窗口中设置 tcpdump:

    tcpdump not port 22 -vvv -s0 -q -XXX
    
  3. 在另一个窗口中监视日志文件:

    tail -f /var/log/nginx/*
    
  4. 使用 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 的情况下进行测试并且没有发现错误,那么它可能是以下任一原因(或两者兼而有之):

  1. Nginx 配置问题
    1. 上行超时值错误
    2. 上游探测 URL 错误
    3. 工人太少
    4. ETC。
  2. 操作系统 TCP/IP 瓶颈
    1. 可能是代理本身导致打开端口和状态重复。无论是文件描述符、端口、TCP 连接

如果没有看到你的 Nginx 配置,那么没人能对前者发表评论。如果没有操作系统的合适输出,那么没人能对后者发表评论。

相关内容