Каковы хорошие способы сделать это? Можно ли сделать это чисто?
В идеале я хотел бы использовать заголовки пакетов, чтобы решить, какой сервер должен обрабатывать запросы. Однако, если есть более простой/лучший способ, дайте мне знать.
Каковы хорошие способы сделать это? Можно ли сделать это чисто?
В идеале я хотел бы использовать заголовки пакетов, чтобы решить, какой сервер должен обрабатывать запросы. Однако, если есть более простой/лучший способ, дайте мне знать.
Невозможно, чтобы оба сервера прослушивали один и тот же порт на одном и том же IP-адресе: поскольку один сокет может быть открыт только одним процессом, только первый сервер, настроенный для определенной комбинации IP-портов, успешно свяжется и второй - неудачный.
Таким образом, вам необходимо обходное решение для достижения желаемого. Самый простой - это, вероятно, запустить Apache в вашей основной комбинации IP/port и запросить маршрут для IIS (который должен быть настроен для другого IP и/или порта), используя mod_rewrite.
Имейте в виду, что альтернативный IP-адрес и порт IIS должны быть доступны для клиентов, подключающихся к вашему серверу: если у вас есть только один доступный IP-адрес, вы должны позаботиться о выборе порта IIS, который обычно отсутствует заблокированный брандмауэрами (8080 может быть хорошим вариантом или 443, хотя вы используете обычный HTTP, а не SSL).
P.S. Также обратите внимание, что вам необходимо изменить конфигурацию по умолчанию IIS с помощью httpcfg, прежде чем он разрешит другим серверам работать на порту 80 на любом IP-адресе на одном сервере: см. Ответ Микки МакКуад для процедуры, чтобы сделать это...
Я нашел этот пост, в котором предлагалось иметь два отдельных IP-адреса, чтобы оба могли прослушивать порт 80.
Была оговорка, что вам пришлось внести изменения в IIS из-за пула сокетов. Вот инструкции, основанные на ссылке выше:
httpcfg.exe
из области инструментов поддержки на компакт-диске Win2003.net stop http/y
httpcfg set iplisten -i 192.168.1.253
httpcfg query iplisten
(перечисленные IP-адреса являются единственными IP-адресами, которые IIS будет прослушивать, и никакими другими.)net start w3svc
Для людей с единственным одним 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-адреса в своих ответах, включая заголовки.
Вам нужно как минимум 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/
(В зависимости от вашего webapp фактическая конфигурация может стать более сложной.) Это прозрачно перенаправляет каждый запрос на путь winapp/на сервер Windows и передает полученный результат обратно клиенту.
Внимание: заботитесь о ссылках на поставленных страницах: они не переписаны, поэтому вы можете сэкономить много хлопот, если обычно используете относительные ссылки в своем приложении, например
<a href=../pics/mypic.jpg">
вместо обычного кошмара интеграции каждой ссылки, являющейся абсолютной:
<a href="http://myinternalhostname/somedir/crappydesign.jpg">
ДЛИННИК ПЛОХО ВСЕ КАЖДОЕ ВРЕМЯ!
Для перезаписи ссылок на страницах есть mod_proxy_html (не путать с mod_proxy_http!), но это другая история и жестокая.
Либо два разных IP-адреса (например, рекомендованные), либо один веб-сервер обратного проксирования другого (который прослушивает порт < > 80).
Например: Apache прослушивает порт 80, IIS на порту 8080. Каждый HTTP-запрос сначала отправляется в Apache (конечно). Затем вы можете перенаправить каждый запрос в конкретный (именный виртуальный) домен или каждый запрос, содержащий конкретный каталог (например, http://www.example.com/winapp/) к IIS.
Преимущество этой концепции в том, что у вас есть только один сервер, который слушает публику, а не два, вы более гибкие, как с двумя отдельными серверами.
Недостатки: некоторые webapps запрограммированы и реальная боль в заднице, чтобы интегрироваться в инфраструктуру обратного прокси. Рабочий Web-интерфейс IIS зависит от рабочего Apache, поэтому у нас есть некоторые взаимозависимости.
Я вижу, что это довольно старый пост, но натолкнулся на это, ища ответ на эту проблему. После прочтения некоторых ответов они кажутся очень длинными, поэтому примерно через 5 минут мне удалось решить проблему очень просто следующим образом:
httpd.conf для Apache оставить порт прослушивания как 80 и "Имя сервера" как FQDN/IP: 80.
Теперь для IIS перейдите в "Административные службы" > "Диспетчер IIS" > "Сайты" в раскрывающемся списке "Влево" > в правом окне выберите верхнюю строку (веб-сайт по умолчанию), а затем привязки справа.
Теперь выберите http > edit и измените на 81 и введите свой локальный IP-адрес для сервера/компьютера, а в домене введите либо полное доменное имя (www.domain.com), либо внешний IP-адрес.
Перезагрузите оба сервера, чтобы ваши порты были открыты как на маршрутизаторе, так и на брандмауэре.
Звучит долго, но буквально занял 5 минут. отлично работает.
Система: Windows 8, IIS 8, Apache 2.2
Установка Windows 10 У меня была эта проблема: apache (ipv4) и служба спулера (ipv6), прослушивающие один и тот же порт 80.
Я решил изменить файл apache httpd.conf, изменив строку
Слушайте 80
к
Слушайте 127.0.0.1:80
Это не совсем так. Например. для HTTP Windows поддерживает совместное использование портов на основе URL-адресов, позволяя нескольким процессам использовать один и тот же IP-адрес и порт.
Вам нужно будет использовать разные IP-адреса. Сервер, будь то Apache или IIS, захватывает трафик на основе IP и порта, который когда-либо они обязаны слушать. Когда он начинает прослушиваться, он использует заголовки, такие как имя сервера для фильтрации и определения того, к какому сайту обращаются. Вы не можете этого сделать, просто измените имя сервера в запросе