У меня есть две машины для разработки, обе под управлением Windows 7 Professional.
Первый компьютер поочередно используется для веб-серверов IIS 7.0 и Apache 2.2 (но никогда одновременно). Я выключаю IIS, который освобождает порт 80, затем запускаю Apache на порту 80 (или наоборот). Это прекрасно работает.
У меня есть вторая машина для разработки, на которой мне нужно выполнить ту же настройку. (другой проект для другого клиента). Даже когда IIS остановлен, порт 80 все еще используется процессом системного уровня.
Я не смог заметить разницу, из-за которой одна машина работает, а другая - нет. Кто-нибудь еще знает, почему порт 80 не освобождается при остановке IIS?
Выполните следующую команду:
netsh http show servicestate
Поищите записи, которые выглядят так:
Registered URLs:
HTTP://+:80/<SERVICE_NAME>
Это скажет вам, что слушает порт 80.
Остерегайтесь также Skype, у которого есть отвратительная привычка захватывать порт 80.
Начиная с Windows 2003, Microsoft создала http-драйвер режима ядра. Особенностью этого драйвера является прослушиватель режима ядра. Прослушиватель режима ядра предоставляет функцию, называемую совместным использованием порта, когда несколько приложений могут прослушивать один и тот же порт. Приложения, которые хотят это сделать, регистрируют пространство имен URI для своего приложения. Например, на моем компьютере служба агента развертывания MS прослушивает этот URL-адрес:
http://+:80/MSDEPLOYAGENTSERVICE/
Запросы к этому конкретному URI передаются приложению, которое зарегистрировало этот конкретный URI.
IIS - это еще одно приложение, которое регистрируется в службе прослушивания режима ядра и ее различных привязках.
Проблема с Apache в Windows заключается в том, что он не использует подсистему режима ядра Windows HTTP и не регистрирует себя (это не мелочь, а просто факт жизни). Его собственный процесс пытается напрямую привязаться к любой настроенной вами комбинации ip / port. Конечно, если служба HTTP-прослушивателя сидит там и слушает URI, зарегистрированный на порту 80 другими службами, она будет запущена.
Итак, в основном, если вы хотите использовать порт 80, я думаю, вам нужно найти и убить все, что может там слушать (если вы выполните Listen 80
) на IP-адресе, который вы хотите использовать для Apache.
Если даже может потребоваться удалить зарегистрированные URI, которые больше не используются, которые, возможно, не были должным образом очищены, когда приложение само деинсталлировалось.
Самый простой обходной путь, не идеальный, и я уверен, что вы это уже знаете, - это настроить Apache для Windows на прослушивание чего-то, кроме порта 80.
Для дальнейшего чтения см .: