Score:0

ฉันจะทำให้ Apache เริ่มทำงานเมื่อระบบได้รับที่อยู่จาก DHCP ได้หรือไม่

ธง au

ฉันใช้ Ubuntu ใน VM เพื่อจุดประสงค์ในการติดตั้ง Wordpress ในเครื่องซึ่งจำเป็นต้องทำการทดสอบในเครื่อง

เพื่อจุดประสงค์นี้ ฉันได้กำหนดค่าโหมดเครือข่ายของเครื่องนี้ใน VirtualBox เพื่อบริดจ์ กำหนดค่าเราเตอร์ที่บ้านของฉันให้เช่าที่อยู่ IP เดียวกันเสมอ (192.168.0.101) ไปยังที่อยู่ MAC ของ VM นี้ และกำหนดค่า Apache ให้รับฟังที่อยู่นี้ etc/apache2/ports.conf:

ฟัง 192.168.0.101:80

<IfModule ssl_module>
        ฟัง 192.168.0.101:443
</หากโมดูล>

<IfModule mod_gnutls.c>
        ฟัง 192.168.0.101:443
</หากโมดูล>

ผลลัพธ์ที่น่าเสียดายคือ Apache มักจะปฏิเสธที่จะเริ่มต้นระบบเมื่อบูตระบบ:

m@m-VirtualBox:~$ sudo systemctl สถานะ apache2
[sudo] รหัสผ่านสำหรับ m: 
à apache2.service - เซิร์ฟเวอร์ Apache HTTP
     โหลดแล้ว: โหลดแล้ว (/lib/systemd/system/apache2.service; เปิดใช้งาน; การตั้งค่าล่วงหน้าของผู้ขาย: เปิดใช้งาน)
     ใช้งานอยู่: ล้มเหลว (ผลลัพธ์: exit-code) ตั้งแต่ 22 พ.ค. 2564 16:12:19 CEST; 28s ที่ผ่านมา
       เอกสาร: https://httpd.apache.org/docs/2.4/
    กระบวนการ: 681 ExecStart=/usr/sbin/apachectl start (รหัส=ออก, สถานะ=1/ล้มเหลว)
        ซีพียู: 19ms

paź 22 16:12:19 m-VirtualBox systemd[1]: การเริ่มต้น Apache HTTP Server...
paź 22 16:12:19 m-VirtualBox apachectl[701]: (99)ไม่สามารถกำหนดที่อยู่ที่ต้องการ: AH00072: make_sock: ไม่สามารถผูกกับที่อยู่ 192.168.0.101:80
paź 22 16:12:19 m-VirtualBox apachectl[701]: ไม่มีซ็อกเก็ตการฟัง กำลังปิด
paź 22 16:12:19 m-VirtualBox apachectl[701]: AH00015: ไม่สามารถเปิดบันทึก
paź 22 16:12:19 m-VirtualBox apachectl[681]: การดำเนินการ 'เริ่มต้น' ล้มเหลว
ถัดไป 22 16:12:19 m-VirtualBox apachectl[681]: บันทึกข้อผิดพลาดของ Apache อาจมีข้อมูลเพิ่มเติม
paź 22 16:12:19 m-VirtualBox systemd[1]: apache2.service: ออกจากกระบวนการควบคุม, รหัส=ออก, สถานะ=1/ล้มเหลว
paź 22 16:12:19 m-VirtualBox systemd[1]: apache2.service: ล้มเหลวด้วยผลลัพธ์ 'exit-code'
paź 22 16:12:19 m-VirtualBox systemd[1]: ไม่สามารถเริ่มเซิร์ฟเวอร์ Apache HTTP

ฉันสามารถเริ่ม Apache ด้วยตนเองได้ตลอดเวลาด้วย sudo systemctl เริ่ม apache2 จากนั้น Apache ก็เริ่มทำงานได้สำเร็จ

ทำให้ Apache2 ฟัง 127.0.0.1 แทน 192.168.0.101 ยังทำให้ Apache เริ่มต้นการบูตระบบได้สำเร็จโดยไม่มีข้อผิดพลาดดังที่แสดงไว้ด้านบน

ดังนั้นฉันจึงสงสัยว่าปัญหาอาจเกิดจาก Apache พยายามเริ่มต้นก่อนที่ DHCP จะทำงานจนเสร็จ Apache พยายามฟังต่อไป 192.168.0.101แต่เครื่องยังไม่ได้กำหนดที่อยู่นี้ ดังนั้น Apache จึงถูกปฏิเสธและเกิดข้อผิดพลาด

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

in flag
คุณไม่จำเป็นต้องฟัง `192.168.0.101` เพียงใช้ค่าเริ่มต้นแล้วคุณจะสบายดี ฉันยังมี VirtualBox VM จำนวนหนึ่งที่ฉันใช้สำหรับการพัฒนาและทดสอบ ไม่มีพวกเขากำลังฟัง IP เฉพาะ ค่า `localhost` ก็เพียงพอแล้ว
gaazkam avatar
au flag
@matigo `localhost` ไม่เพียงพอเนื่องจากจะห้ามการเข้าถึงไซต์จากภายนอก VM และฉันต้องทำสิ่งนี้ การฟังบนอินเทอร์เฟซทั้งหมด (`ฟัง 80`) จะใช้งานได้ แต่ - แม้ว่าตามทฤษฎีแล้ว เราเตอร์ควรหยุดการเชื่อมต่อภายนอก - ฉันไม่แน่ใจว่าฉันพอใจหรือไม่
in flag
ที่นี่คุณสามารถใช้ Universal Firewall (`ufw`) เพื่ออนุญาตการรับส่งข้อมูลบนพอร์ต 80 จากเครือข่ายท้องถิ่นเท่านั้น
Score:2
ธง au

คำตอบก่อนหน้า (น่าเศร้าที่ตอนนี้ถูกลบไปแล้ว) โดยผู้ใช้ที่เป็นประโยชน์ซึ่งมีนิคทำให้ใจฉันหลุดไปแล้ว เกือบ ถูกต้อง.

ได้เสนอแนะให้แก้ไข /lib/systemd/system/apache2.service ไฟล์ที่จะทำให้มันขึ้นอยู่กับ network-online.target แทนค่าเริ่มต้น เครือข่าย.target หรือดีกว่าที่จะเพิ่มไฟล์ที่สองเข้าไป /lib/systemd/ระบบ เรียกว่า my-apache2.service ด้วยการปรับเปลี่ยนนี้ ตามเอกสารนี้เป็นวิธีที่ถูกต้องเพื่อให้แน่ใจว่าบริการจะเริ่มต้นเมื่อเครือข่ายใช้งานได้จริงเท่านั้น.

ในขณะที่สิ่งนี้ใช้งานได้ปัญหาก็คือ เนื้อหาของ /lib ไม่ควรแก้ไขและ /etc/systemd/ระบบ ควรใช้เพื่อการนี้แทน (ใช่ คำตอบนี้ฉันเชื่อมโยงกับข้อตกลงกับระบบอื่นที่ไม่ใช่ Ubuntu แต่กำลังอ่านอยู่ man 7 ลำดับชั้นของไฟล์ และ คนที่ 5 systemd.unit บน Ubuntu แสดงสิ่งเดียวกัน)

ปัญหาที่สองคือจากประสบการณ์ของฉัน การพยายามเรียกใช้ Apache2 สองครั้งทำให้เกิดปัญหา

เพื่อแก้ไขปัญหาทั้งสองคำตอบของฉันก่อนหน้านี้แนะนำให้สร้างบริการที่ขัดแย้งกัน /etc/systemd/ระบบ. อย่างไรก็ตาม สิ่งนี้ซับซ้อนเกินไปและล้มเหลวในการแก้ปัญหาบางอย่างข้างต้น กล่าวคือ มันไม่ใช่ข้อพิสูจน์ในอนาคต: การเปลี่ยนแปลงสู่สิ่งเดิม .บริการ ไฟล์ที่สร้างโดยผู้เขียนต้นน้ำจะไม่รวมอยู่ในไฟล์ใหม่ของเราโดยอัตโนมัติ .บริการ ไฟล์.

วิธีแก้ไขที่ถูกต้องคือสร้างไฟล์ดรอปอินที่เพิ่มไฟล์ใหม่ หลังจาก การพึ่งพาสิ่งเดิม apache2.serviceดังเอกสารโดย คนที่ 5 systemd.unit. ในการทำเช่นนั้นจำเป็นต้องป้อนคำสั่งต่อไปนี้:

# systemctl แก้ไข apache2.service

(ซึ่งบันทึกไว้ใน ผู้ชาย 1 ระบบctl)

...และเมื่อตัวแก้ไขเปิดขึ้นมาจำเป็นต้องป้อนเนื้อหาต่อไปนี้ ระหว่าง เดอะ ### อะไรก็ได้ระหว่างที่นี่และความคิดเห็นด้านล่าง... และ ###บรรทัดใต้คอมเม้นนี้... บรรทัด:

[หน่วย]
After=network-online.target

และบันทึกไฟล์ใหม่

โปรดทราบว่าตาม คนที่ 5 systemd.unit สิ่งนี้จะไม่แทนที่การพึ่งพาบริการเดิมหลังจากพึ่งพา; แต่จะเป็นการเพิ่มการพึ่งพาใหม่ให้กับสิ่งที่มีอยู่แล้ว

สำหรับการอ้างอิง นี่คือเนื้อหาต้นฉบับของ /lib/systemd/system/apache2.service:

[หน่วย]
คำอธิบาย=เซิร์ฟเวอร์ Apache HTTP
After=network.target remote-fs.target nss-lookup.target
เอกสาร=https://httpd.apache.org/docs/2.4/

[บริการ]
ประเภท = ส้อม
สภาพแวดล้อม=APACHE_STARTED_BY_SYSTEMD=จริง
ExecStart=/usr/sbin/apachectl start
ExecStop=/usr/sbin/apachectl หยุดอย่างสง่างาม
ExecReload=/usr/sbin/apachectl สง่างาม
KillMode=ผสม
PrivateTmp=จริง
เริ่มต้นใหม่ = เมื่อยกเลิก

[ติดตั้ง]
WantedBy=multi-user.target

จากนี้ไป Apache2 ไม่ควรล้มเหลวในการเริ่มระบบอีกต่อไป

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา