ฉันจะเริ่ม nginx ผ่านทาง upstart ได้อย่างไร


9

พื้นหลัง:

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.04
DISTRIB_CODENAME=lucid
DISTRIB_DESCRIPTION="Ubuntu 10.04 LTS"

ฉันได้สร้าง nginx และฉันต้องการใช้การเริ่มต้นเพื่อเริ่มต้น:

สคริปต์ nginx upstart จากไซต์:

description "nginx http daemon"

start on runlevel 2

stop on runlevel 0
stop on runlevel 1
stop on runlevel 6

console owner

exec /usr/sbin/nginx -c /etc/nginx/nginx.conf  -g "daemon off;"

respawn

ฉันได้รับ "งานที่ไม่รู้จัก" เมื่อฉันพยายามใช้ initctl เพื่อเรียกใช้ซึ่งฉันเพิ่งเรียนรู้ว่าหมายความว่ามีข้อผิดพลาด (เกิดอะไรขึ้นกับ "ข้อผิดพลาด" เพื่ออธิบายข้อผิดพลาด?)

ใครบางคนชี้ให้ฉันในทิศทางที่ถูกต้อง? ฉันได้อ่านเอกสารอย่างที่เป็นอยู่แล้วและดูเหมือนว่า sparse สำหรับการเปลี่ยน SysV init ... แต่สิ่งที่ต้องเพิ่มงานนี้ลงในรายการเรียกใช้และทำสิ่งที่เหลือในชีวิตของฉัน .. เคล็ดลับใด ๆ

แก้ไข: รุ่น initctl init (พุ่งพรวด 0.6.5)


1
หนึ่งความคิดเห็นเกี่ยวกับ 'งานที่ไม่รู้จัก' และ 'ข้อผิดพลาด' คุณกำลังมองหาที่ผิด Initctl ไม่อ่านไฟล์กำหนดค่ามันแค่ขอให้ Upstart โหลดงานที่รู้จัก - และ upstart ไม่รู้จักงานนี้เมื่อคุณออกคำสั่ง initctl เกิดข้อผิดพลาดก่อนหน้านี้เมื่อ Upstart พยายามอ่านไฟล์งาน ควรมีข้อความแสดงข้อผิดพลาดในบันทึกของระบบ (/ var / log / syslog, / var / log / ข้อความหรือที่ใดก็ตามที่ระบบของคุณจัดเก็บบันทึกเหล่านี้)
Jacek Konieczny

โดยวิธีการที่ปรากฎว่าใน / sbin มีคำสั่งเริ่มต้นและหยุดสำหรับงานพุ่งพรวด พวกเขาทำงานให้ฉัน ตอนนี้พวกเขาเชื่อมโยงกลับไปที่ initctl ดังนั้นฉันจึงไม่แน่ใจว่าทำไมพวกเขาถึงทำงาน แต่พวกเขาทำ
chiggsy

คำตอบ:


3

คุณไม่สามารถมีหลายstop onคำสั่งในรายละเอียดงานพุ่งพรวดสำหรับพุ่งพรวด> = 0.5

และconsole ownerอาจไม่ใช่สิ่งที่คุณต้องการ (สิ่งนี้ทำให้ nginx เป็นเจ้าของคอนโซลระบบ)

ลอง:

description "nginx http daemon"
start on runlevel 2
stop on runlevel [016]
console output
exec /usr/sbin/nginx -c /etc/nginx/nginx.conf  -g "daemon off;"
respawn

ยังไม่ทราบงานเลยอนิจจา คุณได้รับข้อมูลนี้จากที่ไหน ชาย? ข้อมูล? ออนไลน์ได้หรือไม่ เอกสาร 0.6.5 อยู่ที่ไหน
chiggsy

ค่อนข้างทำงาน .. ขอบคุณ
chiggsy

ใช่มันยากที่จะหาเอกสารพุ่งพรวดปัจจุบันอย่างน้อยบนเว็บ แต่หน้าคู่มือค่อนข้างดี ลอง: man 5 init
Jacek Konieczny

1
นี่ไม่ใช่วิธีที่ถูกต้องในการเรียกใช้ nginx บนเซิร์ฟเวอร์ที่ใช้งานจริง daemon offตัวเลือกสำหรับการพัฒนาเท่านั้น
PhilT

16

ฉันลงเอยที่นี่มากกว่าหนึ่งครั้งดังนั้นฉันคิดว่าฉันจะให้คำตอบที่อัปเดตตามประสบการณ์ของตัวเองหลังจากใช้คำตอบที่นี่ ขอบคุณโดยเฉพาะ @danorton และ @orj สำหรับคำตอบของพวกเขา

สคริปต์นี้ได้รับการทดสอบใน Upstart 1.5 ที่ทำงานบน Ubuntu 12.04 ด้วย Nginx 1.0.11 และ Passenger 3.0.11 หากคุณไม่ได้ใช้งานผู้โดยสารคุณอาจต้องเล่นกับpost-stopสาย อ้างถึงตำราพุ่งพรวด

ใน/etc/init/nginx.confบรรทัดว่างให้เพิ่มบรรทัดต่อไปนี้ (คุณสามารถลบความคิดเห็นได้หากต้องการ):

description "nginx http daemon"

start on (filesystem and net-device-up IFACE=lo)
stop on runlevel [!2345]

env DAEMON=/usr/local/nginx/sbin/nginx
env PIDFILE=/var/run/nginx.pid

# Needed to allow Nginx to start, however, the wrong PID will be tracked
expect fork

# Test the nginx configuration (Upstart will not proceed if this fails)
pre-start exec $DAEMON -t

# Ensure nginx is shutdown gracefully
# Upstart will be tracking the wrong PID so the following is needed to stop nginx
post-stop exec start-stop-daemon --stop --pidfile $PIDFILE --name nginx --exec $DAEMON --signal QUIT

# Start Nginx
exec $DAEMON

ฉันใช้สคริปต์พุ่งพรวดจาก Nginx Wiki และ tweaked เป็นจำนวนบรรทัดที่ไม่จำเป็นทำให้เกิดความสับสนหรือไม่ทำงาน

คุณอาจต้องแก้ไขenv DAEMONและenv PIDบรรทัดขึ้นอยู่กับตำแหน่งที่คุณติดตั้ง nginx และกำลังเขียน PID PID สามารถกำหนดค่าใน nginx

expectฉันพยายามทุกรูปแบบของ เพียง แต่expect forkดูเหมือนว่าจะทำงาน ด้วย Passenger nginx สร้าง 61 ส้อม การพุ่งพรวดต้องใช้ 0, 1 หรือ 2 ตามที่คนอื่นบอกใบ้การพุ่งพรวดจะติดตาม PID ที่ไม่ถูกต้อง ฉันได้ลบออกrespawnเพราะไม่ได้ทำอะไรเพราะเหตุผลเดียวกัน สคริปต์ pre / post-start เพิ่มเติมบางอย่างอาจสามารถแก้ไขได้โดยการคว้า PID จริง อย่างไรก็ตามฉันใช้ monit เพื่อจัดการการรีสตาร์ทดังนั้นไม่จำเป็นต้องใช้

daemon offอย่าใช้ เพื่อการพัฒนาเท่านั้น ดูhttp://wiki.nginx.org/CoreModule#daemon

อ้างอิง:


1
ฉันคิดว่าคุณจะต้องการเรียกใช้daemon off;เพื่อให้พุ่งพรวดนาฬิกากระบวนการที่ถูกต้อง / PID โดยไม่จำเป็นต้องได้expect forkหรือpost-stopคำสั่ง ส่วนวิกิพีเดียอธิบายตัวเลือกภูตยังระบุ "คุณสามารถใช้ภูตออกได้อย่างปลอดภัยในโหมดการผลิตที่มี runit / daemontools แต่คุณไม่สามารถทำอัพเกรดสง่างาม." ซึ่งผมถือว่าเป็นที่หมายถึงการอัพเกรดไบนารีใหม่บนคุณสมบัติการบิน
Gary

3

คุณทำไม่ได้ อย่างน้อยก็ไม่ถูกต้องอยู่ดี

Nginx ไม่วางไข่ daemon ในหนึ่งในสองวิธีที่การพุ่งพรวดต้องการไม่ว่าจะผ่าน“ expect fork” หรือ“ expect daemon” ดังนั้นการพุ่งพรวดจึงไม่สามารถติดตามกระบวนการหลัก nginx ได้ มีแฮ็กบางอย่าง แต่พวกเขามีปัญหาของตัวเอง

หากคุณโอเคกับข้อเท็จจริงที่ว่าคนธรรมดาไม่สามารถติดตามกระบวนการหลักและฆ่ามันเมื่อปิดเครื่องสิ่งนี้จะทำงาน:

start on local-filesystems \
  and (net-device-added INTERFACE=lo) \
  and (runlevel [12345])
stop on runlevel [06]

env DAEMON=/usr/sbin/nginx

respawn
respawn limit 10 5

expect daemon

pre-start script
  $DAEMON -t
end script

$DAEMON

expect daemonทำให้พุ่งพรวดสำหรับฉัน (Ubuntu 12.04, พุ่งพรวด 1.5, Nginx) expect forkทำงานได้แม้จะเป็น @danorton hints แต่พุ่งพรวดจะติดตาม PID ที่ไม่ถูกต้อง ฉันยังไม่สามารถกลับไปทำงานได้ (ดูคำตอบทั้งหมดของฉัน)
PhilT

2

มีความเป็นพุ่งพรวดตัวอย่างไฟล์ configในNGINX วิกิพีเดีย

คุณอาจต้องปรับพา ธ ไปยังไบนารี nginx ในไฟล์ปรับแต่ง

ไฟล์ปรับแต่งนี้ใช้งานได้ดีสำหรับฉันกับ Ubuntu 10.04 และ nginx 1.0.5

ฉันยังติดตั้งnginxsymlink ใน/etc/init.dชี้/lib/init/upstart-jobดังนั้นฉันสามารถใช้มาตรฐานคำสั่งเพื่อเริ่มต้นและหยุดservicenginx

หมายเหตุ:หากคุณติดตั้ง Phusion Passenger ด้วย NGINX คุณอาจต้องเพิ่ม stanza ต่อไปนี้ในสคริปต์การกำหนดค่า Upstart:

env PID=/opt/nginx/logs/nginx.pid
post-stop script
    start-stop-daemon --stop --pidfile $PID --name nginx --exec $DAEMON --signal TERM
end script

ฉันพบสิ่งนี้จำเป็นสำหรับการกำหนดค่า Ubuntu ของฉัน มิฉะนั้นเมื่อฉันออกinitctl stop nginxหรือservice nginx stopnginx ไม่ได้หยุดจริง ฉันยังสังเกตเห็นว่าการพุ่งพรวดคิดว่ากระบวนการ nginx มี PID ซึ่งจริง ๆ แล้วเป็น PID ของหนึ่งในกระบวนการของผู้โดยสาร เห็นได้ชัดว่า NGINX / ผู้โดยสารสับสนเล็กน้อยพุ่งพรวดเล็กน้อย


ขอบคุณสำหรับสคริปต์สำหรับผู้โดยสาร สิ่งนี้ดูเหมือนจะหยุดกระบวนการ แต่ฉันได้stop: Job failed while stoppingขณะทำเช่นนั้น คุณเห็นสิ่งนี้ไหม
PhilT

ฉันมีปัญหาเช่นเดียวกับ @PhilT คำพูดใด ๆ เกี่ยวกับเรื่องนี้?
Claudio Poli

0

ฉันใช้:

description "Nginx HTTP Server"

start on filesystem
stop on runlevel [!2345]

respawn

exec /opt/nginx/sbin/nginx -g "daemon off;"

การหยุดในrunlevel [!...]ดูเหมือนจะเป็นมาตรฐานมากขึ้น มันเป็นสิ่งที่สคริปต์หุ้น ssh / samba ทำ คุณควรเพิ่มrespawnบิตเพื่อให้รีสตาร์ทถ้ามันตาย ฉันยังไม่แน่ใจว่าทำไมคุณต้องการconsole outputส่งคอนโซลเอาต์พุตไปยัง stdout พฤติกรรมเริ่มต้นคือการส่งเอาต์พุตคอนโซลไปยังตัวบันทึก

คุณสามารถดูทั้งหมดฉันท์เอกสารในวิกิพีเดียพุ่งพรวด


น่าเสียดายที่วิกินั้นดูเหมือนว่าแปลว่าเป็นรุ่น 0.5 เท่านั้น สำหรับฉันมันแปลกมากที่การเปลี่ยนแปลงที่สำคัญเช่นนั้นถูกบันทึกไว้ในแบบนั้น
chiggsy

รุ่น 0.5 เท่านั้นคืออะไร
Jim Mitchener

วิกิโดยทั่วไป หน้าคนเป็นปกติ แต่พวกเขาแน่ใจว่าไม่ใช่หน้า 'ข้อมูล' ซึ่งมักจะมีรายละเอียดมากกว่านี้
chiggsy


0

แปลกไม่มีคำตอบที่นี่จริง ๆ ทำงานอย่างเต็มที่ตามที่พวกเขาออกจากพุ่งพรวดในสถานะหยุด / ฆ่าซึ่งป้องกันไม่ให้เริ่มทำงานอีก ซึ่งหมายความว่าrestart nginxล้มเหลว

ข้อผิดพลาดที่มีการพุ่งพรวดมีการบันทึกไว้อย่างดีที่https://bugs.launchpad.net/upstart/+bug/406397และฉันประหลาดใจที่ผู้เขียนพุ่งพรวดไม่สนใจที่จะแก้ไข ทางออกเดียวที่ฉันเห็นว่าทำงานได้ดังต่อไปนี้ (ถูกขโมยจากรายงานข้อผิดพลาดเดียวกัน):

# nginx - Nginx Web Server
#

description "Nginx Web Server"

start on (local-filesystems and
    (net-device-up IFACE=eth1 or net-device-up IFACE=eth0) )
stop on runlevel [!2345]

env DAEMON=/usr/local/sbin/nginx
env PID=/var/run/nginx.pid

respawn

pre-start script
$DAEMON -s stop 2> /dev/null || true
$DAEMON -t > /dev/null
$DAEMON
end script

script
sleepWhileAppIsUp(){
    while pidof $1 >/dev/null; do
    sleep 1
    done
}
sleepWhileAppIsUp $DAEMON
end script

post-stop script
if pidof > /dev/null $DAEMON;
then
    $DAEMON -s stop
fi
end script

ข้อดีของการเขียนแบบนี้ก็คือแม้กระทั่งการเกิดใหม่ ข้อเสียคือมันน่าเกลียดและน่ารังเกียจ


พุ่งพรวดเป็นผลิตภัณฑ์ที่ตายแล้ว อูบุนตูเกือบจะเป็นตัวกระจายการใช้งานล่าสุด คนอื่น ๆ ทั้งหมดเปลี่ยนไปหรือเปลี่ยนไปแล้ว
Michael Hampton

แม้แต่ Ubuntu เองก็เปลี่ยนไปใช้ systemd ในเวอร์ชันที่ใหม่กว่า แต่เราบางคนดูแลระบบยังคงติดอยู่กับ 14.04 เพราะ LTS
Ivan Anishchuk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.