Мой сайт 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. мы никогда не оглядывались назад.