Когда я перезапускаю службу nginx в командной строке на сервере ubuntu, служба аварийно завершает работу, когда файл конфигурации nginx имеет ошибки. На многосайтовом сервере это удаляет все сайты, даже те, которые не имеют ошибок конфигурации.
Чтобы предотвратить это, сначала запустите тест конфигурации nginx:
nginx -t
после успешного выполнения теста, я могу перезапустить службу
/etc/init.d/nginx restart
или перезагружать конфигурации сайта nignx без перезагрузки
nginx -s reload
Есть ли способ объединить эти две команды, где команда перезагрузки является условной для результата теста конфигурации?
Я не мог найти это в Интернете, а официальная документация была довольно простой. Я не очень хорошо разбираюсь в Linux, поэтому я не знаю, действительно ли то, что я ищу, прямо перед собой или вообще невозможно.
Я использую nginx v1.1.19
Любая помощь по этому поводу оценивается.
На самом деле, насколько я знаю, nginx покажет пустое сообщение, и на самом деле он не перезапустится, если конфигурация плохая, единственный способ ее испортить - сделать nginx-стоп, а затем начать снова, но не запускается.
Как и в случае nginx 1.8.0, правильное решение
sudo nginx -t && sudo service nginx reload
Обратите внимание, что из-за ошибки configtest
всегда возвращает нулевой код выхода, даже если файл конфигурации имеет ошибку.
nginx -t
без sudo почти наверняка потерпит неудачу из-за ошибок разрешения.
Я использую следующую команду для перезагрузки 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'
Трюк здесь делается с помощью && который выполняет только вторую команду, если первая была успешной. Вы можете увидеть здесь более подробное объяснение использования "&&" Оператор.
Вы можете использовать "перезапуск" вместо "перезагрузки", если вы действительно хотите перезапустить сервер.
pkill -1 nginx
(фактически то, что делает моя перезагрузка init.d / nginx), НЕ перезагружается, если конфигурация завершается неудачно и ошибочно возвращает успешное завершение. Проверьте свои собственные версии.
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" и т.д.
Вы можете использовать сигналы для управления 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.
По крайней мере, на 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
.
service nginx reload
не даст никаких указаний относительно того, была ли конфигурация проверена или нет, или была ли она перезагружена или нет.
test_nginx_config
в этом случае?