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

Перезапуск бэкэндов nginx без потери запросов

Я уверен, что раньше об этом спрашивали другими словами, но я запускаю несколько сайтов Django через uwsgi (режим emporer) за nginx. Все это довольно стандартная конфигурация, но я обнаружил, что если я перезапущу центральный процесс uwsgi, nginx просто выйдет из строя 502, вместо того, чтобы ждать, пока сокет станет доступным.

Я понимаю, что в большинстве случаев это происходит не просто так, но люди, которые видят ошибку 502, действительно меня задевают. Это определенно не то, что я хочу, чтобы клиент увидел. Так...

Одна из идей - заменить шаблон 502 по умолчанию nginx на страницу, которая автоматически обновляет клиент. По сути, вам просто нужно создать новый файл с <meta http-equiv="refresh" content="5"> в шапке. Дайте ему какой-нибудь понятный текст, объясняя, что сайт в настоящее время находится на обслуживании (или какой-то эквивалент BS), и дайте ссылку на него из вашей конфигурации nginx:

error_page 502  /502.html;  
location = /502.html {  
    root  /var/www/502.html;  
}

Вам это понадобится на всех ваших сайтах (может быть способ сделать это глобально), но в результате любой, кто увидит тайм-аут шлюза, теперь увидит страницу, которая не выглядит особенно странной и через пять секунд будет поместите их на страницу, которую они изначально хотели.

Все это предполагает, что серверная часть вернется. Если есть вероятность, что он будет отключен на неопределенный срок, вы можете написать что-нибудь в JS, которое проверяет сам URL и имеет счетчик повторов. Все довольно просто, но может успокоить клиентов, которых раздражает неработающий сайт.

Просто мысль, не проверенная и не уверенная, если возможно:

Что, если вы настроите несколько вышестоящих серверов в nginx, которые все указывают на один и тот же экземпляр uWSGI. Если nginx не может связаться с uwsgi, он отправит запрос следующему апстриму (помогает ли здесь директива proxy_next_upstream?), Что на самом деле то же самое, но может быть уже запущено.