![为什么 dhcp 会监听 80 端口](https://linux22.com/image/527226/%E4%B8%BA%E4%BB%80%E4%B9%88%20dhcp%20%E4%BC%9A%E7%9B%91%E5%90%AC%2080%20%E7%AB%AF%E5%8F%A3.png)
我有一台 CentOS 服务器,其中运行着 isc dhcpd 和 apache 2 webserver。几分钟前,我尝试重启 apache:
/etc/init.d/httpd restart
重启失败,原因:
Starting httpd: (98)Address already in use: make_sock: could not bind to address [::]:80
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Apache 抱怨 80 端口已被占用。我已执行
netstat -ntap
查看谁在监听 80 端口。结果是 dhcpd。由于在重启之前 apache 和 dhcpd 同时运行,我猜想发生的事情是,apache 关闭后,dhcp 注意到 80 端口是空闲的,并开始监听它。有人知道 dhcpd 在什么情况下会这样做以及为什么这样做吗?我尝试重现过几次,但都没有成功。
答案1
DHCP 协议使用 67 和 68 端口号。dhcpd
无法突然开始监听
端口 80“因为它是空闲的”。还有一件事,使用t
选项时,netstat
您只列出了 TCP 协议。您怎么会看到使用 UDP 协议的 dhcp 服务器?您可能误读了netstat
输出。
答案2
我尝试过多次重现这种情况,但都没有成功。
这是因为在 apache 退出后,套接字可能仍保持打开状态,在后台徘徊,直到相关缓冲区中的数据耗尽。终止和启动 apache 进程之间的时间可能短于耗尽侦听套接字上的缓冲区所需的时间,并且新进程将无法绑定到侦听地址以获取新套接字,直到旧套接字真正关闭。关于 dhcpd 部分,如果我们谈论的是正常的 centos 安装和使用它的普通人,你肯定会误读 netstat 输出。
答案3
尽管我完全同意你的观点,认为这是不可能的,但对我来说,它总是发生这样的事情。
[root@host ~]# service httpd stop
Stopping httpd: [ OK ]
[root@host ~]# service httpd start
Starting httpd: (98)Address already in use: make_sock: could not bind to address [::]:80
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
[FAILED]
进而:
[root@host ~]# netstat -anp | grep :80
tcp 0 0 :::80 :::* LISTEN 21276/dhcpd
是的,传输控制协议端口 80 正被 dhcpd 占用。因此,无论如何,现在我们重置为原始状态:
[root@host ~]# service dhcpd stop
Shutting down dhcpd: [ OK ]
[root@host ~]# service httpd start
Starting httpd: [ OK ]
[root@host ~]# service dhcpd start
Starting dhcpd: [ OK ]
[root@host ~]# netstat -anp | grep :80
tcp 0 0 :::80 :::* LISTEN 27577/httpd
此后立即尝试均可正常工作,但只要服务器运行一段时间,我每次都可以重现此情况。
答案4
我相信我找到了这个问题的原因。我们使用一个 PHP 应用程序来维护 DHCP 主机配置文件,该文件的更改将导致 PHP 执行代码以重新启动 DHCP 服务。执行此代码时,它会生成一个进程来重新启动 DHCP 进程。这个生成的进程继承了“排队”的 Apache 端口。一旦 Apache 进程停止,DHCP 进程现在拥有端口 80。您可以通过在服务器上完全禁用 ipv6 或重新配置 Apache 以仅使用 ipv4 来解决此问题。