Как перезапустить nginx только после успешного завершения теста конфигурации в Ubuntu?

67

Когда я перезапускаю службу nginx в командной строке на сервере ubuntu, служба аварийно завершает работу, когда файл конфигурации nginx имеет ошибки. На многосайтовом сервере это удаляет все сайты, даже те, которые не имеют ошибок конфигурации.

Чтобы предотвратить это, сначала запустите тест конфигурации nginx:

nginx -t

после успешного выполнения теста, я могу перезапустить службу

/etc/init.d/nginx restart

или перезагружать конфигурации сайта nignx без перезагрузки

nginx -s reload

Есть ли способ объединить эти две команды, где команда перезагрузки является условной для результата теста конфигурации?

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

Я использую nginx v1.1.19

Любая помощь по этому поводу оценивается.

  • 0
    Как насчет небольшого сценария оболочки, который проверяет состояние возврата nginx -t (с $?), А затем выполняет перезапуск в зависимости от состояния возврата?
Теги:
nginx
command-line

6 ответов

36
Лучший ответ

На самом деле, насколько я знаю, nginx покажет пустое сообщение, и на самом деле он не перезапустится, если конфигурация плохая, единственный способ ее испортить - сделать nginx-стоп, а затем начать снова, но не запускается.

  • 1
    О какой версии nginx вы говорите? Я работаю с v 1.1.19, и он будет пытаться перезапустить независимо от каких-либо ошибок в файлах конфигурации. Он сообщит мне, что есть проблема, но к тому времени уже слишком поздно
  • 5
    Хорошо, я только что проверил, у моего ноутбука nginx 1.2, и он работал, как я описал, у моего VPS 1.1.19, как у вас, и он сделал то же самое, что вы описали в своем вопросе. Так что я думаю, что это было сделано в 1.2
Показать ещё 4 комментария
37

Как и в случае nginx 1.8.0, правильное решение

sudo nginx -t && sudo service nginx reload

Обратите внимание, что из-за ошибки configtest всегда возвращает нулевой код выхода, даже если файл конфигурации имеет ошибку.

  • 3
    nginx -t && sudo nginx -s перезагрузить
  • 3
    @MechanisM: nginx -t без sudo почти наверняка потерпит неудачу из-за ошибок разрешения.
Показать ещё 1 комментарий
35

Я использую следующую команду для перезагрузки Nginx (версия 1.5.9), только если тест конфигурации был успешным:

/etc/init.d/nginx configtest && sudo /etc/init.d/nginx reload

Если вам нужно делать это часто, вы можете использовать псевдоним. Я использую следующее:

alias n='/etc/init.d/nginx configtest && sudo /etc/init.d/nginx reload'

Трюк здесь делается с помощью && который выполняет только вторую команду, если первая была успешной. Вы можете увидеть здесь более подробное объяснение использования "&&" Оператор.

Вы можете использовать "перезапуск" вместо "перезагрузки", если вы действительно хотите перезапустить сервер.

  • 0
    Остерегайтесь nginx 1.4.2 Я обнаружил, что pkill -1 nginx (фактически то, что делает моя перезагрузка init.d / nginx), НЕ перезагружается, если конфигурация завершается неудачно и ошибочно возвращает успешное завершение. Проверьте свои собственные версии.
  • 2
    Это не работает для меня. Обе команды выполняются, даже если тест не пройден.
Показать ещё 1 комментарий
4
alias nginx.start='sudo nginx -c /etc/nginx/nginx.conf'
alias nginx.stop='sudo nginx -s stop'
alias nginx.reload='sudo nginx -s reload'
alias nginx.config='sudo nginx -t'
alias nginx.restart='nginx.config && nginx.stop && nginx.start'
alias nginx.errors='tail -250f /var/logs/nginx.error.log'
alias nginx.access='tail -250f /var/logs/nginx.access.log'
alias nginx.logs.default.access='tail -250f /var/logs/nginx.default.access.log'
alias nginx.logs.default-ssl.access='tail -250f /var/logs/nginx.default.ssl.log'

а затем используйте команды "nginx.reload" и т.д.

2

Вы можете использовать сигналы для управления nginx.

В соответствии с документацией вам необходимо отправить сигнал HUP в мастер-процесс nginx.

HUP - изменение конфигурации, поддержание измененного часового пояса (только для FreeBSD и Linux), запуск новых рабочих процессов с новой конфигурацией, изящное закрытие старых рабочих процессов

Проверьте документацию здесь: http://nginx.org/en/docs/control.html

Вы можете отправить сигнал HUP в PID процесса nginx следующим образом:

kill -HUP $( cat /var/run/nginx.pid )

Приведенная выше команда считывает pID nginx из /var/run/nginx.pid. По умолчанию nginx pid записывается в /usr/local/nginx/logs/nginx.pid, но это может быть переопределено в config. Проверьте nginx.config, чтобы увидеть, где он сохраняет PID.

1

По крайней мере, на Debian запуск nginx script имеет функцию перезагрузки, которая делает:

reload)
  log_daemon_msg "Reloading $DESC configuration" "$NAME"
  test_nginx_config
  start-stop-daemon --stop --signal HUP --quiet --pidfile $PID \
   --oknodo --exec $DAEMON
  log_end_msg $?
  ;;

Кажется, что все, что вам нужно сделать, это вызвать service nginx reload вместо restart, так как он вызывает test_nginx_config.

  • 0
    service nginx reload не даст никаких указаний относительно того, была ли конфигурация проверена или нет, или была ли она перезагружена или нет.
  • 0
    Что тогда делает test_nginx_config в этом случае?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню