วิธีตั้งค่าการพึ่งพาบริการ systemd


17

ในระหว่างการเริ่มต้นระบบการเริ่มต้น CentOS 7 nginx ล้มเหลวด้วยข้อผิดพลาดต่อไปนี้:

2014/08/04 17:27:34 [emerg] 790#0: bind() to a.b.c.d:443 failed (99: Cannot assign requested address)

ฉันสงสัยว่าสิ่งนี้เกิดขึ้นเนื่องจากอินเทอร์เฟซเครือข่ายยังไม่พร้อมก่อนที่จะพยายามผูกกับที่อยู่ IP นั้นเพื่อให้บริการ vhost ผ่าน SSL

ฉันเดาว่าฉันต้องระบุ network.service เป็นข้อกำหนดสำหรับ nginx.service แต่ฉันไม่พบบริการเครือข่ายใน / etc / systemd / เลย

ฉันจะกำหนดค่าใบสั่งงานบริการหรือการขึ้นต่อกันใน systemd ได้อย่างไร?


1
คุณไม่ได้มองหาการพึ่งพาการบริการมากกว่าคำสั่งซื้อหรือไม่
CVn

จุดดี! Updated
vincent.io

1
สิ่งนี้อาจช่วยได้: serverfault.com/questions/482730/…
Belmin Fernandez

ขอบคุณที่แก้มัน! รังเกียจที่จะใส่ไว้ในคำตอบเพื่อที่ฉันจะได้ปิดมัน? :)
vincent.io

ลบคำตอบของฉัน แหล่งที่มาของคำตอบนั้นโพสต์ (นายแฮมป์ตัน) ควรทำเครื่องหมายว่าเขาเป็นคำตอบที่ถูกต้อง
Belmin Fernandez

คำตอบ:


19

อย่างน้อยที่สุดคุณต้องมีอย่างน้อยที่สุดAfter=network.targetใน[Unit]ส่วนของไฟล์หน่วยของคุณเพื่อให้แน่ใจว่าเครือข่ายพร้อมใช้งานก่อนเริ่ม nginx ฉันไม่รู้ว่าทำไมไฟล์หน่วยของคุณไม่มี

นี่เป็นตัวอย่างที่สมบูรณ์จากระบบ Fedora ที่มีประโยชน์ของฉันซึ่งจัดส่งโดย Fedora:

[Unit]
Description=The nginx HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

ขอบคุณคำตอบยอดเยี่ยม! ฉันติดตั้ง nginx จากที่เก็บ remi (บุคคลที่สาม) ซึ่งอาจอธิบายได้ว่าทำไม "After" หายไปในไฟล์หน่วย
vincent.io

1
น่าสนใจ ฉันจะส่งข้อความถึงเขาและแจ้งให้เขาทราบเกี่ยวกับปัญหา แพ็คเกจของเขามักจะมีคุณภาพสูงมากและฉันไม่แน่ใจว่าเขาจะพลาด
Michael Hampton

คำแนะนำยอดเยี่ยมเสร็จแล้ว
vincent.io

5

จากบันทึกข้อผิดพลาดดูเหมือนว่าการกำหนดค่า nginx ของคุณ ไฟล์มีคำสั่งการฟังพร้อมที่อยู่ IP ที่ชัดเจน:

listen a.b.c.d:443

ซึ่งหมายความว่า nginx จะไม่เริ่มทำงานจนกว่าอินเทอร์เฟซเครือข่ายของคุณจะขึ้นและ IP abcd ได้รับการกำหนดให้กับอินเทอร์เฟซ

คุณมีสองทางเลือก:

  • เปลี่ยนคำสั่งฟังเป็น: ฟัง 443; (ผูกกับที่อยู่ IP ทั้งหมด)
  • ทำให้ nginx ขึ้นอยู่กับ network-online.target

ตามที่อธิบายไว้ในhttp://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ network.target ระบุว่าการจัดการเครือข่ายสแต็คขึ้น [... ] ว่ามีการกำหนดค่าอินเทอร์เฟซเครือข่ายใด ๆ หรือไม่เมื่อถึง ไม่ได้กำหนด

หากคุณต้องการตรวจสอบให้แน่ใจว่าที่อยู่ IP ได้รับการกำหนดแล้วและอินเทอร์เฟซขึ้นคุณต้องเพิ่ม network-online.target ไปยังไฟล์ systemd unit ของ nginx ของคุณ

ไฟล์ /etc/systemd/system/multi-user.target.wants/nginx.service ของคุณควรมี network-online.target ในบรรทัด After = และ Need =

[Unit]
Description=The nginx HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target network-online.target
Requires=network-online.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

1
+1 สำหรับการกล่าวถึงnetwork-online.target- ในกรณีที่มีคนสงสัยเช่นกัน: ใช่ทั้งสองRequires=และAfter=จำเป็นเพราะRequires=(น่าแปลกใจที่เนื้อหา) ไม่ได้หมายความถึงการสั่งซื้อระหว่างหน่วยที่ต้องการและหน่วยที่ต้องการ
maxschlepzig
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.