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


111

Коли я перезапускаю службу nginx в командному рядку на сервері Ubuntu, служба виходить з ладу, коли у файлі конфігурації nginx є помилки. На сервері з кількома сайтами це відкладає всі сайти, навіть ті, що не мають помилок конфігурації.

Щоб запобігти цьому, спершу запускаю тест конфігурації nginx:

nginx -t

Після того, як тест пройшов успішно, я міг перезапустити службу:

/etc/init.d/nginx restart

Або лише перезавантажте конфігурації сайту nignx без перезавантаження:

nginx -s reload

Чи є спосіб поєднати ці дві команди, коли команда перезавантаження обумовлена ​​результатом тесту конфігурації?

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

Я використовую nginx v1.1.19.


А що з невеликим скриптом оболонки, який перевіряє стан повернення nginx -t (з $?), А потім проводить перезавантаження залежно від стану повернення?
TeTeT

Відповіді:


49

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

Єдиний спосіб викрутити це - зробити зупинку nginx, а потім почати заново. Це вдалося б зупинитися, але не вдалося почати.


1
Про яку версію nginx ви говорите? Я працюю з v 1.1.19, і він спробує перезапустити незалежно від помилок у конфігураційних файлах. Він сповістить мене, що є проблема, але до цього часу вже пізно
січня

5
Ок, я просто перевірив це, у мого ноутбука є nginx 1.2, і він працював так, як я описав, мій VPS має 1.1.19, як ваш, і він зробив те саме, що ви описали у своєму запитанні. Тож я здогадуюсь, що це вирішувалося в 1.2
Мохаммед АбуШаді

Чудово! Дякую, що зрозуміли це для мене. Я буду тримати це питання відкритим трохи довше , щоб побачити , якщо ніхто НЕ має відповіді на Nginx <v1.2
січень

1
Я думаю, мені доведеться потім оновити :-) Потрібно виправдання
січня

1
service nginx reloadнічого не показує, правильно було завантажено конфігурацію чи ні, тому марно, якщо ви підозрюєте, що конфігурація може бути неправильним. service nginx restartзупинить сервер, якщо в конфігурації є помилка!
Дан Даскалеску

80

Станом на nginx 1.8.0 правильне рішення

sudo nginx -t && sudo service nginx reload

Зауважте, що через помилку configtestзавжди повертається нульовий код виходу, навіть якщо у конфігураційному файлі є помилка.


3
nginx -t && sudo nginx -s reload
Механізм

5
@MechanisM: nginx -tбез судо майже напевно не вдасться через помилки дозволу.
Дан Даскалеску

Я хотів показати переважно останню частину для перезавантаження. У моєму випадку я власно скомпілював nginx і навіть не маю сценаріїв у /etc/init.d тощо, тому в моєму випадку "сервісне перезавантаження nginx" нічого не зробить
MechanisM

39

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

Трюк тут виконується "&&", який виконує лише другу команду, якщо перша була успішною. Ви можете побачити тут більш докладне пояснення використання «&&» оператора.

Ви можете використовувати "перезапуск" замість "перезавантажити", якщо дійсно хочете перезапустити сервер.


Остерігайтеся nginx 1.4.2. Я виявив pkill -1 nginx(фактично те, що робить перезавантаження init.d / nginx) НЕ перезавантажується, якщо конфігурація не працює і оманливо повертається успішно. Перевірте власні версії.
КХД

2
Це не працює для мене. Обидві команди виконуються, навіть якщо тест не вдався.
Маріо Кампа

2
configtest завжди повертає нульовий код виходу , принаймні, у nginx 1.8.0. Використовуйте nginx -tзамість цього.
Дан Даскалеску

8
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" тощо.


6

Ви можете перезавантажити за допомогою /etc/init.d/nginx reloadтаsudo service nginx reload

Якщо nginx -tвиникла якась помилка, вона не завантажиться

тому використовуйте && для запуску обох одночасно

подібно до

nginx -t && /etc/init.d/nginx перезавантажити


Дозвольте навчити вас чомусь про баш. && does Не run both at a same timeзапускає команду праворуч, якщо команда зліва повертає код виходу 0. Якщо ваша nginx -tпомилка кидає, код виходу не буде 0, тож друга команда не запуститься. Її nginx -s reloadвсе одно
miknik

@miknik Я думаю, що це він хотів сказати, це просто не вийшло правильно. Він каже If nginx -t throws some error then it won't reload. Оператор run both at a same timeтакож може бути інтерпретований як одна команда, або один рядок. Я не трактую його в цьому випадку обов'язково in parallel.
мат

2

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

Згідно з документацією, вам потрібно надіслати сигнал HUP до nginx-мастер-процесу.

HUP - зміна конфігурації, в ногу зі зміненим часовим поясом (лише для FreeBSD та Linux), запуск нових робочих процесів з новою конфігурацією, витончене відключення старих робочих процесів

Перегляньте документацію тут: http://nginx.org/en/docs/control.html

Ви можете надіслати сигнал HUP до PID nginx головного процесу таким чином:

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

Команда вище читає nginx PID з /var/run/nginx.pid. За замовчуванням nginx pid записується в, /usr/local/nginx/logs/nginx.pidале це може бути замінено в config. Перевірте свою інформацію, nginx.configщоб зберегти PID.


1

Принаймні, на Debian скрипт запуску nginx має функцію перезавантаження, яка:

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робити в такому випадку?
Daenney

1
Я думаю, що у вас обох є справа. service nginx reloadдостатньо в командному рядку, однак іноді ви можете захопити вивід більш жорсткого та повернути його до сценарію для усунення несправностей. nginx -tпідкаже, який файл мав недійсний параметр і в якому рядку
анастомічний
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.