Давным-давно я создал сценарий Powershell, который останавливает службу Apache, удаляет журналы веб-сервера и снова запускает службу. Не было проблем до недавнего времени, когда процесс остановки начал истекать тайм-аут, хорошо известная ошибка «Служба не ответила своевременно ...».
Ну ладно, чтобы обойти это, я обновил скрипт. Итак, очень в общих чертах объяснили, что теперь это так:
stop-service webserverservice
# Check if process is stil alive, and if found using the PID
stop-process -id $processPid -force
Это должно позаботиться об этом, если остановка службы истекает, ну, давайте просто убьем процесс. И на самом деле выполняем последнюю проверку дважды, чтобы убедиться, что ни один дочерний процесс не запускается, прежде чем убить основной процесс.
НО - на некоторых серверах не на всех и не всегда вышеперечисленные шаги не защищены от воды. При запуске сервера он говорит
(OS 10048)Only one usage of each socket address (protocol/network
address/port) is normally permitted.
: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
И вот что я не могу объяснить. Все еще использую Powershell и эквивалент netstat Get-NetTCPConnection
PS C:\temp> Get-NetTCPConnection -LocalPort 80
Get-NetTCPConnection : No MSFT_NetTCPConnection objects found with
property 'LocalPort' equal to '80'.
Verify the value of the property and retry.
Это оставляет мне только один вариант: перезагрузить сервер, и тогда все снова в порядке.
Кто-нибудь видит то, чего нет у меня, что могло бы объяснить, почему у меня возникла эта проблема?
Похоже, что apache настроен на привязку к 0.0.0.0:80
Это означает, что он привязывается к каждому IP-адресу в системе через порт 80.
Таким образом, если хост - это, например, 192.168.10.55, как минимум apache попытается выполнить привязку к:
127.0.0.1:80 // localhost 192.168.10.55:80 // доступный IP
Если что-то из вышеперечисленного связано с 80, apache не запустится с ошибкой, которую вы заметили в OP
Итак, есть несколько способов подойти к этому.
Первый: Измените конфигурацию apache, чтобы привязать только к действительно необходимым IP-адресам. Избегайте localhost. Избегайте неизвестных или неиспользуемых IPv6 или интерфейсов управления.
Второй: Используйте netstat, чтобы узнать, что находится на порту 80.
netstat -a |findstr :80