Давным-давно я создал сценарий 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[1219 impression, что означает, что он привязывается к каждому IP-адресу в системе, на порту 80.
Итак, если хост является например, 192.168.10.55, как минимум apache попытается выполнить привязку к:
127.0.0.1:80 // localhost 192.168.10.55:80 // IP avail
Если что-то из вышеперечисленного связано с 80, apache не запустится с ошибкой, которую вы отметили в OP
Таким образом, есть несколько способов приблизиться к этому.
Первый : измените конфигурацию apache, чтобы привязать только к действительно необходимым IP-адресам. Избегайте localhost. Избегайте неизвестных или неиспользуемых IPv6 или интерфейсов управления.
Второй : Используйте netstat, чтобы узнать, что находится на порту 80.
netstat -a |findstr :80