Я развернул свое приложение на 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)