Apache 无法启动,地址已在使用中(但不是真的)

Gun*_*nes 73 virtualization apache2 12.04

我正在尝试设置运行 Ubuntu 12.04 的 VM。我有两个使用端口 80 配置的虚拟主机,但 Apache 无法启动。

我收到此错误:
(98) Address already in use: make_sock: could not bind to address 0.0.0.0:80

的输出netstat -tulpn显示没有使用端口 80。可能是什么原因导致的?

小智 47

确保您没有Listen 80在 .conf 文件中声明两次。

例如,您可能同时拥有 inports.conf和 inn sites-enabled/www.conf

要找出答案,请使用: grep -ri listen /etc/apache2

Listen 80在短短的一个地方。


Ano*_*pus 35

回答我解决这个问题的方式。将来可能对某人有帮助。

尝试 netstat -ltnp | grep :80

这将返回类似

tcp6 0 0 :::80 :::* 听 1047/apache2

然后运行

sudo kill -9 1047
Run Code Online (Sandbox Code Playgroud)

其中 1047 是运行在 80 端口上的程序的 pid。您可以替换您从中获取的 pid netstat

  • 这是什么意思?我没有得到 PID 或名称。`tcp 0 0 0.0.0.0:80 0.0.0.0:* 听 - ` (4认同)
  • @AaronFranke 使用 sudo 运行它。您可能没有查看权限。 (3认同)

小智 17

我有一个 Nginx 服务器在我的 AWS EC2 服务器上侦听,我认为它是在我构建 EC2 时配置的,因此我收到地址已经在使用错误。所以我停止了服务并启动了Apache2服务:

sudo service nginx stop
sudo service apache2 start
Run Code Online (Sandbox Code Playgroud)


Eri*_*ski 14

启动 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]
Run Code Online (Sandbox Code Playgroud)

地址已在使用中?什么可以使用它?一探究竟:

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
Run Code Online (Sandbox Code Playgroud)

这意味着 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
Run Code Online (Sandbox Code Playgroud)

是的,在这种情况下 apache2 正在运行,我试图在同一端口上第二次启动 apache2。

让我感到困惑的是,service报告说 apache2 没有运行:

el@titan:~$ sudo service apache2 status
Apache2 is NOT running.
Run Code Online (Sandbox Code Playgroud)

当您查询 apache2ctl 的状态时,它会挂起。

root@titan:~# /usr/sbin/apache2ctl status
**hangs until Ctrl-C is pressed.
Run Code Online (Sandbox Code Playgroud)

所以 Ubuntu 似乎在启动时管理 apache2 有问题。停止 apache2 的时间:

root@titan:~# /usr/sbin/apache2ctl stop
httpd (no pid file) not running
Run Code Online (Sandbox Code Playgroud)

一个大线索!您尝试停止 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*
Run Code Online (Sandbox Code Playgroud)

这是一个符号链接,我们不希望它出现在那里。这样做是为了防止 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
Run Code Online (Sandbox Code Playgroud)

重新启动计算机以确保 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
Run Code Online (Sandbox Code Playgroud)

相反,像这样启动 apache2:

sudo service apache2 start
Run Code Online (Sandbox Code Playgroud)

并且 apache2 已备份并再次提供页面。apache2/Ubuntu 12.10 似乎存在一些导致 apache2 启动和挂起的严重错误。这是一种解决方法,我想解决方法是获取较新版本的 apache2 和 Ubuntu,并希望获得最好的结果。


小智 13

当我遇到这个问题时,原来是因为我的 Apache 无法在启动时启动,因为我有一个 SSL 站点,需要为证书输入密码。

判断您是否属于这种情况的一个好方法是运行ps -ef | grep apache: 如果这返回的进程看起来像/bin/bash /usr/share/apache2/ask-for-passphrase mysite.com:443 RSA那么它正在等待在您永远不会看到的终端中输入密码。

首先,我杀死了挂起的进程(向kill -HUP/usr/sbin/apache2 进程的进程 ID发送 a应该足以杀死其他进程,但ps -ef | grep apache要确保再做一次)。

然后我按照这篇文章中的说明创建了一个不需要输入密码的 SSL 密码文件。然后service apache2 start工作正常,Apache 在重新启动后正常启动。


Gun*_*nes 4

我已经弄清楚了。我的 httpd.conf 和 ports.conf 中都有重复的 Listen 80 命令

另外,在复制正在虚拟化的服务器的配置文件时,我忽略了错误日志目录已更改。查看该错误日志,我注意到mime.types我的文件中配置文件的目录不正确httpd.conf。我更新了该参数,服务器启动正常。

  • 我的“httpd.conf”和“ports.conf”中也有重复的“Listen 80”命令 (3认同)