Перезагрузка конфигурации Nginx без простоя

123

Я использую nginx в качестве обратного прокси. Всякий раз, когда я обновляю конфиг для него, используя

sudo "cp -r #{nginx_config_path}* /etc/nginx/sites-enabled/"
sudo "kill -s HUP `cat /var/run/nginx.pid`"

Я сталкиваюсь с коротким временем простоя. Как я могу избежать этого?

Саурав Шах
источник
1
Это команды командной строки? Я никогда не видел, чтобы кто-нибудь заключал в кавычки всю команду sudo, это может быть необязательно.
brianmearns
4
Просто общий комментарий: я думаю, что стандартная / рекомендуемая практика - создавать мягкую / символическую ссылку для конфигурации вашего сайта sites-enabled, а не копировать ее. Не связано с вашей конкретной проблемой, но вы можете рассмотреть это.
brianmearns
1
Вы не должны сталкиваться с простоями. kill HUPэто способ сделать изящную перезагрузку в Nginx.
Джонатан Ванаско

Ответы:

180

Запустить service nginx reloadили/etc/init.d/nginx reload

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

Иногда вы можете захотеть начать с sudo

Hengjie
источник
10
Оба из них должны делать именно то, что говорится в вопросе: отправить SIGHUPв основной процесс nginx. Там не должно быть разницы. nginx.org/en/docs/control.html
Gnarfoz
Когда я запускаю команду в CentOS, она продолжает говорить «Использование /etc/init.d/nginx (start..stop ... restart..reload)» .. и это именно то, как я ее использовал. В файле /init.d/nginx я обнаружил kill -HUP cat $PIDFILE|| echo -n "не могу перезагрузить"
mashup
1
Вы знаете, в чем разница между service nginx reloadи nginx -s reload? Если я запускаю первый, я получаю этот вывод:, Reloading nginx configuration: nginx.но мои изменения не обновляются. Если я запускаю последний, я не получаю вывод, но мои изменения отражаются.
Райан Куинн
Я только что попробовал это после добавления log_not_foundдирективы, но обнаружил, что мне нужно сделать перезагрузку, чтобы она заработала. Я думаю, перезагрузка не работает для всех директив?
mydoghasworms
81

Бегать /usr/sbin/nginx -s reload

Смотрите http://wiki.nginx.org/CommandLine для получения дополнительных параметров командной строки.

Шив Кумар Сах
источник
Наконец, команда, которая работает в Debian Jessie.
danger89
1
Это лучший способ. Потому что ваш сервер не отключается, если в вашей конфигурации есть ошибки (в этом случае просто отображаются ошибки).
Мир Исмаили
если nginx по умолчанию pid не находится в расположении по умолчанию, нужно '-p'. то есть: `/ opt / gitlab / внедренный / sbin / nginx -s перезагрузить -p / var / opt / gitlab / nginx`
qxo
9

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

Согласно http://nginx.org/docs/control.html#reconfiguration , отправка HUPсигнала в nginx гарантирует, что он выполнит корректный перезапуск, и, если файлы конфигурации неверны, вся процедура будет прекращена, и вы ' оставьте nginx как перед отправкой HUPсигнала. Ни в коем случае не должно быть простоев.

Чтобы nginx перечитал файл конфигурации, сигнал HUP должен быть отправлен ведущему процессу. Главный процесс сначала проверяет правильность синтаксиса, затем пытается применить новую конфигурацию, то есть открыть файлы журнала и новые прослушивающие сокеты. Если это не удается, он откатывает изменения и продолжает работать со старой конфигурацией.

CNST
источник
2

Обычно перезагрузка файла конфигурации службы не должна влиять на работающую службу. Однако это зависит от того, как SIGHUPобрабатывается сигнал.

Если конкретная служба испытывает простои во время перезагрузки, это можно обойти, запустив одну и ту же службу на нескольких серверах, предпочтительно с использованием балансировщика нагрузки. В этом случае вы можете вынуть один сервер за раз и перезагрузить / перезапустить его. Затем он может быть повторно добавлен после подтверждения, что все в порядке.

Халед
источник
Хотя это не дает прямого ответа на этот вопрос, это, безусловно, сценарий наилучшей практики, которому ОП следует руководствоваться, чтобы избежать простоев в целом.
Андрей М.
1
Подробная информация о том, как nginx обрабатывает различные сигналы: nginx.org/en/docs/control.html
Gnarfoz,