Назад | Перейти на главную страницу

Периодические обрывы соединения между Nginx и uWSGI

Мой сайт Django размещен на Nginx / uWSGI. Время от времени сайт становится недоступным на период от нескольких минут до нескольких часов. Он просто возвращает 500 после долгого ожидания.

Когда это происходит, я могу видеть сообщения харакири в журнале uWSGI. Запросы не доходят до приложения Django (пробовал отладку). Вместо этого я получаю ошибки в журнале Nginx:

2016/12/03 01:18:40 [error] 1330#0: *363441461 upstream timed out (110: Connection timed out) while reading response header from upstream, client: <ip address>, server: site.com, request: "GET / HTTP/1.1", upstream: "uwsgi://unix:///var/run/uwsgi/app/site/socket", host: "site.com", referrer: "<page url>"
2016/12/03 01:19:27 [error] 1330#0: *363441461 upstream timed out (110: Connection timed out) while reading response header from upstream, client: <ip address>, server: site.com, request: "GET / HTTP/1.1", upstream: "uwsgi://unix:///var/run/uwsgi/app/site/socket", host: "site.com", referrer: "<page url>"
2016/12/03 01:20:15 [error] 1330#0: *363441461 upstream prematurely closed connection while reading response header from upstream, client: <ip address>, server: site.com, request: "GET / HTTP/1.1", upstream: "uwsgi://unix:///var/run/uwsgi/app/site/socket:", host: "site.com", referrer: "<page url>"

В логах uWSGI я вижу такие сообщения:

Sat Dec  3 01:19:00 2016 - HARAKIRI [core 2] <ip address> - GET / since 1480727890
Sat Dec  3 01:20:15 2016 - HARAKIRI [core 2] <ip address> - GET / since 1480727999
Sat Dec  3 01:20:32 2016 - HARAKIRI [core 0] <ip address> - GET / since 1480727937

Sat Dec  3 05:04:15 2016 - uwsgi_response_write_headers_do(): Broken pipe [core/writer.c line 238] during GET / (<ip address>)

Похоже, сообщения uwsgi зависят от значения харакири. Я не могу быть уверен, потому что проблема в сильно загруженном производственном сервере, и я не могу провести достаточно экспериментов. Я установил harakiri 15 в последний раз это произошло, и теперь я не могу вернуть предыдущее значение 40 потому что сайт снова зависает.

Настройки Nginx:

uwsgi_read_timeout 30;
limit_conn addr 100;

location ^~ / {
    limit_conn session 5;
    limit_req zone=session_req burst=5;

    proxy_set_header X-Forwarded-Proto $scheme;
    uwsgi_pass unix:///var/run/uwsgi/app/site/socket;
    include uwsgi_params;
    uwsgi_param UWSGI_SCHEME $scheme;
}

Настройки uWSGI:

module = deploy.wsgi:application
master
processes = 10
threads = 5
listen = 3072
thunder-lock
cpu-affinity = 1

reload-on-rss = 200
harakiri = 15
reload-mercy = 20
py-autoreload = 0
vacuum

В чем проблема и как ее исправить?

Есть какие-нибудь зацепки до харакири? возможно, вы слишком часто нажимаете reload-on-rss? При этом я раньше сталкивался с загадочными блокировками процессов с помощью uwsgi, и мы так и не поняли проблему, в конце концов, хорошим рабочим решением было просто перейти на Gunicorn. мы никогда не оглядывались назад.