Apache ไม่สามารถเริ่มต้นได้มีการใช้ที่อยู่แล้ว (แต่ไม่ใช่จริงๆ)


58

ฉันพยายามตั้งค่า VM ที่ใช้ Ubuntu 12.04 ฉันมีโฮสต์เสมือนสองโฮสต์ที่กำหนดค่าโดยใช้พอร์ต 80 แต่ Apache จะไม่เริ่มทำงาน

ฉันได้รับข้อผิดพลาดนี้:
(98) Address already in use: make_sock: could not bind to address 0.0.0.0:80

ผลลัพธ์ของการnetstat -tulpnแสดงให้เห็นว่าไม่มีอะไรที่ใช้พอร์ต 80 สิ่งที่อาจทำให้เกิดปัญหานี้?


คุณเริ่มต้นเป็นรากหรือไม่ โดยค่าเริ่มต้นรากเท่านั้นที่สามารถเปิดพอร์ตด้านล่าง 1024
โดยจัดหา

ใช่ฉันเป็น มันกำลังทำงานอยู่ ณ จุดหนึ่งเมื่อฉันมีโฮสต์เสมือนเพียงหนึ่งที่กำหนดค่าดังนั้นฉันจึงลบโฮสต์เสมือนอื่นออกเพื่อพยายามแก้ไขปัญหา แต่ก็ไม่โชคดีเช่นกัน
มือปืนบาร์นส์

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

คุณได้ลองใช้คำแนะนำจากการเริ่มต้น apache ล้มเหลว (ไม่สามารถผูกกับที่อยู่ 0.0.0.0:80) ? และโปรด ได้แก่ การส่งออกของและgrep -ri listen /etc/apache sudo netstat -ntlp | grep 80
gertvdijk

2
grep -ri listen /etc/apache2เอาท์พุต: etc / apache2 / httpd.conf: ฟัง 80 /etc/apache2/httpd.conf: ฟัง 443 /etc/apache2/ports.conf: ฟัง 80 /etc/apache2/httpd.conf: ฟัง 443 / etc / apache2 / httpd.conf: ฟังเพลง 443 sudo netstat -ntlp | grep 80ไม่แสดงผลอะไรเลย
มือปืนบาร์นส์

คำตอบ:


38

ตรวจสอบให้แน่ใจว่าคุณไม่ได้ประกาศListen 80สองครั้งในไฟล์. conf

ตัวอย่างเช่นคุณอาจมีมันทั้งในและโรงแรมports.confsites-enabled/www.conf

หากต้องการค้นหาให้ใช้: grep -ri listen /etc/apache2

เก็บไว้Listen 80ในที่เดียว


19

ตอบวิธีที่ฉันแก้ไขปัญหานี้ อาจเป็นประโยชน์กับใครบางคนในอนาคต

ลอง netstat -ltnp | grep :80

นี่จะกลับมาเหมือน

tcp6 0 0 ::: 80 ::: * ฟัง 1047 / apache2

จากนั้นเรียกใช้

sudo kill -9 1047

ที่ 1047 เป็น pid ของโปรแกรมที่ทำงานบนพอร์ต 80 คุณสามารถแทนที่ pid ที่คุณได้รับ netstat


ว้าว! ... และที่นี่ฉัน 48 ชั่วโมงหลังจากส่งตั๋วไปยัง inmotionhosting และรอการตอบกลับ ขอบคุณ
Amjo

2
สิ่งนี้หมายความว่า? ฉันไม่ได้รับ PID หรือชื่อ tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN -
Aaron Franke

@AaronFranke คุณช่วยลองใช้คำสั่งนี้ใน Terminal หลังจากขยายขนาดหน้าต่างได้หรือไม่?
Platypus ไม่เปิดเผยตัว

2
@AaronFranke รันด้วย sudo คุณอาจไม่ได้รับอนุญาตให้ดู
Advait S

13

เมื่อฉันมีปัญหานี้มันกลับกลายเป็นว่า Apache ของฉันไม่สามารถเริ่มระบบได้เนื่องจากฉันมีไซต์ SSL ที่ต้องป้อนรหัสผ่านสำหรับใบรับรอง

วิธีที่ดีที่จะบอกได้ว่านี่เป็นกรณีสำหรับคุณหรือไม่ps -ef | grep apache: ถ้าสิ่งนี้ส่งคืนกระบวนการที่มีลักษณะเป็นเช่น/bin/bash /usr/share/apache2/ask-for-passphrase mysite.com:443 RSAนั้นก็กำลังรอให้ป้อนรหัสผ่านในเทอร์มินัลที่คุณจะไม่เห็น

อันดับแรกฉันฆ่ากระบวนการที่หยุดทำงาน (การส่ง a kill -HUPไปยัง ID กระบวนการสำหรับกระบวนการ / usr / sbin / apache2 ควรเพียงพอที่จะฆ่ากระบวนการอื่นด้วย แต่ทำอย่างอื่นps -ef | grep apacheเพื่อให้แน่ใจ)

จากนั้นฉันทำตามคำแนะนำในโพสต์นี้เพื่อสร้างไฟล์รหัสผ่าน SSL ที่ไม่ต้องป้อนรหัสผ่าน จากนั้นก็ใช้service apache2 startงานได้ดีและ Apache เริ่มต้นอย่างถูกต้องหลังจากรีบูต


11

ฉันได้รับข้อผิดพลาดนี้ในการติดตั้งใหม่เมื่อเริ่ม apache2 Ubuntu 12.10

มันเป็นข้อผิดพลาดใน apache2 มันแขวนอยู่ด้านหลัง นี่คือคำแนะนำของฉันถึงจุดที่อาจมีข้อบกพร่องในซอฟต์แวร์

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

el@titan:~$ sudo service apache2 start
 * Starting web server apache2               
(98)Address already in use: 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]

ที่อยู่ในการใช้งานอยู่แล้ว? สิ่งที่สามารถใช้งานได้? ลองดูสิ:

el@titan:~$ grep -ri listen /etc/apache2
/etc/apache2/apache2.conf:#   supposed to determine listening ports for incoming connections, and which
/etc/apache2/apache2.conf:# Include list of ports to listen on and which to use for name based vhosts
/etc/apache2/ports.conf:Listen 80
/etc/apache2/ports.conf:    Listen 443
/etc/apache2/ports.conf:    Listen 443

นั่นหมายความว่า apache2 ป้องกันไม่ให้ apache2 เริ่มทำงาน แปลกประหลาด สิ่งนี้จะยืนยัน:

el@titan:~$ ps -ef | grep apache2
root      1146   954  0 15:51 ?        00:00:00 /bin/sh /etc/rc2.d/S91apache2 start
root      1172  1146  0 15:51 ?        00:00:00 /bin/sh /usr/sbin/apache2ctl start
root      1181  1172  0 15:51 ?        00:00:00 /usr/sbin/apache2 -k start
root      1193  1181  0 15:51 ?        00:00:00 /bin/bash /usr/share/apache2/ask-for-passphrase 127.0.1.1:443 RSA
el        5439  5326  0 16:23 pts/2    00:00:00 grep --color=auto apache2

ใช่ในกรณีนี้ apache2 กำลังทำงานอยู่ฉันพยายามเริ่ม apache2 เป็นครั้งที่สองบนพอร์ตเดียวกัน

สิ่งที่ทำให้ฉันสับสนคือserviceรายงานว่า apache2 ไม่ทำงาน:

el@titan:~$ sudo service apache2 status
Apache2 is NOT running.

และเมื่อคุณสอบถาม apache2ctl สำหรับสถานะของมันแฮงค์

root@titan:~# /usr/sbin/apache2ctl status
**hangs until Ctrl-C is pressed.

ดังนั้น Ubuntu ดูเหมือนจะมีปัญหาในการจัดการ apache2 ในการบูท เวลาที่จะหยุด apache2:

root@titan:~# /usr/sbin/apache2ctl stop
httpd (no pid file) not running

เบาะแสใหญ่! คุณพยายามหยุด apache2 และสูญเสียรหัสกระบวนการ! ดังนั้น Ubuntu จึงไม่สามารถหยุด apache2 ได้เพราะมันไม่รู้ว่าอยู่ที่ไหน!

คุณจะคิดว่าการรีบูตจะแก้ไขได้ แต่ก็ไม่ได้เพราะ apache2 เริ่มต้นในการบูตและแฮงค์ กระบวนการบูตปกติสำหรับ apache2 ไม่ทำงาน

ดังนั้นจะแก้ไขได้อย่างไร

ฉันสามารถแก้ไขได้โดยการวิเคราะห์psเอาต์พุตคำสั่ง ขอให้สังเกตว่าpsคำสั่งบอกเราว่ากระบวนการนั้นเริ่มต้นโดย "/etc/rc2.d/S91apache2 start"

นั่นคือโปรแกรมละเมิดที่ต้องการการเตะอย่างรวดเร็ว

/etc/rc2.d/S91apache2เป็นลิงก์สัญลักษณ์ที่ใช้ในการเริ่ม apache2 สำหรับคุณเมื่อคอมพิวเตอร์เริ่มทำงาน ด้วยเหตุผลบางอย่างดูเหมือนว่าจะเริ่ม apache2 แล้วแฮงค์ ดังนั้นเราจะต้องบอกให้ทำอย่างนั้นไม่ได้

/etc/rc2.d/S91apache2เพื่อไปดูที่ว่า

el@titan:/etc/rc2.d$ ls -l
lrwxrwxrwx   1 root root    17 Nov  7 21:45 S91apache2 -> ../init.d/apache2*

มันเป็นลิงค์สัญลักษณ์ที่เราไม่ต้องการให้อยู่ตรงนั้น ทำเช่นนี้เพื่อป้องกัน apache2 จากการเริ่มต้นในการบูต:

root@titan:~# sudo update-rc.d -f apache2 remove
 Removing any system startup links for /etc/init.d/apache2 ...
   /etc/rc0.d/K09apache2
   /etc/rc1.d/K09apache2
   /etc/rc2.d/S91apache2
   /etc/rc3.d/S91apache2
   /etc/rc4.d/S91apache2
   /etc/rc5.d/S91apache2
   /etc/rc6.d/K09apache2

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

root@titan:~$ sudo update-rc.d apache2 defaults     //(don't do this)
 Adding system startup for /etc/init.d/apache2 ...
   /etc/rc0.d/K20apache2 -> ../init.d/apache2
   /etc/rc1.d/K20apache2 -> ../init.d/apache2
   /etc/rc6.d/K20apache2 -> ../init.d/apache2
   /etc/rc2.d/S20apache2 -> ../init.d/apache2
   /etc/rc3.d/S20apache2 -> ../init.d/apache2
   /etc/rc4.d/S20apache2 -> ../init.d/apache2
   /etc/rc5.d/S20apache2 -> ../init.d/apache2

ให้เริ่มต้น apache2 ดังนี้:

sudo service apache2 start

และ apache2 จะสำรองและแสดงหน้าอีกครั้ง ดูเหมือนว่าจะมีข้อบกพร่องที่ร้ายแรงด้วย apache2 / Ubuntu 12.10 ที่ทำให้ apache2 เริ่มต้นและหยุดทำงาน นี่เป็นวิธีแก้ปัญหาฉันคิดว่าการแก้ไขคือรับ apache2 และ Ubuntu รุ่นใหม่กว่าและหวังว่าจะดีที่สุด


สนุกกับการอ่านและใช้เคล็ดลับของคุณ! ขอบคุณสำหรับการเขียน 'วิธีที่คุณ deb deb มัน'!
Ram

10

ฉันมีเซิร์ฟเวอร์ Nginx ที่ฟังเซิร์ฟเวอร์ AWS EC2 ของฉันฉันคิดว่ามันได้รับการกำหนดค่าเมื่อฉันสร้าง EC2 ดังนั้นฉันจึงได้รับที่อยู่ที่ใช้งานผิดพลาด ดังนั้นฉันจึงหยุดบริการและเริ่มบริการ Apache2:

sudo service nginx stop
sudo service apache2 start

ขอบคุณตัน! หลังจากพยายามทั้งหมดนี้ได้ผลสำหรับฉัน
Vivek

4

ฉันคิดออกแล้ว ฉันมีคำสั่ง Listen 80 ซ้ำทั้งใน httpd.conf และ ports.conf ของฉัน

นอกจากนี้ในการคัดลอกไฟล์ปรับแต่งสำหรับเซิร์ฟเวอร์ที่กำลังทำเวอร์ชวลไลเซชันฉันไม่สนใจที่จะสังเกตเห็นว่ามีการเปลี่ยนแปลงไดเรกทอรีบันทึกข้อผิดพลาด เมื่อมองดูบันทึกข้อผิดพลาดนั้นฉันสังเกตว่าไดเรกทอรีของmime.typesไฟล์ปรับแต่งนั้นไม่ถูกต้องในhttpd.confไฟล์ของฉัน ฉันอัปเดตพารามิเตอร์นั้นและเซิร์ฟเวอร์เริ่มต้นได้ดี


3
ฉันยังมีListen 80คำสั่งที่ซ้ำกันทั้งของฉันhttpd.confและports.conf
Gunner Barnes

2

หมายความว่าคุณกำลังใช้พอร์ต 80 อยู่แล้วเปลี่ยนพอร์ตสำหรับ apache2 (ซึ่งฉันไม่แนะนำ) โดยแก้ไข:

/etc/apache2/ports.conf

หรือปิดแอปพลิเคชันที่ทำงานอยู่ที่พอร์ต 80:

netstat -antp | grep 80

เพื่อค้นหาสิ่งที่ทำงานอยู่บนพอร์ต 80


netstat -antp | grep 80แสดงผลอะไรเช่นกัน
มือปืนบาร์นส์

คุณสามารถคัดลอกและวางผลลัพธ์ของ netstat -antp | grep 80
Dylan Dodds

ไม่มีเอาต์พุตอย่างแท้จริง
มือปืนบาร์นส์

อืมแปลกไปลองเปลี่ยนพอร์ตเป็น 81 ถ้าไม่ใช่ไม่ใช่พอร์ตที่ถูกบล็อกมีข้อผิดพลาดอื่นคุณสามารถตรวจสอบข้อผิดพลาด apache2 ใน /var/log/apache2/error.log
Dylan Dodds

2

เป็นเพียงคำใบ้สำหรับทุกคนที่อาจใช้ VirtualBox กับเครือข่าย NAT ฉันพบว่ามีกฎ NAT ระหว่างแขกของฉันและโฮสต์ได้ตั้งค่าตัวเองผูกพอร์ต


2

ไม่เพียง แต่พูดถึงซ้ำกัน

Listen 80

แต่ยังพูดถึงเรื่องนี้นอกเหนือจากฟัง 80

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