Apache и IIS бок о бок (оба слушают порт 80) на windows2003 - PullRequest
42 голосов
/ 20 сентября 2008

Какие есть хорошие способы сделать это? Можно ли вообще сделать чисто?

В идеале я бы хотел использовать заголовки пакетов, чтобы решить, какой сервер должен обрабатывать запросы. Однако, если есть более простой / лучший способ, дайте мне знать.

Ответы [ 9 ]

31 голосов
/ 20 сентября 2008

Невозможно, чтобы оба сервера прослушивали один и тот же порт на одном и том же IP-адресе: поскольку один сокет может быть открыт только одним процессом, только первый сервер, настроенный для определенной комбинации IP / порт, будет успешно связан, и второй провалится.

Таким образом, вам потребуется обходной путь для достижения того, чего вы хотите. Проще всего, вероятно, запустить Apache на вашей основной комбинации IP / порт и направить ему запросы IIS (который должен быть настроен для другого IP и / или порта), используя mod_rewrite .

Имейте в виду, что альтернативные IP и порты IIS, на которых работают, должны быть доступны для клиентов, подключающихся к вашему серверу: если у вас есть только один доступный IP-адрес, вам следует позаботиться о выборе порта IIS, который обычно не является заблокирован брандмауэрами (8080 может быть хорошим вариантом или 443, даже если вы используете обычный HTTP, а не SSL)

P.S. Также обратите внимание, что вам нужно изменить конфигурацию IIS по умолчанию с помощью httpcfg, прежде чем он позволит другим серверам работать на порту 80 на любом IP-адресе того же сервера: см. Ответ Микки Маккуэйда о процедуре, чтобы сделать это ...

27 голосов
/ 20 сентября 2008

Я нашел следующую ссылку, в которой предлагалось иметь два отдельных IP-адреса, чтобы оба могли прослушивать порт 80: (Изменить: ссылка больше не работает: www.prismix.com/blog/2006/06/running_apache_and_iis_6_toget.cfm)

Была оговорка, что вам пришлось внести изменения в IIS из-за пула сокетов. Вот инструкции, основанные на ссылке выше:

  1. Извлеките утилиту httpcfg.exe из области инструментов поддержки на компакт-диске Win2003.
  2. остановка всех служб IIS: net stop http / y
  3. чтобы IIS прослушивал только тот IP-адрес, который я назначил для IIS: httpcfg set iplisten -i 192.168.1.253
  4. убедитесь: httpcfg запрос iplisten (в списке перечислены только ip-адреса, которые IIS будет прослушивать, и никаких других)
  5. перезапустите службы IIS: net start w3svc
  6. запустить службу Apache
13 голосов
/ 04 января 2012

Для людей, имеющих только один IP-адрес и несколько сайтов на одном сервере, вы можете настроить IIS для прослушивания через порт, отличный от 80, например 8080, установив порт TCP в свойствах каждого из его сайтов (в том числе по умолчанию).

В Apache включите mod_proxy и mod_proxy_http, затем добавьте универсальный VirtualHost (после всех остальных), чтобы запросы Apache не обрабатывались явно, чтобы они были «перенаправлены» в IIS.

<VirtualHost *:80>
    ServerName foo.bar
    ServerAlias *
    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:8080/
</VirtualHost>

Теперь Apache может обслуживать некоторые сайты, а IIS - другие, без видимой разницы для пользователя.

Редактировать: ваши сайты IIS не должны включать номера своих портов в URL-адреса своих ответов, включая заголовки.

3 голосов
/ 23 сентября 2008

Вам нужны как минимум mod_proxy и mod_proxy_http, которые оба являются частью дистрибутива (но не каждый раз собираются автоматически). Тогда вы можете посмотреть здесь: http://httpd.apache.org/docs/2.2/mod/mod_proxy.html

Самая простая конфигурация в контексте виртуального хоста:

ProxyPass         /winapp http://127.0.0.1:8080/somedir/

ProxyPassReverse  /winapp http://127.0.0.1:8080/somedir/

(В зависимости от вашего веб-приложения реальная конфигурация может стать более сложной.) Это прозрачно перенаправляет каждый запрос по пути winapp / на сервер Windows и передает полученный результат обратно клиенту.

Внимание: позаботьтесь о ссылках на доставленных страницах: они не переписаны, так что вы можете сэкономить массу хлопот, если обычно используете относительные ссылки в своем приложении, например

<a href=../pics/mypic.jpg">

вместо обычного кошмара интеграции каждой ссылки, являющейся абсолютной:

<a href="http://myinternalhostname/somedir/crappydesign.jpg">

ПИСЬМО ПЛОХО ПОЧТИ КАЖДЫЙ ОДИН РАЗ!

Для переписывания ссылок на страницах есть mod_proxy_html (не путать с mod_proxy_http!), Но это еще одна история, а также жестокая.

2 голосов
/ 22 сентября 2008

Либо два разных IP-адреса (как рекомендуется), либо один веб-сервер осуществляет обратное проксирование другого (который прослушивает порт <> 80).

Например: Apache прослушивает порт 80, IIS - порт 8080. Каждый http-запрос сначала идет к Apache (конечно). Затем вы можете решить перенаправить каждый запрос в определенный (именуемый виртуальный) домен или каждый запрос, содержащий определенный каталог (например, http://www.example.com/winapp/), в IIS.

Преимущество этой концепции заключается в том, что у вас есть только один сервер, слушающий общедоступный вместо двух, вы более гибки, как с двумя различными серверами.

Недостатки: некоторые веб-приложения скупо спроектированы и реальная проблема в интеграции в инфраструктуру обратного прокси. Работающее веб-приложение IIS зависит от работающего Apache, поэтому у нас есть некоторые взаимозависимости.

0 голосов
/ 12 августа 2015

Это не совсем так. Например. для HTTP Windows поддерживает совместное использование портов на основе URL, что позволяет нескольким процессам использовать один и тот же IP-адрес и порт.

0 голосов
/ 07 августа 2015

Установка Windows 10 У меня была такая проблема: apache (ipv4) и служба спулера (ipv6) прослушивали один и тот же порт 80.

Я разрешил редактировать файл apache httpd.conf, изменив строку

Слушай 80

до

Слушайте 127.0.0.1:80

0 голосов
/ 14 июня 2013

Я вижу, что это довольно старый пост, но наткнулся на это в поисках ответа на эту проблему. Прочитав некоторые ответы, они кажутся очень длинными, поэтому примерно через 5 минут мне удалось решить проблему очень просто следующим образом:

httpd.conf для Apache оставьте порт прослушивания равным 80, а «Имя сервера» - полным доменным именем / IP: 80.

Теперь для IIS перейдите в Администрирование> Диспетчер IIS> «Сайты» в выпадающем меню «Левая навигация»> в правом окне выберите верхнюю строку (веб-сайт по умолчанию), а затем привязки справа.

Теперь выберите http> изменить и измените на 81 и введите свой локальный IP-адрес для сервера / ПК, а в домене введите либо полное доменное имя (www.domain.com), либо внешний IP-адрес.

Перезагрузите оба сервера, убедитесь, что порты открыты как на маршрутизаторе, так и на брандмауэре. Готово.

Это звучит долго, но буквально заняло 5 минут игры. работает отлично.

Система: Windows 8, IIS 8, Apache 2.2

0 голосов
/ 20 сентября 2008

Вам нужно будет использовать разные IP-адреса. Сервер, будь то Apache или IIS, захватывает трафик в зависимости от IP-адреса и порта, которые они должны прослушивать. Как только он начинает прослушивание, он использует заголовки, такие как имя сервера, для фильтрации и определения того, к какому сайту осуществляется доступ. Вы не можете сделать это, просто изменив имя сервера в запросе

...