3

我们正在两个 NGINX 示例 Web 服务器前使用 NGINX 作为反向代理进行一些测试。我们测试中使用的工具是wrk。Web 服务器的配置非常简单。它们每个都有一个静态页面(类似于默认的欢迎页面),NGINX 代理以循环方式引导流量。测试的目的是测量带有 NGiNX 反向代理的不同操作系统对结果的影响(我们正在使用 CentOS 7、Debian 10 和 FreeBSD 12 进行此测试)在我们的结果中,(FreeBSD 除外)我们有很多非-2xx 或 3xx 内部错误:

      10 threads and 400 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    74.50ms  221.36ms   1.90s    91.31%
    Req/Sec     5.88k     4.56k   16.01k    43.96%
  Latency Distribution
     50%    4.68ms
     75%    7.71ms
     90%  196.01ms
     99%    1.03s 
  3509526 requests in 1.00m, 1.11GB read
  Socket errors: connect 0, read 0, write 0, timeout 875
  Non-2xx or 3xx responses: 3285230
Requests/sec:  58431.20
Transfer/sec:     18.96MB

如您所见,大约 90% 的回复属于此类别。我在 NGINX 日志记录上尝试了几种不同的配置来“捕获”其中一些错误。但我得到的只是200 OK在日志中。如何获得有关这些回复的更多信息?

4

3 回答 3

1

502 表示代理无法连接到后端。这可能是由于代理或后端服务器上的资源耗尽所致。如果你的 CPU 没有饱和,你很可能会处理一些人为的内核限制。我已经看到文件描述符、TCP 连接、接受队列、防火墙跟踪的连接导致了这种情况。dmesg 有时有有用的日志。

通常将keepalive连接添加到后端会有所帮助:https ://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive

于 2020-12-30T21:54:23.753 回答
1

尝试这样的事情......

response = function(status, headers, body)
  if status ~= 200 then
    io.write("Status: ".. status .."\n")
    io.write("Body:\n")
    io.write(body .. "\n")
  end
end
于 2021-07-30T21:22:49.567 回答
0

经过一番研究,我能够在代理节点上使用tcpdump跟踪这一点,如下所示:

在代理上运行 wrk 后,我运行 tcpdump,如下所示:

tcpdump -i ens192 port 80 -nn

结果——尽管相当大——有一些有趣的见解:

10:53:33.317363 IP x.x.x.x.80 > y.y.y.y.28375: Flags [P.], seq 389527:389857, ack 37920, win 509, options [nop,nop,TS val 825684835 ecr 679917942], length 330: HTTP: HTTP/1.1 502 Bad Gateway

我在 nginx 日志中看不到错误的原因是,在反向代理模式日志记录中,ngnix 只会在调试模式下记录结果,这本身会使处理变得如此缓慢,以至于无法显示上述错误。使用 tcpdump,我可以找出数据包内部的问题。

于 2020-12-30T07:34:49.673 回答