Kiedy ponownie uruchamiam usługę Nginx w wierszu poleceń na serwerze Ubuntu, usługa ulega awarii, gdy plik konfiguracyjny Nginx zawiera błędy. Na serwerze z wieloma lokacjami powoduje to wyłączenie wszystkich witryn, nawet tych bez błędów konfiguracji.
Aby temu zapobiec, najpierw uruchamiam test konfiguracji nginx:
nginx -t
Po pomyślnym zakończeniu testu mogłem ponownie uruchomić usługę:
/etc/init.d/nginx restart
Lub tylko przeładuj konfiguracje witryny nignx bez ponownego uruchamiania:
nginx -s reload
Czy istnieje sposób na połączenie tych dwóch poleceń, w których polecenie restartu jest uzależnione od wyniku testu konfiguracji?
Nie mogłem znaleźć tego w Internecie, a oficjalna dokumentacja na ten temat jest raczej podstawowa. Nie znam tak dobrze Linuksa, więc nie wiem, czy to, czego szukam, jest tuż przede mną, czy w ogóle niemożliwe.
Używam nginx v1.1.19.
Odpowiedzi:
Właściwie, o ile wiem, nginx wyświetli pusty komunikat i nie uruchomi się ponownie, jeśli konfiguracja jest zła.
Jedynym sposobem, aby to schrzanić, jest zatrzymanie nginx, a następnie ponowne rozpoczęcie. Udało się zatrzymać, ale nie uruchomić.
źródło
service nginx reload
nie pokazuje nic, czy konfiguracja została załadowana poprawnie, czy nie, więc jest to bezużyteczne, jeśli podejrzewasz, że konfiguracja może być niepoprawna.service nginx restart
zatrzyma serwer, jeśli konfiguracja zawiera błąd!Od wersji Nginx 1.8.0 poprawnym rozwiązaniem jest
Zauważ, że z powodu błędu
configtest
zawsze zwraca zerowy kod zakończenia, nawet jeśli plik konfiguracyjny zawiera błąd.źródło
nginx -t
bez sudo prawie na pewno zakończy się niepowodzeniem z powodu błędów uprawnień.Używam następującego polecenia, aby ponownie załadować Nginx (wersja 1.5.9) tylko wtedy, gdy test konfiguracji zakończył się pomyślnie:
Jeśli musisz to robić często, możesz użyć aliasu. Używam następujących:
Sztuczka polega na tym, że „&&” wykonuje drugie polecenie tylko wtedy, gdy pierwsze się powiedzie. Możesz zobaczyć tutaj bardziej szczegółowe wyjaśnienie użycia operatora „&&”.
Możesz użyć opcji „restart” zamiast „reload”, jeśli naprawdę chcesz zrestartować serwer.
źródło
pkill -1 nginx
(skutecznie to, co robi moje przeładowanie init.d / nginx) NIE ładuje się ponownie, jeśli konfiguracja się nie powiedzie i zwróci błąd. Sprawdź swoje własne wersje.nginx -t
zamiast tego.a następnie użyj poleceń „nginx.reload” itp.
źródło
Możesz przeładować używając
/etc/init.d/nginx reload
isudo service nginx reload
Jeśli
nginx -t
zgłosi jakiś błąd, nie załaduje się ponowniewięc użyj &&, aby uruchomić oba w tym samym czasie
lubić
źródło
run both at a same time
uruchamia polecenia po prawej stronie JEŻELI polecenie po lewej zwraca kod zakończenia równy 0. Jeślinginx -t
zgłosi błąd, kod zakończenia nie będzie równy 0, więc drugie polecenie nie zostanie uruchomione. Taknginx -s reload
czy inaczejIf nginx -t throws some error then it won't reload
. Instrukcjarun both at a same time
może być również zinterpretowana jako pojedyncze polecenie lub jeden wiersz. W tym przypadku niekoniecznie interpretuję go, mówiącin parallel
.Możesz użyć sygnałów do sterowania nginx.
Zgodnie z dokumentacją, musisz wysłać sygnał HUP do głównego procesu nginx.
Sprawdź dokumentację tutaj: http://nginx.org/en/docs/control.html
Możesz wysłać sygnał HUP do PID procesu głównego nginx w następujący sposób:
Powyższe polecenie odczytuje PID nginx z
/var/run/nginx.pid
. Domyślnie pid nginx jest zapisywany,/usr/local/nginx/logs/nginx.pid
ale można to zmienić w config. Sprawdź,nginx.config
gdzie zapisuje PID.źródło
Przynajmniej na Debianie skrypt startowy nginx ma funkcję przeładowania, która wykonuje:
Wygląda na to, że wszystko, co musisz zrobić, to zadzwonić,
service nginx reload
a nierestart
skoro dzwonitest_nginx_config
.źródło
service nginx reload
nie da żadnego wskazania, czy konfiguracja została przetestowana poprawnie, czy nie, lub czy została ponownie załadowana, czy nie.test_nginx_config
wtedy robi w takim przypadku?service nginx reload
jest wystarczające w wierszu poleceń, jednak czasami możesz chcieć przechwycić wyjście stderr i zwrócić je z powrotem do skryptu w celu rozwiązania problemu.nginx -t
powie ci, który plik ma nieprawidłowy parametr iw której linii.