
Я размещаю Django-App, который служит API-Endpoint. К сожалению, приложение, которое использует 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-config:
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 не сообщает о каких-либо проблемах — запросы, похоже, никогда не доходят до этого момента.