![端口 80 上间歇性出现“地址已在使用中:AH00072:make_sock:无法绑定到地址”](https://linux22.com/image/768639/%E7%AB%AF%E5%8F%A3%2080%20%E4%B8%8A%E9%97%B4%E6%AD%87%E6%80%A7%E5%87%BA%E7%8E%B0%E2%80%9C%E5%9C%B0%E5%9D%80%E5%B7%B2%E5%9C%A8%E4%BD%BF%E7%94%A8%E4%B8%AD%EF%BC%9AAH00072%EF%BC%9Amake_sock%EF%BC%9A%E6%97%A0%E6%B3%95%E7%BB%91%E5%AE%9A%E5%88%B0%E5%9C%B0%E5%9D%80%E2%80%9D.png)
答案1
获得地址已被使用错误:
另一台服务器使用该 IP:端口
在这种情况下,您尝试启动两个服务,并且它们都需要相同的地址和端口组合,这是不可能的。只有一个服务可以侦听一个特定端口。显然,您不处于这种情况。
同一台服务器重启得太快
默认情况下,内核会保留 IP:port 组合几秒钟(可能是一分钟),然后才允许服务再次使用这些组合。这是为了确保所有客户端都有机会收到正确的关闭信号。此外,出于安全原因,您最终可能会收到预期发送到旧连接的数据包。这可能会导致问题。
看起来您的情况就是这样,尽管我认为 Apache 会自动使用该
SO_REUSEADDR
标志。解决此问题的方法是查看重新启动的实现,并在关机和启动命令之间添加一个 sleep。如果您使用 init 脚本,这非常简单:[...snip...] ;; restart) log_daemon_msg "Restarting $DESC" "$NAME" do_stop stop case "$?" in 0|1) sleep 12 # <<-- sleep before restarting do_start case "$?" in [...snip...]
使用 systemd,您必须在启动 apache2 服务器之前编辑 .service 文件并添加 sleep。
ExecStart=sleep 20 && /usr/sbin/apache2
您的初始化顺序也可能是导致问题的原因(如果您必须启动,请更改某些内容,然后在启动时重新启动 apache2;话虽如此,能够在任何时间点重新启动 apache2 可能很重要)。