Apache 网络错误 AH00072: make_sock: 无法绑定地址

简介

当另一个进程正在监听配置为使用的同一端口时,会生成一条ApacheAH00072:Make_sock:Cable Not Bind to Address错误消息。通常情况下,对于HTTP连接,端口为标准端口80,对于HTTPS连接,端口为标准端口443。但是,任何与另一个进程的端口冲突都可能导致AH00072错误。

该错误源自底层操作系统的网络堆栈。问题是在任何给定时间都只能将单个进程绑定到端口。如果将另一台Web服务器(如Nginx)配置为监听端口80,并且该服务器正在运行,则Apache将无法为自己声明该端口。

要检测与APACHE的端口冲突,您需要检查systemctlJouralctl输出,以确定导致错误的IP地址和端口。然后,您可以决定如何解决该问题,无论是通过切换Web服务器、更改Apache使用的IP地址、端口,还是这些选项的任意组合。

使用systemctl进行故障排除

按照本系列开头的如何排除通用apache Errors故障]中的故障排除步骤,在排除AH00072:Make_sock:Can‘t Bind to Address错误消息时的第一步是使用systemctl检查apache的状态。

如果systemctl没有包含描述问题的输出,那么本教程的最后一节[使用Jouralctl日志进行故障排除](# Troublroublem-Using-Jouralctl-Logs)将介绍如何检查systemd日志以找到冲突的端口。

在许多情况下,systemctl status的输出将包含解决错误所需的所有诊断信息。它将包括Apache正在使用的IP地址,以及它试图绑定到的端口。输出还将指示Apache无法启动的时间,以便您可以确定该问题影响Apache的时间。

在Ubuntu和Debian衍生的Linux发行版上,运行以下命令来检查Apache的状态:

1[label Ubuntu and Debian Systems]
2sudo systemctl status apache2.service -l --no-pager

在CentOS和Fedora系统上,使用以下命令检查APACHE的状态:

1[label CentOS and Fedora Systems]
2sudo systemctl status httpd.service -l --no-pager

-l标志将确保systemctl输出一行的全部内容,而不是用省略号(...)替换长行。--no-pager标志将整个日志输出到您的屏幕上,而无需调用less之类的工具,该工具每次只显示一个屏幕的内容。

由于您正在对AH00072:make_sock错误消息进行故障排除,因此您应该会收到类似于以下内容的输出:

 1[secondary_label Output]
 2 httpd.service - The Apache HTTP Server
 3   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
 4   Active: failed (Result: exit-code) since Tue 2020-07-28 13:58:40 UTC; 8s ago
 5     Docs: man:httpd.service(8)
 6  Process: 69 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE)
 7Main PID: 69 (code=exited, status=1/FAILURE)
 8   Status: "Reading configuration..."
 9     Tasks: 213 (limit: 205060)
10   Memory: 25.9M
11   CGroup: /system.slice/containerd.service/system.slice/httpd.service
12
13Jul 28 13:58:40 e3633cbfc65e systemd[1]: Starting The Apache HTTP Server
14Jul 28 13:58:40 e3633cbfc65e httpd[69]: (98)Address already in use: AH00072: make_sock: could not bind to address [::]:80
15Jul 28 13:58:40 e3633cbfc65e httpd[69]: (98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80
16Jul 28 13:58:40 e3633cbfc65e httpd[69]: no listening sockets available, shutting down
17Jul 28 13:58:40 e3633cbfc65e httpd[69]: AH00015: Unable to open logs
18Jul 28 13:58:40 e3633cbfc65e systemd[1]: httpd.service: Main process exited, code=exited, status=1/FAILURE
19Jul 28 13:58:40 e3633cbfc65e systemd[1]: httpd.service: Failed with result 'exit-code'.
20Jul 28 13:58:40 e3633cbfc65e systemd[1]: Failed to start The Apache HTTP Server.

请注意,如果您使用的是Ubuntu或Debian派生的发行版,则输出可能会略有不同,其中apache进程的名称不是httpd,而是apache2

此示例systemctl输出包括一些突出显示的行,这些行来自描述AH00072错误的systemd日志。这两行代码都以(98)地址已在使用中的地址:AH00072:Make_Sock:Can‘t Bind to Address开头,为您提供了有关AH00072错误的所有信息,以便您进一步排查该错误,因此您可以跳过下面的Journal alctl步骤,转到本教程末尾的[使用sspsUtilities](# troubleshooting-with-ss-and-ps-utilities)进行故障排除]部分。

如果您的systemctl输出没有提供有关导致AH00072错误的IP地址和一个或多个端口的特定信息,您将需要检查systemd日志中的Journal alctl输出。以下部分介绍如何使用Journal alctl排除AH00072错误。

使用Journal alctl日志排查问题

如果您的systemctl输出不包括有关AH00072错误的详细信息,则应继续使用Journal alctl命令检查用于Apache的systemd日志。

在Ubuntu和Debian派生的系统上,运行以下命令:

1sudo journalctl -u apache2.service --since today --no-pager

在CentOS、Fedora和RedHat派生系统上,使用以下命令检查日志:

1sudo journalctl -u httpd.service --since today --no-pager

--自今天标志将命令的输出限制为仅从当天00:00:00开始的日志条目。使用此选项将有助于限制在检查错误时需要检查的日志条目的数量。

如果Apache无法绑定到正在使用的端口,请在输出中搜索与以下日志条目类似的行,特别是包含本例中突出显示的AH00072错误代码的行:

1[secondary_label Output]
2-- Logs begin at Tue 2020-07-14 20:10:37 UTC, end at Tue 2020-07-28 14:01:40 UTC. --
3. . .
4Jul 28 14:03:01 b06f9c91975d apachectl[71]: (98)Address already in use: AH00072: make_sock: could not bind to address [::]:80
5Jul 28 14:03:01 b06f9c91975d apachectl[71]: (98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80
6Jul 28 14:03:01 b06f9c91975d apachectl[71]: no listening sockets available, shutting down

该输出指示两个AH00072错误。第一条解释了APACHE无法绑定[::]:80地址,该地址是所有可用IPv6接口上的80端口。下一行地址为0.0.0.0:80,表示在所有可用的IPv4接口上,apache无法绑定到端口80。根据系统配置的不同,IP地址可能会有所不同,并且仅显示单个IP,并且可能仅包含IPv4或IPv6错误。

即使您自己的系统可能具有不同的冲突接口和端口,错误也将类似于此处显示的输出。通过Journal alctl的输出,您将能够在本教程的下一节中使用ss来诊断问题。

使用ssps工具排查问题

要排除AH00072错误的故障,您需要确定哪些其他进程正在侦听Apache试图使用的IP地址和端口。大多数现代Linux发行版都包含一个名为‘ss’的实用程序,可用于收集有关系统网络套接字状态的信息。

在前面的Journal alctl部分中,端口80上的IPv4和IPv6地址已经绑定了一些东西。以下命令将确定已绑定到端口80上的IPv4接口的进程的名称。如果端口与以下命令中的80不同,请确保替换错误消息中的端口:

1sudo ss -4 -tlnp | grep 80

`ss‘命令的标志通过以下方式更改其默认输出:

  • -4限制ss只显示IPv4相关的套接字信息。
  • -t将输出限制为仅tcp套接字。
  • -l显示所有监听套接字,并考虑-4-t限制。
  • -n确保显示端口号,而不是像'httphttps`这样的协议名称。这一点很重要,因为Apache可能会尝试绑定到非标准端口,而服务名称可能会与实际端口号混淆。
  • -p输出绑定到端口的进程的信息。

使用所有这些标志,您将收到如下所示的输出:

1[secondary_label Output]
2LISTEN 0 511 0.0.0.0:80 0.0.0.0:*        users:(("nginx",pid=40,fd=6))

在对AH00072错误进行故障排除时,前三个字段并不重要,因此可以忽略它们。重要的字段是第四个(0.0.0.0:80),它匹配您之前发现的Journal alctl错误,以及最后一个USERS:(()),特别是id=40部分。

如果出现与IPv6接口相关的AH 00072错误,请重复ss调用,这次使用-6标志将接口限制到IPv6网络堆栈,如下所示:

1sudo ss -6 -tlnp |grep 80
1[secondary_label Output]
2LISTEN 0 511                    [::]:80                  [::]:*        users:(("nginx",pid=40,fd=7))

同样,如果您的Journal alctl输出不同于此处突出显示的80,请替换有问题的端口号。

在这两种IPv4和IPv6错误的情况下,ss输出都表示有一个进程ID为40的程序(输出中的id=40)分别绑定到0.0.0.0:80[::]:80接口。此进程会阻止apache启动,因为它已经拥有该端口。要确定程序的名称,请使用如下ps实用程序,用输出中的进程ID替换本例中突出显示的40值:

1sudo ps -p 40

您将收到类似于以下内容的输出:

1[secondary_label Output]
2PID TTY TIME CMD
340 ?        00:00:00 nginx

输出中突出显示的nginx是正在接口上监听的进程的名称。现在您已经知道了阻止Apache启动的程序的名称,您可以决定如何解决该错误。您可以停止nginx进程,重新配置nginx监听不同的接口和端口,或者重新配置APACHE以避免端口冲突。

需要注意的是,如果您诊断的是AH00072错误,则流程可能不同于nginx,并且端口和IP地址不一定总是0.0.0.0[::]。通常,同一服务器上会使用不同的Web服务器和代理。每个端口都可能尝试绑定到不同的IPv4端口和IPv6接口,以处理不同的Web流量。例如,配置了HAProxy的服务器监听端口80上的IPv4环回地址(也称为本地主机),则会显示如下ss输出:

1[secondary_label Output]
2LISTEN 0 2000 127.0.0.1:8080 0.0.0.0:*       users:(("haproxy",pid=545,fd=7))

将指示特定IP地址和端口的systemctl输出或Journal alctl输出与来自ss的诊断数据结合在一起,然后再结合使用ps,以缩小导致Apache无法启动的进程,这一点很重要。

总结

在本教程中,您学习了如何解决IPv4和IPv6接口上的Apache AH00072 make_sock:could not bind to address错误消息。您学习了如何使用systemctl检查Apache服务器的状态并尝试查找错误消息。您还学习了如何使用journalctl检查systemd日志,以获取有关AH00072错误的特定信息。

通过日志中的相应错误消息,您了解了ss‘实用程序以及如何使用它来检查系统的网络套接字的状态。之后,您了解了如何将ss中的进程ID信息与ps`实用工具结合起来,以找到导致Apache无法启动的进程的名称。

Published At
Categories with 技术
Tagged with
comments powered by Disqus