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

Как автоматически перезапустить Nginx при его отключении

Я развернул свое приложение на AWS EC2 и хочу реализовать автоматизацию, при которой, если я перезапущу свой экземпляр или когда веб-сервер Nginx не работает, он перезапустится сам. Я действительно не знаю, с чего начать.

Я слышал, что могу использовать crontab для планирования автоматического мониторинга, и если он не работает, он может отправлять оповещения по электронной почте и перезапускать веб-сервер.

Это особенность SystemD. Переопределите существующий файл модуля для NGINX, запустив systemctl edit nginx затем вставьте:

[Service]
Restart=always

Сохранить.

Если NGINX не работает из-за, например, убийца OOM, он будет перезапущен после смерти. Если у вас возникла ошибка конфигурации в NGINX, он, конечно же, не будет перезапущен.

Чтобы проверить эту конфигурацию. запустить службу NGINX с systemctl start nginxи убедитесь, что он работает с systemctl status nginx.

Убить его через pkill -f nginx. Убедитесь, что NGINX все равно работает с systemctl status nginx.

Используйте monit для решения подобных ситуаций.

apt install monit

nano /etc/monit/conf.d/nginx.conf

Поместите содержимое ниже в этот файл и перезапустите monit

check process nginx with pidfile /var/run/nginx.pid
start program = "/usr/sbin/service nginx start"
stop program = "/usr/sbin/service nginx stop"

У вас уже есть много ответов, как это сделать, но я бы исследовал, что происходит, в первую очередь, чтобы заставить его отключиться, и исправить это.

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

На самом деле это довольно просто

Перейдите в / lib / systemd / system. Создайте резервную копию вашего модуля ngnix systemd (на всякий случай) с помощью sudo cp ngnix.service ngnix.service.old

Добавьте следующие 2 строки в конец служебного блока в ngnix.service

Restart=on-failure
RestartSec=5s

Загрузите новую конфигурацию с помощью sudo systemctl daemon-reload

Для проверки - давайте попробуем убить ngnix

cat /var/run/nginx.pid даст вам PID

sudo kill -9 PID убьет nginix

Вы обнаружите, что если вы проверите PID, будет другой PID. Если бы вы не запустили эти строки, завершение работы ngnix привело бы к неработающему серверу. Это будет только запускать перезапуск при некорректном завершении работы

Если вы хотите перезапустить процесс, как вы сказали в заголовке вопроса, все остальные ответы кажутся отличными. Если вы хотите перезапустить экземпляр, как вы сказали в теле вопроса, вы можете использовать группу автоматического масштабирования.

Настройте группу автоматического масштабирования с минимальным и максимальным 1 экземпляром и укажите для проверки работоспособности контент, обслуживаемый вашим веб-сервером Nginx (в идеале, что-то, что не потребляет много ресурсов ЦП, например robots.txt). Группа автоматического масштабирования обнаружит, когда ваш экземпляр неисправен (может потребоваться 3 или 5 неудачных проверок работоспособности), и убьет экземпляр и запустит новый.

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

Если ваш дистрибутив основан на systemd вы можете использовать пример сценария, подобный этому, для запуска демона, если он не запущен / умер

#!/bin/bash
systemctl is-active nginx
if [ "$?" -ne 0 ]
then systemctl start nginx
mail....... #send some mail
fi

запись в cron должна быть примерно такой

*/5 * * * * /path/to/the/script

И это должно быть запущено как root (root cron)