Вопрос или проблема
Я развернул свое приложение на AWS EC2 и хочу реализовать автоматизацию, при которой, если я перезапускаю мой инстанс или если веб-сервер Nginx не работает, он перезапустится автоматически. Я не очень знаю, с чего начать.
Слышал, что могу использовать crontab для создания расписания автоматического мониторинга, и если сервер не работает, можно отправлять уведомления на электронную почту и перезапускать веб-сервер.
Используйте 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"
Это функция SystemD. Переопределите существующий файл unit для NGINX, выполнив systemctl edit nginx
, затем вставьте:
[Service]
Restart=always
Сохраните.
Если NGINX завершает работу из-за, например, OOM killer, он будет перезапущен после сбоя.
Если в NGINX есть ошибка конфигурации, он, конечно, не будет перезапущен.
Чтобы проверить эту конфигурацию, запустите сервис NGINX с помощью systemctl start nginx
и проверьте, что он работает, с помощью systemctl status nginx
.
Убейте его с помощью pkill -f nginx
. Подтвердите, что NGINX все еще работает, с помощью systemctl status nginx
.
Это фактически довольно просто.
Перейдите в /lib/systemd/system
Создайте резервную копию системного блока nginx (на всякий случай) с помощью sudo cp nginx.service nginx.service.old
Добавьте следующие 2 строки в конец блока [Service] в nginx.service
Restart=on-failure
RestartSec=5s
Загрузите новую конфигурацию с помощью sudo systemctl daemon-reload
Для теста попробуем убить nginx
cat /var/run/nginx.pid
даст вам PID
sudo kill -9 PID
убьет nginx
Вы заметите, что если проверить PID, то он будет другим. Если бы вы не запускали эти строки, убийство nginx привело бы к остановке сервера. Это только вызовет перезапуск при незапланированном завершении работы
У вас уже есть много ответов о том, как это сделать, но я бы изучил, что происходит, чтобы он выключался в первую очередь, и исправил это.
Когда nginx выходит из строя, все текущие запросы будут завершены в неизвестном состоянии — файлы наполовину переданы, вызовы API не отвечены. В принципе, приложение, работающее поверх, должно справляться с этим, на практике это редко бывает так, но на этом уровне это проявится как странное и невоспроизводимое поведение, давая людям, использующим сервис, чувство нестабильности (и вполне обоснованно).
Если вы хотите перезапустить процесс, как вы указали в заголовке вопроса, все остальные ответы кажутся отличными. Если вы хотите перезапустить инстанс, как вы сказали в тексте вопроса, вы можете использовать Auto Scaling Group.
Настройте Auto Scaling Group с минимальным и максимальным числом в 1 инстанс и укажите проверку состояния на контент, обслуживаемый вашим веб-сервером Nginx (желательно что-то, что не потребляет много CPU, например, robots.txt). Auto Scaling Group обнаружит, когда инстанс не в порядке (может потребоваться 3 или 5 сбоев проверки состояния) и убьет инстанс и запустит новый.
Имейте в виду, что вы потеряете все состояние, сохраненное в инстансе (поскольку инстанс на самом деле уничтожается). Сохранение состояния внутри сервера — это анти-паттерн в облаках. Вы также потеряете кеши.
Попробовал использовать systemctl edit nginx и вставил эти строки:
RestartSec=5s
Но возникла эта ошибка, и когда nginx завершает работу, он не перезапускается
/etc/systemd/system/nginx.service.d/override.conf:1: Assignment outside of section. Ignoring.
Автоматический перезапуск при авариях для Nginx на обоих продакшн серверах, сервере для тестирования и сервере разработки. Имена серверов:
dev staging prod
Я изменил “/lib/systemd/system/nginx.service” и добавил следующую строку в раздел [Service] в конце -> Restart=on-failure
после изменения конфигурации мы должны выполнить команду ‘systemctl daemon-reload
‘ чтобы настройка авто-перезапуска вступила в силу.
Это должно перезапускать Nginx при его сбое
Если ваша дистрибуция основана на 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)
.
Ответ или решение
Когда речь идет об автоматическом перезапуске веб-сервера Nginx в случае его отключения, важно рассмотреть несколько аспектов, чтобы решить эту задачу эффективно и надежно. В следующем ответе мы рассмотрим несколько подходов к решению этой проблемы, таких как использование monit
, systemd
и Auto Scaling Groups в AWS. Эти методы обеспечивают различные степени контроля и автоматизации, каждое из которых может быть выбрано в зависимости от специфики вашей инфраструктуры и требований к надежности системы.
Теория
Во-первых, важно понять суть проблемы. Nginx может прекратить работу по нескольким причинам, включая, но не ограничиваясь, ошибками конфигурации, нехваткой памяти и другими системными проблемами. Автоматизация перезапуска Nginx при падении переводит внимание с устранения корневой причины на реактивную меру, но она обеспечивает непрерывность обслуживания и минимизацию простоев.
Эффективные инструменты для автоматического мониторинга и управления процессами на уровнях операционной системы сущетсвуют. Один из них — это monit
, который может отслеживать состояния процессов и автоматически их перезапускать. systemd
— это современный менеджер систем и служб на Linux, который предоставляет возможности для автоматического перезапуска служб при их сбоях. Автоскалирование в облачной инфраструктуре, такой как AWS, предлагает возможность перезапуска целых экземпляров виртуальных машин.
Пример
Для каждого из упомянутых подходов представим примеры настройки:
Использование monit
monit
— это удобный инструмент для мониторинга процесса. Настройка довольно проста:
-
Установите
monit
с помощью команды:apt install monit
-
Создайте конфигурационный файл для Nginx в
/etc/monit/conf.d/nginx.conf
и добавьте следующий содержимое:check process nginx with pidfile /var/run/nginx.pid start program = "/usr/sbin/service nginx start" stop program = "/usr/sbin/service nginx stop"
-
После этого перезапустите
monit
для применения изменений.
Этот подход позволит monit
автоматически следить за состоянием процесса Nginx и перезапускать его при необходимости.
Конфигурация systemd
systemd
может автоматически перезапускать services:
-
Откройте конфигурацию юнита Nginx с помощью:
systemctl edit nginx
-
Добавьте следующие строки:
[Service] Restart=always RestartSec=5s
-
Сохраните и перезагрузите конфигурацию демонов:
sudo systemctl daemon-reload
-
Проверьте работу, убив процесс Nginx, и убедитесь, что он автоматически перезапущен.
Авто Масштабируемость
AWS Auto Scaling Groups позволяют управлять целыми экземплярами EC2:
- Создайте Auto Scaling Group с минимальным и максимальным количеством экземпляров 1.
- Настройте health check, направленный на ресурс на вашем сервере Nginx, чтобы система могла определить, живой ли экземпляр.
- При обнаружении "нездорового" состояния, группа автоматически убивает старый экземпляр и поднимает новый.
Применение
-
Выбор подхода. Для простых окружений локального хостинга
monit
иsystemd
предоставляют быструю и эффективную автоматизацию. Для облачных решений целесообразнее рассмотреть возможность использования Auto Scaling. -
Диагностика проблем. Хотя автоматизация перезапуска помогает, важно исследовать причины падения Nginx. Логирование и мониторинг могут помочь выявить и решить коренные проблемы.
-
Тестирование. Убедитесь, что автоматизация работает корректно, проведя тесты, аналогично тем, что описаны в примерах использования
systemd
.
Итак, выбрав подходящий инструмент и настроив его, вы обеспечите безопасность и отказоустойчивость вашего веб-сервера. Эти методы помогут вам свести к минимуму простои и повысить надежность ваших приложений.