我似乎无法让 Apache 在任何端口上启动。我总是收到错误:
apache2(98)Address already in use: AH00072: make_sock: could not bind to address [::]:80
我检查以确保端口 80 上没有运行任何内容,为了确定netstat -plant|grep 80
我什至运行时没有出现任何问题。sudo nc -l 80
我想这可能是一个权限问题(不应该,因为它应该从 initscript 开始),所以我将 Apache 的监听端口更改为 8080,除了端口 8080 之外,得到了相同的错误(并且没有任何东西在运行)那个端口)。我什至尝试设置ports.conf
为有Listen 127.0.0.1:80
,甚至Listen 127.0.0.1:8080
仍然或多或少相同的错误,除了显示相应的地址和端口之外。
我应该指出,我使用的是 Debian Unstable。
此时,我不知道还要检查什么。
答案1
从您的 strace 文件中,这是您的问题:
[pid 23020] setsockopt(5, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
[pid 23020] setsockopt(5, SOL_SOCKET, SO_KEEPALIVE, [1], 4) = 0
[pid 23020] setsockopt(5, SOL_IPV6, IPV6_V6ONLY, [0], 4) = 0
[pid 23020] setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
[pid 23020] bind(5, {sa_family=AF_INET6, sin6_port=htons(80), inet_pton(AF_INET6, "::", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = 0
[pid 23020] listen(5, 511) = 0
[pid 23020] setsockopt(7, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
[pid 23020] setsockopt(7, SOL_SOCKET, SO_KEEPALIVE, [1], 4) = 0
[pid 23020] setsockopt(7, SOL_IPV6, IPV6_V6ONLY, [0], 4) = 0
[pid 23020] setsockopt(7, SOL_TCP, TCP_NODELAY, [1], 4) = 0
[pid 23020] bind(7, {sa_family=AF_INET6, sin6_port=htons(80), inet_pton(AF_INET6, "::", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 EADDRINUSE (Address already in use)
[pid 23020] write(2, "(98)Address already in use: AH00"..., 82(98)Address already in use: AH00072: make_sock: could not bind to address [::]:80
) = 82
你会注意到bind
正在被呼叫两次。第一次有效。第二次,它失败了,因为该地址已被使用——确实如此,因为它刚刚被绑定。
Listen 80
我已经在我的 apache 配置(Debian 上的 Apache 2.4 测试/不稳定)上确认,我可以通过两次配置来实现这一点。我怀疑你也做过同样的事情,或者非常相似的事情。
答案2
看起来您的问题可能与尝试绑定 IPV6 地址而不是 IPV4 有关。示例 Apache 尝试绑定到 ::1 和 127.0.0.1,因为您没有配置 IPv6 - 它尝试绑定 127.0.0.1 两次。解决方案:
检查 localhost 是否解析为 IPv4 IP(getent 主机 localhost)
如果您不使用 IPv6(尤其是 localhost 地址),请检查 /etc/hosts 并删除所有 IPv6 地址
如果您无法更新/etc/hosts
- 更改httpd.conf
或ports.conf
绑定到 IP,而不是名称(监听 127.0.0.1:80)。
答案3
从错误消息来看,Apache 正在尝试使用 IPv6 进行绑定。您的主机是否启用了 IPv6?