Как автоматически перезапустить Nginx, когда он выходит из строя

Вопрос или проблема

Я развернул свое приложение на 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 — это удобный инструмент для мониторинга процесса. Настройка довольно проста:

  1. Установите monit с помощью команды:

    apt install monit
  2. Создайте конфигурационный файл для 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"
  3. После этого перезапустите monit для применения изменений.

Этот подход позволит monit автоматически следить за состоянием процесса Nginx и перезапускать его при необходимости.

Конфигурация systemd

systemd может автоматически перезапускать services:

  1. Откройте конфигурацию юнита Nginx с помощью:

    systemctl edit nginx
  2. Добавьте следующие строки:

    [Service]
    Restart=always
    RestartSec=5s
  3. Сохраните и перезагрузите конфигурацию демонов:

    sudo systemctl daemon-reload
  4. Проверьте работу, убив процесс Nginx, и убедитесь, что он автоматически перезапущен.

Авто Масштабируемость

AWS Auto Scaling Groups позволяют управлять целыми экземплярами EC2:

  1. Создайте Auto Scaling Group с минимальным и максимальным количеством экземпляров 1.
  2. Настройте health check, направленный на ресурс на вашем сервере Nginx, чтобы система могла определить, живой ли экземпляр.
  3. При обнаружении "нездорового" состояния, группа автоматически убивает старый экземпляр и поднимает новый.

Применение

  1. Выбор подхода. Для простых окружений локального хостинга monit и systemd предоставляют быструю и эффективную автоматизацию. Для облачных решений целесообразнее рассмотреть возможность использования Auto Scaling.

  2. Диагностика проблем. Хотя автоматизация перезапуска помогает, важно исследовать причины падения Nginx. Логирование и мониторинг могут помочь выявить и решить коренные проблемы.

  3. Тестирование. Убедитесь, что автоматизация работает корректно, проведя тесты, аналогично тем, что описаны в примерах использования systemd.

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

Оцените материал
Добавить комментарий

Капча загружается...