Apache启动失败,地址已在使用中(但实际上并没有)。

我正在尝试设置一个运行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。这可能是什么原因造成的呢?

你是以root用户身份启动它吗?默认情况下,只有root用户才能打开1024以下的端口。 - onse
是的,我是。一开始当我只配置了一个虚拟主机时,它是可以运行的,所以后来我删除了另一个虚拟主机,试图解决这个问题,但仍然没有成功。 - Gunner Barnes
你的主机是否在80端口上运行了某个服务,并且你的客户机处于桥接模式?我不确定它是否会这样做,但似乎很有可能。 - RobotHumans
你尝试过[启动apache失败(无法绑定到地址0.0.0.0:80)](http://askubuntu.com/q/122200/88802)中的建议了吗?还请包括`grep -ri listen /etc/apachesudo netstat -ntlp | grep 80`的输出。 - gertvdijk
2grep -ri listen /etc/apache2输出: etc/apache2/httpd.conf:Listen 80 /etc/apache2/httpd.conf:Listen 443 /etc/apache2/ports.conf:Listen 80 /etc/apache2/httpd.conf:Listen 443 /etc/apache2/httpd.conf:Listen 443sudo netstat -ntlp | grep 80没有任何输出。 - Gunner Barnes
如果您在配置文件中定义了两次或更多次的“Listen xx port”,那么也会出现此错误。在这种情况下,您定义了两次“Listen 80”端口。 - Cristian Florescu
12个回答

确保您在.conf文件中不要声明两次Listen 80
例如,您可能同时在ports.confsites-enabled/www.conf中都有它。
要找出,请使用:grep -ri listen /etc/apache2Listen 80只保留在一个地方。

回答一下我是如何解决这个问题的。也许对将来的某人有所帮助。
尝试运行 `netstat -ltnp | grep :80`
这会返回类似以下内容:
``` tcp6 0 0 :::80 :::* LISTEN 1047/apache2 ```
然后运行
sudo kill -9 1047

在这里,1047是运行在端口80上的程序的进程ID。您可以用从netstat获得的进程ID替换它。

哇!...我在发送了一张票据给InMotion Hosting后,已经等待了48个小时,还没有收到回复。谢谢你。 - Amjo
8这是什么意思?我没有得到一个PID或者名字。tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN - - Aaron Franke
@AaronFranke请尝试在最大化窗口后在终端中运行此命令。 - Anonymous Platypus
7@AaronFranke 用sudo运行它。你可能没有查看的权限。 - Advait Saravade
谢谢!多年过去了,但是你的解决方案真的救了我! - jimb

我在我的AWS EC2服务器上有一个监听的Nginx服务器,我认为它是在我构建EC2时配置的,因此我遇到了“地址已在使用”的错误。所以我停止了该服务并启动了Apache2服务。
sudo service nginx stop
sudo service apache2 start

非常感谢!经过多次尝试,这个方法对我起作用了。 - Vivek
在 Digital Ocean 上预配置的 LAMP 中遇到了相同的问题。 - Rob
我只记得安装了Apache2,并跳过了这个答案。然后尝试了其他的答案,但都没有起作用。但是当我尝试了这个答案时,现在它可以工作了。谢谢你。 - Muklas

我在安装apache2 Ubuntu 12.10时遇到了这个错误。
这是apache2的一个bug。它在后台卡住了。以下是我对软件中可能存在的bug的解释。
这是我遇到的错误:
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,但它丢失了进程ID!所以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不会启动和挂起。好的,现在你可以把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存在一些严重的bug,导致apache2启动后卡住。这是一个解决方法,我想修复的办法是获取更新版本的apache2和Ubuntu,并希望能够解决问题。

1很喜欢阅读并使用你的建议!谢谢你写下“你调试的方式”! - RamValli
太棒了,指导得很好!帮了大忙,尤其是你真实地描述了你的故障排除方法! - Jonathan Rhein

当我遇到这个问题时,原来是因为我的Apache无法在启动时启动,因为我有一个需要输入密码的SSL站点。
一个判断是否是这种情况的好方法是运行ps -ef | grep apache:如果返回的进程看起来像/bin/bash /usr/share/apache2/ask-for-passphrase mysite.com:443 RSA,那么它正在等待在你永远看不到的终端中输入密码。
首先,我杀掉了挂起的进程(向/usr/sbin/apache2进程的进程ID发送kill -HUP应该足以杀死其他进程,但是再运行一次ps -ef | grep apache以确保)。
然后,我按照此帖子中的说明创建了一个不需要输入密码的SSL密码文件。然后,service apache2 start正常工作,并且Apache在重新启动后正确启动。

我已经弄清楚了。我的httpd.conf和ports.conf文件中都有重复的Listen 80命令。
此外,在复制用于虚拟化的服务器的配置文件时,我忽略了错误日志目录已经更改的事实。查看了该错误日志后,我注意到在我的httpd.conf文件中,mime.types配置文件的目录设置不正确。我更新了该参数,服务器成功启动了。

3жҲ‘зҡ„httpd.confе’Ңports.confж–Ү件дёӯйғҪжңүйҮҚеӨҚзҡ„Listen 80е‘Ҫд»ӨгҖӮ - Gunner Barnes

不仅仅是重复提到的
Listen 80

但还要提到的是,除了Listen 80之外还有这个。
Include ports.conf

1是的,这对我来说就是问题所在。记得检查 sites-available/ 文件 ports.conf。 - Jesse Reza Khorasanee

这意味着你的端口80已经被占用了,要么修改apache2的端口(我不建议这样做),方法是编辑:
/etc/apache2/ports.conf

关闭在端口80上运行的应用程序。
netstat -antp | grep 80

查找在端口80上运行的内容。

netstat -antp | grep 80 输出的结果也是空的。 - Gunner Barnes
你能复制并粘贴netstat -antp | grep 80的输出吗? - Dylan Dodds
真的没有任何输出。 - Gunner Barnes
嗯,这有点奇怪。如果不行的话,试着将端口改为81吧。如果不是端口被阻塞的问题,那就可能是其他错误了。你可以在 /var/log/apache2/error.log 中检查 Apache2 的错误日志。 - Dylan Dodds

只是给那些可能正在使用VirtualBox的NAT网络的人一个提示。我发现,在我的虚拟机和主机之间设置了一个NAT规则,绑定了端口。

我无法确定我的问题是什么。 使用grep -ri listen /etc/apache2命令,没有发现在端口80上的重复监听,并且使用netstat命令也没有看到其他应用程序在使用端口80。
我正在运行一个安装了证书的网站,所以最终我意识到我不一定需要在端口80上进行监听,于是我只是删除了/etc/apache2/ports.conf文件中的Listen 80行,现在一切正常运行。