ฉันจะรีสตาร์ท nginx หลังจากการทดสอบการกำหนดค่าสำเร็จบน Ubuntu ได้อย่างไร


111

เมื่อฉันรีสตาร์ทบริการ nginx บนบรรทัดคำสั่งบนเซิร์ฟเวอร์ Ubuntu บริการจะหยุดทำงานเมื่อไฟล์กำหนดค่า nginx มีข้อผิดพลาด บนเซิร์ฟเวอร์หลายไซต์จะทำให้ไซต์ทั้งหมดลงแม้แต่ไซต์ที่ไม่มีข้อผิดพลาดในการกำหนดค่า

เพื่อป้องกันสิ่งนี้ฉันเรียกใช้การทดสอบการกำหนดค่า nginx ก่อน:

nginx -t

หลังจากการทดสอบเสร็จสมบูรณ์ฉันสามารถเริ่มบริการใหม่ได้:

/etc/init.d/nginx restart

หรือโหลดเฉพาะการกำหนดค่าไซต์ nignx โดยไม่ต้องรีสตาร์ท:

nginx -s reload

มีวิธีรวมคำสั่งสองคำสั่งนี้โดยที่คำสั่ง restart เป็นเงื่อนไขกับผลการทดสอบการกำหนดค่าหรือไม่?

ฉันไม่พบสิ่งนี้ทางออนไลน์และเอกสารอย่างเป็นทางการเกี่ยวกับเรื่องนี้ค่อนข้างธรรมดา ฉันไม่รู้วิธีการใช้งาน Linux ดังนั้นฉันจึงไม่รู้ว่าสิ่งที่ฉันกำลังมองหานั้นอยู่ตรงหน้าฉันหรือไม่ได้เลย

ฉันใช้ nginx v1.1.19


สิ่งที่เกี่ยวกับเชลล์สคริปต์ขนาดเล็กที่ตรวจสอบสถานะการส่งคืนของ nginx -t (ด้วย $?) แล้วการรีสตาร์ทขึ้นอยู่กับสถานะการส่งคืนหรือไม่?
TeTeT

คำตอบ:


49

ที่จริงเท่าที่ฉันรู้ nginx จะแสดงข้อความว่างเปล่าและจะไม่รีสตาร์ทหากการกำหนดค่าไม่ดี

วิธีเดียวที่จะทำให้เสียหายคือการหยุด nginx แล้วเริ่มใหม่อีกครั้ง จะหยุดได้สำเร็จ แต่ไม่สามารถเริ่มต้นได้


1
คุณกำลังพูดถึง nginx รุ่นใด ฉันกำลังทำงานกับ v 1.1.19 และจะพยายามรีสตาร์ทโดยไม่คำนึงถึงข้อผิดพลาดใด ๆ ในไฟล์ config มันจะแจ้งให้ฉันทราบว่ามีปัญหา แต่ตอนนั้นสายไปแล้ว
ม.ค.

5
ตกลงฉันเพิ่งทดสอบแล็ปท็อปของฉันมี nginx 1.2 และใช้งานได้ตามที่ฉันอธิบายไว้ VPS ของฉันมี 1.1.19 เหมือนกับของคุณและมันก็เหมือนกับที่คุณอธิบายไว้ในคำถามของคุณ ดังนั้นฉันเดาว่าสิ่งนี้จัดการใน 1.2
Mohammad AbuShady

ที่ดี! ขอบคุณที่หาข้อมูลให้ฉัน ฉันจะเก็บคำถามไว้อีกหน่อยเพื่อดูว่าไม่มีใครมีคำตอบสำหรับ nginx <v1.2
ม.ค.

1
ฉันเดาว่าฉันจะต้องอัปเกรดแล้ว :-) ต้องการข้อแก้ตัวอยู่ดี
ม.ค.

1
service nginx reloadไม่แสดงอะไรเลยว่าการกำหนดค่าถูกโหลดอย่างถูกต้องหรือไม่ดังนั้นจึงไม่มีประโยชน์หากคุณสงสัยว่าการกำหนดค่าอาจไม่ถูกต้อง service nginx restartจะหยุดเซิร์ฟเวอร์หากการกำหนดค่ามีข้อผิดพลาด!
Dan Dascalescu

80

สำหรับ nginx 1.8.0 วิธีแก้ปัญหาที่ถูกต้องคือ

sudo nginx -t && sudo service nginx reload

โปรดทราบว่าเนื่องจากจุดบกพร่องconfigtestจะส่งคืนรหัสออกเป็นศูนย์เสมอแม้ว่าไฟล์กำหนดค่าจะมีข้อผิดพลาดก็ตาม


3
nginx -t && sudo nginx -s reload
MechanisM

5
@MechanisM: nginx -tหากไม่มี sudo เกือบจะล้มเหลวเนื่องจากข้อผิดพลาดในการอนุญาต
Dan Dascalescu

ฉันต้องการแสดงส่วนสุดท้ายเป็นส่วนใหญ่สำหรับการโหลดซ้ำ ในกรณีของฉันฉันได้คอมไพล์ nginx แบบกำหนดเองและไม่มีแม้แต่สคริปต์ใด ๆ ใน /etc/init.d และอื่น ๆ ดังนั้นในกรณีของฉัน "service nginx reload" จะไม่ทำอะไรเลย
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 ของฉันทำได้อย่างมีประสิทธิภาพ) จะไม่รีโหลดหากการกำหนดค่าล้มเหลวและส่งคืนข้อมูลที่ทำให้เข้าใจผิด ตรวจสอบเวอร์ชันของคุณเอง
KCD

2
สิ่งนี้ไม่ได้ผลสำหรับฉัน คำสั่งทั้งสองได้รับการดำเนินการแม้ว่าการทดสอบจะล้มเหลว
Mario Campa

2
configtest ส่งคืนรหัสออกเป็นศูนย์เสมออย่างน้อยก็ใน nginx 1.8.0 ใช้nginx -tแทน
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'

แล้วใช้คำสั่ง "nginx.reload" เป็นต้น ..


6

คุณสามารถโหลดซ้ำได้โดยใช้/etc/init.d/nginx reloadและsudo service nginx reload

หากnginx -tมีข้อผิดพลาดเกิดขึ้นก็จะไม่โหลดซ้ำ

ดังนั้นใช้ && เพื่อเรียกใช้ทั้งสองอย่างพร้อมกัน

ชอบ

โหลด nginx -t && /etc/init.d/nginx


ให้ฉันสอนบางอย่างเกี่ยวกับการทุบตี && ไม่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 ไปยังกระบวนการหลัก nginx PID ดังนี้:

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แทนเพราะมันเรียกร้องrestarttest_nginx_config


service nginx reloadจะไม่ให้ตัวบ่งชี้ใด ๆ ว่าการกำหนดค่าทดสอบตกลงหรือไม่หรือโหลดซ้ำหรือไม่
Dan Dascalescu

แล้วจะtest_nginx_configทำอย่างไรในกรณีนั้น?
Daenney

1
ฉันคิดว่าคุณทั้งสองมีประเด็น service nginx reloadเพียงพอในบรรทัดคำสั่งอย่างไรก็ตามบางครั้งคุณอาจต้องการจับภาพเอาต์พุต stderr และส่งคืนกลับไปยังสคริปต์เพื่อแก้ไขปัญหา nginx -tจะบอกคุณว่าไฟล์ใดมีพารามิเตอร์ที่ไม่ถูกต้องและอยู่ในบรรทัดใด
anastymous
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.