Bagaimana cara me-restart nginx hanya setelah uji konfigurasi berhasil di Ubuntu?

111

Ketika saya memulai ulang layanan nginx pada baris perintah di server Ubuntu, layanan macet ketika file konfigurasi nginx mengalami kesalahan. Pada server multi-situs, ini meletakkan semua situs, bahkan yang tanpa kesalahan konfigurasi.

Untuk mencegahnya, saya jalankan tes konfigurasi nginx terlebih dahulu:

nginx -t

Setelah pengujian berhasil, saya dapat memulai ulang layanan:

/etc/init.d/nginx restart

Atau hanya muat ulang konfigurasi situs nignx tanpa restart:

nginx -s reload

Apakah ada cara untuk menggabungkan kedua perintah tersebut di mana perintah restart tergantung pada hasil pengujian konfigurasi?

Saya tidak dapat menemukan ini secara online dan dokumentasi resmi tentang ini agak mendasar. Saya tidak tahu cara menggunakan Linux dengan baik, jadi saya tidak tahu apakah yang saya cari ada tepat di depan saya atau tidak mungkin sama sekali.

Saya menggunakan nginx v1.1.19.

jan
sumber
Bagaimana dengan skrip shell kecil yang memeriksa status kembalian nginx -t (dengan $?) Dan kemudian restart bergantung pada status kembalian?
TeTeT

Jawaban:

49

Sebenarnya, sejauh yang saya tahu, nginx akan menampilkan pesan kosong dan tidak akan benar-benar restart jika konfigurasinya buruk.

Satu-satunya cara untuk mengacaukannya adalah dengan melakukan nginx stop lalu mulai lagi. Itu akan berhasil untuk berhenti, tetapi gagal untuk memulai.

Mohammad AbuShady
sumber
1
Versi nginx apa yang kamu bicarakan? Saya bekerja dengan v 1.1.19 dan itu akan mencoba untuk memulai ulang terlepas dari kesalahan apa pun dalam file konfigurasi. Ini akan memberi tahu saya bahwa ada masalah, tetapi saat itu sudah terlambat
Januari
5
Ok saya baru saja mengujinya, laptop saya memiliki nginx 1.2 dan berfungsi seperti yang saya jelaskan, VPS saya memiliki 1.1.19 seperti milik Anda, dan itu melakukan hal yang sama seperti yang Anda jelaskan dalam pertanyaan Anda. Jadi saya rasa ini ditangani di 1.2
Mohammad AbuShady
Bagus! Terima kasih telah memikirkannya untuk saya. Saya akan membiarkan pertanyaan terbuka sedikit lebih lama untuk melihat apakah tidak ada yang memiliki jawaban untuk nginx <v1.2
jan
1
Saya kira saya harus memutakhirkan kemudian :-) Lagi pula butuh alasan
jan
1
service nginx reloadtidak menunjukkan apakah konfigurasi dimuat dengan benar atau tidak, jadi tidak berguna jika Anda mencurigai konfigurasi tersebut mungkin salah. service nginx restartakan menghentikan server jika konfigurasi mengalami kesalahan!
Dan Dascalescu
80

Pada nginx 1.8.0, solusi yang benar adalah

sudo nginx -t && sudo service nginx reload

Perhatikan bahwa karena bug, configtestselalu mengembalikan kode keluar nol meskipun file konfigurasi mengalami kesalahan.

Dan Dascalescu
sumber
3
nginx -t && sudo nginx -s reload
MechanisM
5
@MechanisM: nginx -ttanpa sudo hampir pasti akan gagal karena kesalahan izin.
Dan Dascalescu
Saya ingin menunjukkan sebagian besar bagian terakhir untuk memuat ulang. Dalam kasus saya, saya telah mengkompilasi nginx kustom dan bahkan tidak memiliki skrip apa pun di /etc/init.d dan seterusnya, jadi dalam kasus saya "service nginx reload" tidak akan melakukan apa
MechanisM
39

Saya menggunakan perintah berikut untuk memuat ulang Nginx (versi 1.5.9) hanya jika uji konfigurasi berhasil:

/etc/init.d/nginx configtest && sudo /etc/init.d/nginx reload

Jika Anda perlu sering melakukan ini, Anda mungkin ingin menggunakan alias. Saya menggunakan yang berikut ini:

alias n='/etc/init.d/nginx configtest && sudo /etc/init.d/nginx reload'

Trik di sini dilakukan oleh "&&" yang hanya mengeksekusi perintah kedua jika perintah pertama berhasil. Anda dapat melihat di sini penjelasan yang lebih detail tentang penggunaan operator "&&".

Anda dapat menggunakan "restart" daripada "reload" jika Anda benar-benar ingin me-restart server.

Mauricio Sánchez
sumber
Hati-hati untuk nginx 1.4.2 Saya menemukan pkill -1 nginx(secara efektif apa yang dilakukan ulang init.d / nginx saya) TIDAK memuat ulang jika konfigurasi gagal dan secara menyesatkan kembali berhasil. Periksa versi Anda sendiri.
KCD
2
Ini tidak berhasil untuk saya. Kedua perintah dijalankan meskipun pengujian gagal.
Mario Campa
2
configtest selalu mengembalikan kode keluar nol , setidaknya di nginx 1.8.0. Gunakan nginx -tsebagai gantinya.
Dan Dascalescu
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'

lalu gunakan perintah "nginx.reload" dll ..

Mekanisme
sumber
6

Anda dapat memuat ulang menggunakan /etc/init.d/nginx reloaddansudo service nginx reload

Jika nginx -tmelontarkan beberapa kesalahan maka itu tidak akan dimuat ulang

jadi gunakan && untuk menjalankan keduanya secara bersamaan

Suka

nginx -t && /etc/init.d/nginx memuat ulang

gokul kandasamy
sumber
Izinkan saya mengajari Anda sesuatu tentang bash. && tidak run both at a same timeMenjalankan perintah di sebelah kanan JIKA perintah di sebelah kiri mengembalikan kode keluar 0. Jika Anda nginx -tmelakukan kesalahan, kode keluarnya tidak akan 0, jadi perintah kedua tidak akan berjalan. Its nginx -s reloadpula
miknik
@miknik Saya pikir itu yang ingin dia katakan, hanya saja tidak keluar dengan benar. Dia berkata If nginx -t throws some error then it won't reload. Pernyataan run both at a same timeitu juga bisa diartikan sebagai satu perintah, atau satu baris. Saya tidak menafsirkan dia harus mengatakan dalam kasus ini in parallel.
matt
2

Anda dapat menggunakan sinyal untuk mengontrol nginx.

Menurut dokumentasi, Anda perlu mengirim sinyal HUP ke proses master nginx.

HUP - mengubah konfigurasi, mengikuti zona waktu yang berubah (hanya untuk FreeBSD dan Linux), memulai proses pekerja baru dengan konfigurasi baru, mematikan proses pekerja lama dengan baik

Periksa dokumentasinya di sini: http://nginx.org/en/docs/control.html

Anda dapat mengirim sinyal HUP ke proses master nginx PID seperti ini:

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

Perintah di atas membaca PID nginx dari /var/run/nginx.pid. Secara default nginx pid ditulis ke /usr/local/nginx/logs/nginx.pidtetapi itu dapat diganti di config. Periksa Anda nginx.configuntuk melihat di mana ia menyimpan PID.

hcristea.dll
sumber
1

Setidaknya di Debian, skrip startup nginx memiliki fungsi muat ulang yang berfungsi:

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 $?
  ;;

Sepertinya yang perlu Anda lakukan hanyalah menelepon, service nginx reloadbukan restartsejak panggilan itu test_nginx_config.

Daenney
sumber
service nginx reloadtidak akan memberikan indikasi apa pun, apakah konfigurasi yang diuji OK atau tidak, atau apakah itu dimuat ulang atau tidak.
Dan Dascalescu
Lalu apa yang test_nginx_configdilakukan dalam kasus itu?
Daenney
1
Saya pikir Anda berdua ada benarnya. service nginx reloadcukup pada baris perintah, namun terkadang Anda mungkin ingin menangkap keluaran stderr dan mengembalikannya ke skrip untuk pemecahan masalah. nginx -takan memberi tahu Anda file mana yang memiliki parameter tidak valid dan di baris mana.
anastymous