По умолчанию во время установки сервера IIS (Internet Information Services) создается пустой веб-сайт “Default Web Site”, который отвечает на стандартном веб порту – TCP 80. В терминах IIS это означает, что выполнена привязка этого сайта (Binding) к порту 80. Чтобы открыть этот сайт, достаточно в браузере набрать имя сервера IIS (“http://web-srv1”) или его IP адрес (“http://10.10.0.88”). Один веб сервер IIS может обслуживать десятки и сотни сайтов, и технически можно запустить несколько веб-сайтов, которые слушают и отвечают на одном и том же порту (80 или 443). Однако из интерфейса IIS Manager, совсем не очевидно, что можно запустить второй сайт на этом же хосте без привязки его к другому порту (например, 8080). В этой статье мы разберёмся, как на одном сервере IIS запустить сразу несколько сайтов, чтобы они были привязаны к одному и тому же порту и IP адресу.
Итак, как мы уже говорили ранее, на одном сервере IIS может быть запущено множество сайтов, однако чтобы IIS мог корректно распределять HTTP запросы, каждый сайт должен идентифицироваться неким уникальным значением. Для веб сайта IIS оно формируется из трех атрибутов, комбинация которых для каждого сайта должна быть уникальной. Это:
- номер TCP порта
- IP адрес
- имя узла (host header)
Информация о запущенных сайтах хранится в атрибуте ServerBindings метабазы IIS в формате IP:Port:Hostname. Таким образом, если нужно запустить несколько сайтов на одном порту и IP адресе, нужно использовать уникальный Host header. Что это такое? Host header – это часть HTTP запроса к серверу, который отправляет клиент, указывая к какому конкретно сайту он хочет обратиться. Соответственно, данный host header должен быть указан на стороне веб сервера, а в DNS содержаться корректная запись, осуществляющая соответствие между именем хоста и ip адресом веб-сервера.
Итак, предположим, что у нас на IIS уже запущен один веб сайт на 80 порту. Нам нужно добавить второй сайт на этом же порту.
В консоли управления IIS создадим второй сайт (Add Website). С именем TestSite , файлы которого будут храниться в каталоге c:inetpubTestSite (имя хоста пока не указываем).
После того, как вы нажмете “OK”, появится предупреждение, в котором говорится, что вы не можете использовать привязку *:80 для двух сайтов, т.е. одновременно может работать только один из них.
Согласимся с этим предупреждением. Итак, у нас появился второй сайт, также привязанный к 80 порту, но запустить его без остановки первого сайта нельзя.
Чтобы создать уникальную привязку, укажем для второго сайта другое имя (Host Name). Щелкните ПКМ по сайту TestSite и выберите пункт меню Edit Bindings. Выберите нужную привязку и нажмите Edit.
В поле Host Name укажите уникальное имя хоста, к которому должны обращаться пользователи, например TestSite.
Настроить привязку можно и из командной строки. В данном примере для IIS 7 и выше команда установки привязки будет выглядеть так:
C:WindowsSystem32inetsrvappcmd.exe set site /site.name:"TestSite" /+bindings.[protocol='http',bindingInformation='*:80:TestSite']
Теперь можно запустить и второй веб сайт.
Все, что осталось сделать – добавить в DNS алиас для сервера (запись типа A или CNAME), указывающую на IP адрес веб-сервера или его имя.
Создать CNAME запись для имени TestSite можно с помощью консоли DNS (dnsmgmt.msc), в качестве FQDN target host указать доменное имя вашего IIS сервера.
Создать такую запись также можно с помощью PowerShell :
Add-DnsServerResourceRecordCName -HostNameAlias web-srv1.contoso.loc -Name testsite -ZoneName contoso.loc
Теперь в браузере попробуйте открыть сайт http://TestSite
. Он должен успешно открыться.
Еще несколько полезных моментов, которые стоит упомянуть.
В том случае, если у вас используется локальный сервер IIS, сопоставление имен сайтов с IP адресом сервера выполняется через файл C:Windowssystem32driversetchosts
.
Настройки привязок хранятся в конфигурационном файле IIS (C:WindowsSystem32inetsrvconfigapplicationHost.config
) в секции <sites>
В нашем примере эта секция содержит такие данные :
<sites>
<site name="Default Web Site" id="1">
<application path="/">
<virtualDirectory path="/" physicalPath="%SystemDrive%inetpubwwwroot" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:80:" />
</bindings>
</site>
<site name="TestSite" id="2" serverAutoStart="true">
<application path="/" applicationPool="TestSite">
<virtualDirectory path="/" physicalPath="C:inetpubTestSite" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:80:TestSite" />
</bindings>
</site>
<siteDefaults>
<logFile logFormat="W3C" directory="%SystemDrive%inetpublogsLogFiles" />
<traceFailedRequestsLogging directory="%SystemDrive%inetpublogsFailedReqLogFiles" />
</siteDefaults>
<applicationDefaults applicationPool="DefaultAppPool" />
<virtualDirectoryDefaults allowSubDirConfig="true" />
</sites>
По аналогии вы можете разместить и запустить на одном порту веб-сервера IIS несколько сотен сайтов.