Nginx'i yalnızca Ubuntu'da yapılandırma testi başarılı olduktan sonra nasıl yeniden başlatırım?


111

Ubuntu sunucusundaki bir komut satırında nginx hizmetini yeniden başlattığımda, bir nginx yapılandırma dosyasında hatalar olduğunda hizmet çöküyor. Çok siteli bir sunucuda bu, yapılandırma hatası olmayanlar da dahil olmak üzere tüm siteleri kapatır.

Bunu önlemek için önce nginx yapılandırma testini çalıştırıyorum:

nginx -t

Test başarılı olduktan sonra servisi yeniden başlatabilirim:

/etc/init.d/nginx restart

Veya yeniden başlatmadan yalnızca nignx site yapılandırmalarını yeniden yükleyin:

nginx -s reload

Yeniden başlatma komutunun konfigürasyon testinin sonucuna bağlı olduğu bu iki komutu birleştirmenin bir yolu var mı?

Bunu çevrimiçi bulamadım ve bununla ilgili resmi belgeler oldukça basit. Linux'ta yolumu o kadar iyi bilmiyorum, bu yüzden aradığım şeyin tam önümde olup olmadığını bilmiyorum.

Nginx v1.1.19 kullanıyorum.


Nginx -t'nin ($ ile?) Dönüş durumunu kontrol eden ve sonra dönüş durumuna bağlı olarak yeniden başlatma yapan küçük bir kabuk betiğine ne dersiniz?
TeTeT

Yanıtlar:


49

Aslında, bildiğim kadarıyla, nginx boş bir mesaj gösterir ve konfigürasyon kötüyse aslında yeniden başlamaz.

Bunu batırmanın tek yolu, bir nginx durdurması yapmak ve sonra yeniden başlamaktır. Durdurmayı başarır, ancak başlamaz.


1
Hangi nginx sürümünden bahsediyorsunuz? V 1.1.19 ile çalışıyorum ve yapılandırma dosyalarındaki hatalardan bağımsız olarak yeniden başlatmayı deneyecek. Bana bir sorun olduğunu bildirecek, ancak o zamana kadar çok geç oldu
Ocak

5
Tamam, az önce test ettim, dizüstü bilgisayarımda nginx 1.2 var ve açıkladığım gibi çalıştı, VPS'im sizinki gibi 1.1.19'a sahip ve sorunuzda açıkladığınızla aynı şeyi yaptı. Sanırım bu 1.2'de ele alındı
Mohammad AbuShady

Harika! Bunu benim için anladığın için teşekkürler. Kimsenin nginx <v1.2
Ocak

1
Sanırım o zaman yükseltmem gerekecek :-) Yine de bir bahaneye ihtiyacım vardı
Oca

1
service nginx reloadyapılandırmanın doğru yüklenip yüklenmediğini göstermez, bu nedenle yapılandırmanın yanlış olabileceğinden şüpheleniyorsanız faydasızdır. service nginx restartyapılandırmada bir hata varsa sunucuyu durdurur!
Dan Dascalescu

80

Nginx 1.8.0 itibariyle, doğru çözüm

sudo nginx -t && sudo service nginx reload

Bir hata nedeniyle , yapılandırma dosyasında bir hata olsa bile configtesther zaman sıfır çıkış kodu döndürdüğünü unutmayın .


3
nginx -t && sudo nginx -s yeniden yükle
MechanisM

5
@MechanisM: nginx -tsudo olmadan izin hataları nedeniyle neredeyse kesin olarak başarısız olur.
Dan Dascalescu

Yeniden yükleme için çoğunlukla son kısmı göstermek istedim. Benim durumumda, nginx'i özel olarak derledim ve /etc/init.d'de herhangi bir komut dosyam bile yok, bu yüzden benim durumumda "service nginx yeniden yükleme" hiçbir şey yapmayacak
MechanisM

39

Yalnızca bir yapılandırma testi başarılı olursa Nginx'i (sürüm 1.5.9) yeniden yüklemek için aşağıdaki komutu kullanıyorum:

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

Bunu sık sık yapmanız gerekiyorsa, bir takma ad kullanmak isteyebilirsiniz. Ben aşağıdakileri kullanıyorum:

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

Buradaki hile, yalnızca ilk komut başarılı olursa ikinci komutu çalıştıran "&&" tarafından yapılır. Burada "&&" operatörünün kullanımının daha ayrıntılı bir açıklamasını görebilirsiniz .

Sunucuyu gerçekten yeniden başlatmak istiyorsanız, "yeniden yükle" yerine "yeniden başlat" seçeneğini kullanabilirsiniz.


Nginx 1.4.2'ye dikkat edin pkill -1 nginxYapılandırma başarısız olursa ve yanıltıcı bir şekilde başarılı olursa (init.d / nginx yeniden yüklememin yaptığını etkili bir şekilde) yeniden YÜKLEMEDİĞİNİ gördüm. Kendi versiyonlarınızı kontrol edin.
KCD

2
Bu benim için çalışmıyor. Test başarısız olsa bile her iki komut da yürütülür.
Mario Campa

2
configtest her zaman sıfır çıkış kodu döndürür , en azından nginx 1.8.0'da. nginx -tBunun yerine kullanın .
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'

ve sonra "nginx.reload" vb. komutları kullanın.


6

/etc/init.d/nginx reloadVe kullanarak yeniden yükleyebilirsinizsudo service nginx reload

Bir nginx -thata atarsa, yeniden yüklenmez

bu yüzden ikisini de aynı anda çalıştırmak için && kullanın

sevmek

nginx -t && /etc/init.d/nginx yeniden yükle


Size Bash hakkında bir şey öğretmeme izin verin. && yapmaz run both at a same timeSağdaki komutu çalıştırır EĞER soldaki komut 0 çıkış kodunu döndürür. Eğer nginx -tbir hata atarsanız çıkış kodu 0 olmayacak, bu yüzden ikinci komut çalışmayacaktır. Her nginx -s reloadneyse
miknik

@miknik Sanırım söylemek istediği buydu, sadece doğru çıkmadı. Diyor If nginx -t throws some error then it won't reload. İfadesi run both at a same timede, tek bir komuta veya bir satır olarak yorumlanabilir. Bu durumda onu mutlaka söyleyerek yorumlamıyorum in parallel.
matt

2

Nginx'i kontrol etmek için sinyalleri kullanabilirsiniz.

Belgelere göre, HUP sinyalini nginx master sürecine göndermeniz gerekir.

HUP - konfigürasyonu değiştirmek, değişen bir saat dilimine ayak uydurmak (sadece FreeBSD ve Linux için), yeni bir konfigürasyonla yeni çalışan süreçleri başlatmak, eski çalışan süreçlerin zarif bir şekilde kapatılması

Buradaki belgeleri kontrol edin: http://nginx.org/en/docs/control.html

HUP sinyalini nginx ana işlem PID'sine şu şekilde gönderebilirsiniz:

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

Yukarıdaki komut nginx PID'yi okur /var/run/nginx.pid. Varsayılan olarak nginx pid'e yazılır, /usr/local/nginx/logs/nginx.pidancak bu config'de geçersiz kılınabilir. nginx.configPID'yi nereye kaydettiğini görmek için kontrol edin .


1

En azından Debian'da nginx başlangıç ​​betiğinin aşağıdakileri yapan bir yeniden yükleme işlevi vardır:

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

Görünüşe göre aradığından beri tek yapman gereken aramak service nginx reloadyerine aramak .restarttest_nginx_config


service nginx reloadYapılandırmanın test edilip edilmediğine veya yeniden yüklenip yüklenmediğine dair herhangi bir gösterge vermez.
Dan Dascalescu

test_nginx_configO halde bu durumda ne yapar ?
Daenney

1
Sanırım ikinizin de haklı olduğunu düşünüyorum. service nginx reloadkomut satırında yeterlidir, ancak bazen stderr çıktısını yakalamak ve sorun giderme için bunu bir betiğe geri döndürmek isteyebilirsiniz. nginx -thangi dosyada geçersiz parametrenin hangi satırda olduğunu size söyleyecektir.
2016
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.