โหลด Nginx config ใหม่โดยไม่ต้องหยุดทำงาน


122

ฉันใช้ nginx เป็น reverse proxy เมื่อใดก็ตามที่ฉันอัปเดตการกำหนดค่าโดยใช้

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
Jonathan Vanasco

คำตอบ:


181

เรียกใช้service nginx reloadหรือ/etc/init.d/nginx reload

มันจะทำการรีโหลดร้อนๆของการกำหนดค่าโดยไม่ต้องหยุดทำงาน หากคุณมีคำขอที่รอดำเนินการจะมีกระบวนการ nginx ที่รอคอยการจัดการการเชื่อมต่อเหล่านั้นก่อนที่มันจะตายดังนั้นจึงเป็นวิธีที่ดีมากในการโหลดการตั้งค่าใหม่

บางครั้งคุณอาจต้องการเสริมด้วย sudo


10
ทั้งสองอย่างควรทำสิ่งที่คำถามระบุ: ส่งSIGHUPไปยังกระบวนการหลักของ nginx ไม่ควรมีความแตกต่าง nginx.org/en/docs/control.html
Gnarfoz

เมื่อฉันออกคำสั่งบน CentOS มันจะพูดว่า "Usage /etc/init.d/nginx (start..stop ... restart .. รีสตาร์ท .. reload)" .. และนั่นก็เป็นวิธีที่ฉันใช้ ภายในไฟล์ /init.d/nginx ฉันพบ kill -HUP cat $PIDFILE|| echo -n "ไม่สามารถโหลดซ้ำได้"
ตอบโต้กับผู้ใช้ได้

1
คุณรู้หรือไม่ว่าอะไรคือความแตกต่างระหว่างservice nginx reloadและnginx -s reload? ถ้าฉันเรียกใช้ก่อนหน้านี้ฉันจะได้รับผลลัพธ์นี้: Reloading nginx configuration: nginx.แต่การเปลี่ยนแปลงของฉันไม่ได้รับการปรับปรุง หากฉันรันหลังฉันจะไม่ได้ผลลัพธ์ แต่การเปลี่ยนแปลงของฉันจะสะท้อนออกมา
Ryan Quinn

ฉันเพิ่งลองหลังจากเพิ่มlog_not_foundคำสั่ง แต่พบว่าฉันต้องรีสตาร์ทจริงเพื่อให้ทำงานได้ ฉันคิดว่าการโหลดซ้ำไม่ทำงานสำหรับคำสั่งทั้งหมดหรือไม่
mydoghasworms

81

วิ่ง /usr/sbin/nginx -s reload

ดูhttp://wiki.nginx.org/CommandLineสำหรับตัวเลือกบรรทัดคำสั่งเพิ่มเติม


ในที่สุดคำสั่งที่ทำงานใน Debian Jessie
อันตราย 89

1
นี่เป็นวิธีที่ดีกว่า เนื่องจากเซิร์ฟเวอร์ของคุณไม่ทำงานหากการกำหนดค่าของคุณมีข้อผิดพลาด (เพียงแสดงข้อผิดพลาดในกรณีนี้)
Mir-Ismaili

หากค่าเริ่มต้น nginx pid ไม่ได้อยู่ในตำแหน่งเริ่มต้นให้ใช้ '-p' ie: `/ opt / gitlab / embedded / sbin / nginx -s reload -p / var / opt / gitlab / nginx`
qxo

9

ไม่คุณไม่ถูกต้องคุณไม่ควรหยุดทำงานด้วยขั้นตอนที่คุณอธิบาย (Nginx สามารถทำได้ไม่เพียง แต่การกำหนดค่าโหลดซ้ำได้ทันทีโดยไม่ต้องหยุดทำงาน แต่ยังอัพเกรดการทำงานได้ทันทีโดยไม่ต้องหยุดทำงาน)

ตามhttp://nginx.org/docs/control.html#reconfigurationการส่งHUPสัญญาณไปยัง nginx ทำให้แน่ใจว่ามันทำการรีสตาร์ทอย่างนุ่มนวลและหากไฟล์การกำหนดค่าไม่ถูกต้องขั้นตอนทั้งหมดจะถูกยกเลิกและคุณ ' อีกครั้งด้วย nginx เหมือนก่อนส่งHUPสัญญาณ ไม่ควรมีการหยุดทำงานใด ๆ

เพื่อให้ nginx อ่านไฟล์คอนฟิกูเรชันอีกครั้งสัญญาณ HUP ควรถูกส่งไปยังกระบวนการหลัก กระบวนการหลักก่อนตรวจสอบความถูกต้องของไวยากรณ์จากนั้นพยายามใช้การกำหนดค่าใหม่นั่นคือเพื่อเปิดล็อกไฟล์และซ็อกเก็ตฟังใหม่ หากสิ่งนี้ล้มเหลวมันจะย้อนกลับการเปลี่ยนแปลงและยังคงทำงานกับการกำหนดค่าแบบเก่าต่อไป


2

โดยปกติแล้วการโหลดไฟล์กำหนดค่าใหม่ของบริการจะไม่ส่งผลกระทบต่อบริการที่ทำงานอยู่ อย่างไรก็ตามสิ่งนี้ขึ้นอยู่กับวิธีการSIGHUPประมวลผลสัญญาณ

หากบริการเฉพาะพบว่ามีการหยุดทำงานในระหว่างการโหลดซ้ำสิ่งนี้สามารถหลีกเลี่ยงได้โดยการเรียกใช้บริการเดียวกันบนเซิร์ฟเวอร์หลายเครื่องโดยเฉพาะอย่างยิ่งการใช้ load balancer ในกรณีนี้คุณสามารถนำเซิร์ฟเวอร์ออกทีละตัวและรีโหลด / รีสตาร์ท จากนั้นสามารถเพิ่มอีกครั้งหลังจากยืนยันว่าตกลง


แม้ว่าสิ่งนี้จะไม่ตอบคำถามโดยตรง แต่นี่เป็นสถานการณ์จำลองที่ดีที่สุดที่ OP จะฉลาดในการติดตามเพื่อหลีกเลี่ยงการหยุดทำงานโดยทั่วไป
แอนดรูว์เอ็ม

1
รายละเอียดเกี่ยวกับวิธีที่ nginx จัดการกับสัญญาณที่แตกต่าง: nginx.org/en/docs/control.html
Gnarfoz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.