简介
当另一个进程正在监听配置为使用的同一端口时,会生成一条ApacheAH00072:Make_sock:Cable Not Bind to Address
错误消息。通常情况下,对于HTTP连接,端口为标准端口80
,对于HTTPS连接,端口为标准端口443
。但是,任何与另一个进程的端口冲突都可能导致AH00072错误。
该错误源自底层操作系统的网络堆栈。问题是在任何给定时间都只能将单个进程绑定到端口。如果将另一台Web服务器(如Nginx)配置为监听端口80
,并且该服务器正在运行,则Apache将无法为自己声明该端口。
要检测与APACHE的端口冲突,您需要检查systemctl
和Jouralctl
输出,以确定导致错误的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
步骤,转到本教程末尾的[使用ss
和ps
Utilities](# 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
来诊断问题。
使用ss
和ps
工具排查问题
要排除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
确保显示端口号,而不是像'http或
https`这样的协议名称。这一点很重要,因为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无法启动的进程的名称。