为什么要DHCP监听端口80

我有一台运行isc dhcpd和apache 2 webserver的CentOS服务器。 几分钟前,我已经尝试重新启动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 

阿帕奇抱怨说80端口已经被占用了。 我已经执行了

 netstat -ntap 

看看谁在80端口上收听。 这是dhcpd。 由于之前重新启动apache和dhcpd同时运行,我想是什么发生了刚刚closuresapache后,dhcp已经注意到,80端口是免费的,并开始聆听它。 有谁知道在什么情况下dhcpd会这样做,为什么? 我已经尝试重现这一点,但没有运气。

DHCP协议使用67和68端口号。 dhcpd不能出于蓝色的开始聆听
80端口,因为它是免费的。 还有一件事,在netstat使用t选项只列出了TCP协议。 你怎么看到使用UDP协议的DHCP服务器? 你可能误读了netstat输出。

我已经尝试重现这一点,但没有运气。

这是因为在apache退出之后,套接字可能仍然保持打开,直到相关的缓冲区被排空。 查杀apache进程和启动apache进程之间的时间可能会less于在监听套接字上耗尽缓冲区所需的时间,而新进程将无法绑定到获取新套接字的监听地址,直到旧套接字真正closures。 关于dhcpd部分,如果我们正在讨论一个正常的centos安装和使用它的普通用户,你肯定会误读netstat的输出。

尽pipe我完全同意你的看法,这是不可能的,但是我一直都这样做。

 [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 

是的, TCP端口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 

这个工作正常后立即尝试,但只要服务器已经运行一段时间,我可以每次重现这一点。

我相信我find了这个问题的原因。 我们利用一个维护DHCP主机configuration文件的PHP应用程序,在这个文件中的一个改变将导致PHP执行代码重新启动DHCP服务。 当这个代码被执行时,它产生一个重启DHCP进程的进程。 这个产生的进程inheritance了“排队”的Apache端口。 一旦Apache进程停止,DHCP进程现在拥有80端口。您可以通过完全禁用服务器上的ipv6或重新configurationApache来仅使用ipv4来解决此问题。