ทำไมฉันถึงได้รับ“ ปฏิเสธการอนุญาต: make_sock: ไม่สามารถผูกที่อยู่” เมื่อเริ่ม Apache2


25

ฉันสามารถหยุดโดยใช้

/etc/init.d/apache2 stop

แต่เมื่อฉันต้องการเริ่มมันอีกครั้งโดยใช้:

/etc/init.d/apache2 start

ฉันได้รับข้อผิดพลาดนี้:

Starting web server apache2                                                  /usr/sbin/apache2ctl: 87: ulimit: error setting limit (Operation not permitted)
apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
(13)Permission denied: make_sock: could not bind to address [::]:80
(13)Permission denied: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
Action 'start' failed.
The Apache error log may have more information.
                                                                         [fail]

คำตอบ:


50

บางคำเกี่ยวกับข้อผิดพลาดที่คุณได้รับซึ่งหวังว่าจะช่วยให้คุณประหยัดจากสถานการณ์ที่คล้ายกันในอนาคต

ในพอร์ต Linux ตั้งแต่ 0 ถึง 1024 ถูกสงวนไว้สำหรับการใช้งานระบบ ซึ่งหมายความว่าในการใช้งานคุณต้องมีสิทธิ์ในการเปลี่ยนแปลง - เข้าถึงการตั้งค่าระบบพื้นฐาน ผู้ใช้รูทมีสิทธิ์ดังกล่าวและสามารถใช้พอร์ตได้จริงในช่วง 0 - 1024

ในปัญหาของคุณอย่างที่คุณเห็นระบบผ่านการตอบสนอง Apache2 ระบุว่ารากของปัญหา ([... ] ไม่สามารถผูกกับที่อยู่ blah blah 80 ):

(13)Permission denied: make_sock: could not bind to address [::]:80
(13)Permission denied: make_sock: could not bind to address 0.0.0.0:80

เมื่อ Apache2 http daemon เริ่มทำงานมันจะพยายามผูกพอร์ต 80 พอร์ตเนื่องจากเป็นพอร์ตเริ่มต้นสำหรับใช้ใน HTTP seeซึ่งเป็นพอร์ตภายในพอร์ตที่ระบบกำหนดและสามารถเข้าถึงได้โดยรูทเท่านั้น

คุณดำเนินการคำสั่งเริ่มต้นในฐานะผู้ใช้ทั่วไปโดยไม่มีสิทธิ์รูทและทำให้ความล้มเหลวในการทำเช่นนั้น

ในคำง่าย ๆ :

คุณ:

สวัสดี Apache2 ฉันคือ Kongthap และฉันบอกให้คุณเริ่ม ( /etc/init.d/apache2 start)

apache2:

ตกลง. ฉันกำลังเริ่มต้น (การเริ่มต้นเว็บเซิร์ฟเวอร์ apache2)

ระบบโปรดให้พอร์ต 80 เพื่อใช้และรับฟังการเชื่อมต่อ

ระบบ:

ตกลง. สักครู่เพื่อตรวจสอบ ...

อ่า ... ขอโทษ Apache2 แต่ฉันไม่สามารถให้คุณวิ่งที่ 80 พอร์ตมันเป็นของใช้ส่วนตัว

และคุณไม่มีสิทธิ์ที่ถูกต้องในการผูกมัน ( Operation not permitted)

apache2:

โอ้โห Kongthap ฉันล้มเหลวในการเริ่มระบบไม่ยอมให้ฉันทำ ( (13)Permission denied:[...])

ข้อสรุป

มีสองวิธีแก้ปัญหานี้เป็นหลัก:

  1. รัน Apache2 HTTP daemon ด้วยสิทธิ์พิเศษโดยใช้sudo:

    sudo service apache2 start
    

    หรือ:

    sudo /etc/init.d/apache2 start
    
  2. เปลี่ยนพอร์ตเริ่มต้นจาก80บางสิ่งบางอย่างที่ยิ่งใหญ่กว่า1024การพูด2000, 2500, 9000ฯลฯ พอร์ตโดยทั่วไปจะเรียกใช้เมื่ออยู่ในสถานการณ์ดังกล่าว8080

    sudo vi /etc/apache2/ports.conf
    

    มองหาหรือไม่เพิ่ม:

    Listen 8080
    

    หรือพอร์ตอื่น ๆ ที่คุณเลือกเช่นพอร์ต> 1024และพอร์ตที่เลือกไม่ได้ใช้โดยกระบวนการอื่น


4
คำอธิบายที่ยอดเยี่ยมจริงๆ !!!
Artisan

คำอธิบายที่ดีเข้าใจดี!
Mwirabua Tim

คำอธิบายที่ดี ทำไมการใช้serviceวิธีการที่ต้องการ?
Holloway

พวกเขาจะพุ่งพรวดสั่งตรวจสอบคำถามและคำตอบนี้askubuntu.com/q/19320/12218และดูรายละเอียดเพิ่มเติมตรวจสอบพุ่งพรวดตำราupstart.ubuntu.com/cookbook โปรดจำไว้ว่าสิ่งเหล่านี้หมายถึงการจัดการบริการ (daemon) (เมื่อใดและอย่างไรที่จะเริ่มต้น) คำถามนี้และคำตอบของฉันยังจัดการปัญหาการอนุญาต
Stef K

ความเงียบสงบไร้ความจำเป็น คำตอบไม่ได้แก้ไขปัญหา
reggie

7

ต่อไปนี้เป็นคำสั่งเพื่อเริ่ม / หยุด / รีสตาร์ทเซิร์ฟเวอร์ apache:

  • เริ่ม:

    sudo /etc/init.d/apache2 start
    
  • หากต้องการหยุด:

    sudo /etc/init.d/apache2 stop
    
  • ในการรีสตาร์ท:

    sudo /etc/init.d/apache2 restart
    

หลังจากรีสตาร์ทคอมพิวเตอร์ดูเหมือนว่าใช้ได้กับคำสั่งทั้งหมดที่คุณแนะนำ แต่ฉันได้รับข้อความนี้ในระหว่างการรีสตาร์ท ... การรีสตาร์ทเว็บเซิร์ฟเวอร์ apache2 apache2: ไม่สามารถระบุชื่อโดเมนที่ผ่านการรับรองโดยเซิร์ฟเวอร์ได้อย่างน่าเชื่อถือโดยใช้ 127.0.1.1 สำหรับ ServerName
Artisan

1
@Kongthap: นั่นไม่ใช่ข้อผิดพลาด ฉันแน่ใจว่าเว็บเต็มไปด้วยคำอธิบายสำหรับข้อความนั้น
Andrea Corbellini

ใช่ @AndreaCorbellini ถูกต้อง ไม่ใช่ข้อผิดพลาดมันบอกว่าเนื่องจาก ip ของคุณไม่มีชื่อโดเมนที่ผ่านการรับรองอย่างเต็มรูปแบบเช่น mail.google.com
Saurav Kumar

4

ตรวจสอบบริบทพอร์ต selinux โดยใช้คำสั่ง

semanage port -l | grep http

หากมีอยู่ในรายการ http_port_t แสดงว่าเป็นปกติมิฉะนั้นจะเพิ่มพอร์ตของคุณ

semanage port -a -t http_port_t -p tcp 80

หรือสิ่งที่คุณต้องการมอบหมาย


1

นี่เป็นข้อผิดพลาด selinux หรืออย่างน้อยก็ในกรณีของฉัน ทั้งเปลี่ยนแบบบูล, ปิดการใช้งาน selinux setenforce 0หรือตั้งค่าสำหรับการอนุญาตด้วย

การเปลี่ยนแปลงบูลีนจะทำให้คุณต้องเรียกใช้getenforce -a | grep httpและมองหา "allow http connect network" คัดลอกและแทนที่ "เปิด" ที่รายการแจ้งว่า "ปิด"


Ubuntu ใช้ AppArmor ไม่ใช่ SELinux ดังนั้นคำตอบของคุณไม่เกี่ยวข้องกับ Ubuntu
sgx1

ในฐานะผู้ใช้ centos ที่มีปัญหานี้และนี่เป็นคำถาม stackoverflow แรกที่เกิดขึ้นฉันขอขอบคุณสำหรับความช่วยเหลือในการแก้ไขปัญหาของฉัน
Cacoon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.