使用 Gunicorn 对 Django-App 发出 100 个并发请求会导致“54:对等方重置连接”和 502

使用 Gunicorn 对 Django-App 发出 100 个并发请求会导致“54:对等方重置连接”和 502

我托管了一个用作 API 端点的 Django 应用。不幸的是,使用该 API 的应用在页面加载时会发出大量并发请求(大约 80-90 个请求)。

Nginx 作为 gunicorn 前面的反向代理运行,并报告以下问题: kevent() reported that connect() failed (54: Connection reset by peer) while connecting to upstream

这促使我扩展 gunicorn。我尝试-k gevent增加--worker-connections,但效果不大。我使用--threads和 sync-workers 也取得了同样的成功。

Listen queue overflow: 16 already in queue awaiting acceptance (55 occurrences)我注意到出现了几次dmesg,这导致我将kern.ipc.somaxconn其增加到 4096,但同样:没有成功。

根据 gunicorn 文档,我用hey它来查看代理是否执行正确的事情并对端点进行负载测试: hey -c 100 -n 200 -H "Authorization: token ${token}" 'https://example.com/api/'

它返回的结果大致如下(有时好一点,有时差一点):

Status code distribution:
  [200] 126 responses
  [502] 74 responses

相关 nginx 配置:

worker_processes  auto;

events {
    worker_connections  1024;
    accept_mutex on;
    use kqueue;
}

upstream backend-api {
  server 127.0.0.1:8000 fail_timeout=0;
}

server {
    listen 443 ssl http2 accept_filter=httpready;
    server_name example.com;

    ssl_certificate /usr/local/etc/nginx/sites/example.com.crt;
    ssl_certificate_key /usr/local/etc/nginx/sites/example.com.key;

    location = /favicon.ico { access_log off; log_not_found off; }
    root /usr/local/www/example.com/web;
    index index.html ;

    keepalive_timeout 5;

    location ~  ^/(static|assets|index.html|$) {
        root /usr/local/www/example.com/web;
    }

    location / {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header X-Forwarded-Host $http_host;
      proxy_set_header X-Real-IP $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_redirect off;
      proxy_intercept_errors on;
      proxy_pass http://backend-api;
    }
}

使用以下命令运行 gunicorn: gunicorn --workers=9 --bind 0.0.0.0:8000 --forwarded-allow-ips='*' -k gevent --worker-connections=1000 api.wsgi'

我似乎找不到解决办法。无论我怎么尝试,页面加载时 502 错误都只会“较少”,但永远无法完全消除。我遗漏了什么?

Gunicorn 没有报告任何问题 - 请求似乎从来没有到达那么远。

相关内容