端口 80 上间歇性出现“地址已在使用中:AH00072:make_sock:无法绑定到地址”

端口 80 上间歇性出现“地址已在使用中:AH00072:make_sock:无法绑定到地址”

我们的服务器在端口 80 故障时会间歇性地出现“地址已在使用中:AH00072:make_sock:无法绑定到地址”。我查看了其他答案,它们大多是基于一致的故障和 LISTEN 被定义两次,这不是我们的问题。

我们的问题仅在实例启动后不久发生,我们“sudo service httpd restart”服务以加载我们根据环境制定的新配置。

我能够实时捕获问题并发现它确实是httpd绑定的。问题似乎是 Apache/httpd 挂起并且无法重新启动,然后重新启动不会等待它。

我们在 Amazon Linux 1 上使用 Apache 2.4。

在此处输入图片描述

答案1

获得地址已被使用错误:

  1. 另一台服务器使用该 IP:端口

    在这种情况下,您尝试启动两个服务,并且它们都需要相同的地址和端口组合,这是不可能的。只有一个服务可以侦听一个特定端口。显然,您不处于这种情况。

  2. 同一台服务器重启得太快

    默认情况下,内核会保留 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 可能很重要)。

相关内容