Подтвердить что ты не робот

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

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

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

nginx -t

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

/etc/init.d/nginx restart

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

nginx -s reload

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 3

Я использую следующую команду для перезагрузки 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'

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

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

Ответ 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" и т.д.

Ответ 5

Вы можете использовать сигналы для управления 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.

Ответ 6

По крайней мере, на 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.