如何进一步debuggingnginx比错误日志?

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

我有一个前端服务器运行nginx作为我的后端服务器的代理,但它只是connect() failed (110: Connection timed out) while connecting to upstream错误时得到一堆connect() failed (110: Connection timed out) while connecting to upstream 。 他们的吨。 如果我绕过代理服务器连接到后端,我可以运行该网站就好了,所以我知道这是在反向代理的地方。 但是,我不知道如何确定它为什么会超时。

任何帮助?

在CentOS 6.2上运行nginx 1.2.3

我假设你已经把你的Nginx错误日志logging级别debugging起来了。 如果没有,从那里开始。

您最好的select可能是使用strace来查看Nginx所做的系统调用。 特别是,你要注意connect()调用,并留意这些返回码( man 2 connect可以是你的朋友在这里)。

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

除非你想要放入dtrace探针,否则它不会比这更迂腐。

  1. 设置debugging日志级别:/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 

--with-debug编译的nginx可以进一步--with-debug 。 通过运行检查它:

  nginx -V 2>&1 | grep -- '--with-debug' # no output if not debug 

另一个默认编译好的模块是: HttpStubStatusModule 。 很可能,任何体面的设置都需要一个定制编译的nginx(使用发行版的打包工具的高度推荐的包装)。

这些大多数不适合生产使用,如果你需要更多的统计资料,可以看看用gperf编译nginx。

看起来你正在debugging一个高stream量的网站。

使用debug with debug_connection指令,所以nginx错误日志将只显示来自IP的debugging日志。

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

这样,您将能够从您的IP隔离debugging错误日志。

尝试将其与您正在制作的请求(从您的浏览器)联系起来。

例如,请检查: http : //rtcamp.com/tutorials/debugging-nginx-configuration/

提前一级,可以使用Nginx的HttpEchoModule

我从来没有发现Nginx是一个瓶颈,在大多数情况下,它比后端更有能力。 但是,如果你没有Nginx的testing,发现没有错误,那么它将是(或两者):

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

没有看到你的Nginxconfiguration,没有人可以评论前者。 没有合适的操作系统输出,没有人可以对后者发表评论。