除了错误日志,我该如何调试Nginx?


34

我目前正在收到相当大的HTTP洪水,这导致我的Nginx反向代理产生502错误网关。

我有一个运行nginx的前端服务器作为我的后端服务器的代理,但是这只是一堆connect() failed (110: Connection timed out) while connecting to upstream错误。他们吨。如果我绕过代理服务器连接到后端,则可以正常运行该站点,因此我知道它位于反向代理服务器中。但是,我不知道如何确定超时的原因。

有什么帮助吗?

在CentOS 6.2上运行nginx 1.2.3


您可以先将Nginx更新到最新版本。虽然,我不知道这样的错误在1.2.3
奔Lessani - Sonassi

2
....然后看看什么是从NGINX撤消连接的方法
symcbean 2012年

您的后端服务器是什么?Nginx提供的错误实际上来自后端时,我一直被错误弄糊涂。在这里似乎情况并非如此,但是您需要使用更多详细信息来更新您的问题。
jeffatrackaid 2012年

另外,您是否通过专用/公共网络连接到后端?代理的IP是否在任何防火墙,ddos或其他IP /速率限制类型工具中列入白名单?后端服务器上的netstat是什么样的?打开了多少个连接?后端的MaxClients是什么?你累死了吗?
jeffatrackaid 2012年

Answers:


19

我假设您已经提高了Nginx错误记录级别以进行调试。如果没有,从那里开始。

您最好的选择可能是strace用来查看Nginx进行的系统调用。特别是,您将需要注意connect()呼叫,并留意这些呼叫的返回代码(man 2 connect在这里可以成为您的朋友)。

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


37

除非您想放入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

另一个默认未编译的好的模块是:HttpStubStatusModule。在任何可能的情况下,任何体面的设置都需要定制编译的nginx(使用Distro的打包工具进行高度推荐的打包)。

其中大多数不适合生产使用,如果需要更多统计信息,请考虑使用gperf编译nginx。


在第2步中,以下内容对我有用:tcpdump -i any not port 22 -vvv -s0 -q -XXX
ccppjava '16

5

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

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

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

这样,您将只能从IP隔离调试错误日志。

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

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

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


2

我从来没有发现Nginx成为瓶颈,在大多数情况下,Nginx比后端要强大得多。但是,如果您在没有Nginx的情况下进行测试并且没有发现错误,那么它将是(或两者):

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

没有看到您的Nginx配置,没有人可以评论前者。而且,如果没有OS的适当输出,则没有人可以评论OS。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.