Nginx反向代理导致上游连接在并发负载testing下被拒绝

让我asume我的环境如下:

  • 客户端(Apache的Jmeter负载testing)
  • nginx(docker container runnning nginx:1.12.2)
  • (Docker容器运行embedded式的wild:群:1.2.9)

目前我正在尝试configurationnginx并承诺允许700个并发用户。

负载testing(客户端)以700个并行线程运行,每个线程执行50个请求。 这个请求将会被返回一个简单的JSON的ows / wildfly-swarm服务。

整个环境运行在我的本地设备(之间没有缓慢的networking)。 docker集装箱在他们自己的dockernetworking中运行,并且容器之间的链接使用docker容器名称(正确地parsingdocker容器IP)。

情况1

[client] --> [undertow]

所有的请求被送达。 运行wildfly / undertow的容器似乎能够服务于负载testing(客户端)的请求。

情景2

[client] --> [nginx] --> [undertow]

用下面的configuration将nginxconfiguration为反向代理

 worker_processes 2; events { worker_connections 1024; use epoll; } http { access_log off; error_log /var/log/nginx/error.log; sendfile on; sendfile_max_chunk 512k; tcp_nopush on; tcp_nodelay on; upstream undertow_upstream { server undertow:8280; } server { server_name nginx; location /rest { proxy_pass http://undertow_upstream; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto http; } } } 

第一个1186请求被送达没有错误。 从这一点上错误率增加到48.13%和nginx错误日志显示

 2017/11/21 15:42:30 [alert] 7#7: 1024 worker_connections are not enough ... 2017/11/21 15:12:36 [error] 7#7: *31778 upstream timed out (110: Connection timed out) while connecting to upstream, client: 192.168.207.1, server: nginx, request: "GET /rest/loadTest/442/31 HTTP/1.1", upstream: "http://<undertow-ip>:8280/rest/loadTest/442/31", host: "hostname.domainname:8060" 

使用worker_connections 4000将错误率降低到8.75%,并且12529的第一个请求是服务器没有错误。 nginx error.log仍然显示连接被拒绝的行。

我可以使用nginx.conf中的以下更改将错误率降低到〜1%

 events { ... accept_mutex off; multi_accept on; ... } upstream undertow_upstream { ... keepalive 32; } location /rest { ... proxy_http_version 1.1; proxy_set_header Connection ""; ... } 

然而,我的感觉是,这会把问题推到更远的地方,而不是解决问题。

任何人都知道如何正确设置nginx反向代理与指定的环境和700并行连接? 为什么worker_connections需要这么高,为什么我得到连接被拒绝的消息?