У меня есть сервер CentOS с запущенным веб-сервером isc dhcpd и apache 2. Пару минут назад я попытался перезапустить 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 работали одновременно, я предполагаю, что произошло то, что сразу после отключения apache dhcp обнаружил, что порт 80 свободен, и начал его прослушивать. Кто-нибудь знает, в каких случаях это будет делать dhcpd и почему? Я пытался воспроизвести это пару раз, но безуспешно.
Протокол DHCP использует номера портов 67 и 68. dhcpd
не может внезапно начать слушать
порт 80 «потому что он бесплатный». И еще кое-что, используя t
вариант в netstat
вы перечисляете только протокол TCP. Почему вы видите DHCP-сервер, использующий протокол UDP? Вы, наверное, неправильно прочитали netstat
вывод.
Я пытался воспроизвести это пару раз, но безуспешно.
Это потому, что после выхода apache сокет может оставаться открытым в фоновом режиме до тех пор, пока связанные буферы не будут очищены от данных. Время между завершением работы и запуском процесса apache может быть меньше времени, необходимого для истощения буферов на слушающем сокете, и новый процесс не сможет привязаться к слушающему адресу, получая новый сокет, пока старый действительно не будет закрыт. Что касается части dhcpd, вы наверняка неправильно прочитали вывод netstat, если мы говорим о нормальной установке centos и ее использовании обычными людьми.
Хотя я полностью согласен с вами в том, что это невозможно, для меня это все время происходит.
[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
Попытки сразу после этого работают правильно, но я могу воспроизводить это каждый раз, пока сервер какое-то время работает.
Я считаю, что нашел причину этой проблемы. Мы используем приложение PHP, которое поддерживает файл конфигурации хостов DHCP, и изменение в этом файле заставит PHP выполнить код для перезапуска службы DHCP. Когда этот код выполняется, он запускает процесс для перезапуска процесса DHCP. Этот порожденный процесс наследует порты Apache, которые поставлены в очередь. После остановки процесса Apache процесс DHCP теперь владеет портом 80. Вы можете решить эту проблему, полностью отключив ipv6 на сервере или перенастроив Apache на использование только ipv4.