Обратный прокси-сервер с переопределением URL-адресов версии 2 и маршрутизацией запросов приложений
В этом пошаговом руководстве описано, как использовать модуль переопределения URL-адресов и маршрутизацию запросов приложений (ARR) для реализации обратного прокси-сервера для нескольких внутренних приложений.
Предварительные требования
Чтобы выполнить это пошаговое руководство, вам потребуется следующее:
- IIS 7 или более поздней версии с включенной службой ASP.NET роли.
- Установленный модуль переопределения URL-адресов (требуется версия 2.0, если вы хотите выполнить часть о перезаписи ответа)
- Установлена маршрутизация запросов приложений версии 1.0 или 2.0
Введение
С помощью модуля переопределения URL-адресов и маршрутизации запросов приложений можно реализовать сложные и гибкие конфигурации балансировки нагрузки и обратного прокси-сервера. Очень распространенный сценарий обратного прокси-сервера — сделать несколько внутренних веб-приложений доступными через Интернет. Веб-сервер, доступный через Интернет, используется в качестве сервера обратного прокси-сервера, который получает веб-запросы, а затем пересылает их нескольким приложениям интрасети для обработки. На следующем рисунке показана типичная конфигурация для сценария обратного прокси-сервера:
При условии, что сервер ARR имеет доменное имя http://contoso.com
, каждое веб-приложение можно получить с помощью следующих URL-адресов:
http://contoso.com/webmail/
http://contoso.com/payroll/
Когда выполняется запрос к http://contoso.com/webmail/default.aspx
, ARR перенаправит эти запросы на внутренний сервер, используя URL-адрес http://webmail/default.aspx
. Аналогичным образом запросы к http://contoso.com/payroll/
перенаправляются в http://payroll/default.aspx
.
Кроме того, если внутреннее приложение вставляет ссылки в HTML-код ответа, которые ссылаются на другие части этих приложений, эти ссылки следует изменить до возврата ответа клиенту. Например, страница из http://webmail/default.aspx
может содержать такую ссылку:
<a href="/default.aspx?id=1">link</a>
Затем сервер ARR должен изменить эту ссылку на следующую:
<a href="/webmail/default.aspx?id=1">link</a>
Создание примеров веб-сайтов
Для простоты сценарий обратного прокси-сервера, с которым вы будете работать в этом пошаговом руководстве, будет реализован на одном сервере, при этом iis "веб-сайт по умолчанию" выступает в качестве сайта обратного прокси-сервера, а приложения веб-почты и зарплаты размещены на разных веб-сайтах IIS на одном сервере.
Чтобы создать примеры веб-сайтов, выполните следующие действия.
Создайте две папки с именами "webmail" и "payroll" в следующей папке:
%SystemDrive%\inetpub\ folder.
Создайте два веб-сайта IIS с именами "webmail" и "payroll", которые указывают на соответствующие папки в разделе
%SystemDrive%\inetpub\
. Используйте разные IP-порты для каждого сайта.
Для создания сайтов можно использовать следующие команды:%windir%\System32\inetsrv\appcmd.exe add site /name:"webmail" /bindings:http/*:8081: /physicalPath:"%SystemDrive%\inetpub\webmail" %windir%\System32\inetsrv\appcmd.exe add site /name:"payroll" /bindings:http/*:8082: /physicalPath:"%SystemDrive%\inetpub\payroll"
Создайте файл с именем default.aspx в следующей папке:
%SystemDrive%\inetpub\webmail
Скопируйте следующую разметку ASP.NET, вставьте ее в файл и сохраните файл:
<%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Reverse Proxy Test - WebMail Application</title> </head> <body> <h1>Reverse Proxy Test Page - WebMail Application</h1> <p>Requested URL path is <%= Request.ServerVariables["SCRIPT_NAME"] %><p> <p><a href="<%= Request.ServerVariables["SCRIPT_NAME"] %>">Here</a> is the link to this page.</p> </body> </html>
Создайте файл с именем default.aspx в следующей папке:
%SystemDrive%\inetpub\payroll
Скопируйте следующую разметку ASP.NET, вставьте ее в файл и сохраните файл:
<%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Reverse Proxy Test - Payroll Application</title> </head> <body> <h1>Reverse Proxy Test Page - Payroll Application</h1> <p>Requested URL path is <%= Request.ServerVariables["SCRIPT_NAME"] %><p> <p><a href="<%= Request.ServerVariables["SCRIPT_NAME"] %>">Here</a> is the link to this page.</p> </body> </html>
Чтобы убедиться, что сайты работают правильно, откройте веб-страницу и запросите следующие URL-адреса:
http://localhost:8081/default.aspx
http://localhost:8082/default.aspx
Настройка правил для обратного прокси-сервера
В этом разделе пошагового руководства вы настроите функции обратного прокси-сервера для работы с созданными примерами веб-сайтов.
Включение функции обратного прокси-сервера
Функция обратного прокси-сервера отключена по умолчанию, поэтому ее необходимо начать с включения.
- Открытие диспетчера IIS
- Выберите узел сервера в представлении в виде дерева слева и щелкните функцию "Маршрутизация запросов приложений".
- Установите флажок "Включить прокси-сервер" проверка. Оставьте значения по умолчанию для всех остальных параметров на этой странице:
Создание правила для приложения веб-почты
Вы создадите два правила перезаписи:
- Правило переопределения, которое будет выполнять прокси-запрос к приложению webmail при
http://localhost:8081/
условии, что запрошенный URL-путь начинается с "webmail". - Правило перезаписи, которое будет выполнять прокси-запрос к приложению для расчета заработной платы до
http://localhost:8082/
тех пор, пока запрошенный URL-адрес начинается с "payroll".
Чтобы добавить правила перезаписи обратного прокси-сервера, выполните следующие действия.
Откройте файлweb.config , расположенный в следующем расположении:
%SystemDrive%\inetpub\wwwroot\
В элементе /configuration/system.webServer добавьте следующее, а затем сохраните файл:
<rewrite> <rules> <rule name="Reverse Proxy to webmail" stopProcessing="true"> <match url="^webmail/(.*)" /> <action type="Rewrite" url="http://localhost:8081/{R:1}" /> </rule> <rule name="Reverse Proxy to payroll" stopProcessing="true"> <match url="^payroll/(.*)" /> <action type="Rewrite" url="http://localhost:8082/{R:1}" /> </rule> </rules> </rewrite>
Дополнительные сведения о создании правил перезаписи см. в статье Создание правил переопределения для модуля переопределения URL-адресов.
Тестирование функции обратного прокси-сервера
Откройте веб-браузер и отправьте запрос к http://localhost/webmail/default.aspx
. Вы должны увидеть ответ на тестовой странице веб-почты. Кроме того, сделайте запрос к http://localhost/payroll/default.aspx
. Вы должны увидеть ответ на странице тестирования заработной платы.
Обратите внимание, что в обоих случаях ссылка внутри ответа указывает на http://localhost/default.aspx
. Если щелкнуть эту ссылку, сервер получит ответ 404 (файл не найден). В следующем разделе вы узнаете, как создать правило для исходящего трафика для исправления связей HTML-кода ответа, созданного приложением.
Настройка правил для перезаписи ответов
Этот раздел документации относится к модулю переопределения URL-адресов версии 2.0 для IIS 7.
Вы определите правило для исходящего трафика, которое заменит все ссылки в HTML-коде ответа следующим образом:
<a href="/default.aspx">...</a>
будет заменен на:
<a href="/webmail/default.aspx">...</a>
(если ответ получен из приложения веб-почты)
и
<a href="/payroll/default.aspx">...</a>
(если ответ получен из приложения для расчета заработной платы)
Предупреждение
При изменении заголовков ответов или содержимого ответа с помощью правила исходящего перезаписи следует соблюдать дополнительную осторожность, чтобы убедиться, что текст, который вставляется в ответ, не содержит исполняемый код на стороне клиента, что может привести к уязвимостям межсайтовых сценариев. Это особенно важно, если правило перезаписи использует ненадежные данные, такие как заголовки HTTP или строка запроса, для создания строки, которая будет вставлена в HTTP-ответ. В таких случаях строка замены должна быть закодирована с помощью функции HtmlEncode , например:
<action type="Rewrite" value="{HtmlEncode:{HTTP_REFERER}}" />
Чтобы создать правило, выполните следующие действия.
- Перейти к диспетчеру IIS
- Выберите "Веб-сайт по умолчанию"
- В представлении функций щелкните "Переопределение URL-адреса".
- В области Действия справа щелкните "Добавить правила...". В диалоговом окне "Добавление правил" выберите "Пустое правило" в категории "Правила для исходящего трафика" и нажмите кнопку ОК:
Теперь необходимо определить фактическое правило для исходящего трафика. В модуле переопределения URL-адресов 2.0 правило перезаписи исходящего трафика определяется путем указания следующих сведений:
- Имя правила.
- Необязательное условие, определяющее, следует ли применять это правило к ответу.
- Шаблон, используемый для сопоставления строки в ответе.
- Необязательный набор условий.
- Действие, выполняемое при совпадении шаблона и успешном выполнении всех проверок условий.
Именование правила
В текстовом поле "Имя" введите имя, которое будет однозначно определять правило, например"Добавить префикс приложения".
Определение условия
Предварительное условие используется для оценки того, следует ли выполнять оценку правил для исходящего трафика в ответе. Например, если правило изменяет html-содержимое, следует оценивать только HTTP-ответы с заголовком типа контента, для которого задано значение "text/html". Оценка исходящих правил и перезапись содержимого — это ресурсоемкая операция, которая может негативно повлиять на производительность веб-приложения. Поэтому используйте предварительные условия, чтобы сузить случаи применения правил исходящего трафика.
Так как создаваемое правило должно применяться только к HTML-ответам, вы определите условие, которое проверяет, эквивалентен ли тип содержимого заголовка HTTP-ответа "text/html".
Чтобы определить условие, выполните следующие действия.
В списке Предварительные условия выберите "<Создать новое предварительное условие...>".
Откроется диалоговое окно редактора предварительных условий, где необходимо определить условие. Укажите параметры предварительных условий следующим образом:
Нажмите кнопку ОК, чтобы сохранить предварительное условие и вернуться на страницу "Изменение правила".
Определение соответствующего область
Правило перезаписи для исходящего трафика может работать с содержимым заголовка HTTP или с содержимым текста ответа. Это правило должно заменить ссылки в содержимом ответа, поэтому в раскрывающемся списке "Область сопоставления" выберите "Ответ".
Определение фильтра тегов
Фильтры тегов используются для область сопоставления шаблонов только с определенными элементами HTML, а не для оценки всего ответа по шаблону правила. Сопоставление шаблонов — это очень ресурсоемкая операция, и если весь ответ вычисляется по шаблону, это может значительно замедлить время отклика веб-приложения. Фильтры тегов позволяют указать, что сопоставление шаблонов должно применяться только в содержимом определенных html-тегов, что значительно сокращает объем данных, которые необходимо оценить по шаблону регулярного выражения.
Чтобы определить фильтр тегов, разверните раскрывающийся список "Соответствие содержимого в: ", а затем выберите и проверка поле проверка "A (атрибут href)".
Это задает правило для применения шаблона только к значению атрибута href гиперссылки, как показано в следующем примере:
<a href="this string will be used for pattern matching">Some link</a>
Определение шаблона
В текстовом поле "Шаблон" введите следующую строку:
^/(.*)
Эта строка является регулярным выражением, которое указывает, что шаблон будет соответствовать любой строке URL-пути, начинающейся с символа "/".
Обратите внимание на использование круглых скобок в шаблоне. Эти круглые скобки создают группу отслеживания, на которую позже можно ссылаться в правиле с помощью обратных ссылок.
Определение условия
Вам нужно изменять ссылки в HTML-коде ответа, только если ответ получен из веб-почты или приложения для расчета заработной платы. Чтобы проверка, что вы будете использовать условие, которое анализирует путь URL-адреса, запрошенный клиентом. Кроме того, вы определите шаблон условия, который записывает папку приложения из запрошенного URL-адреса, чтобы правило могло повторно использовать его при перезаписи ссылок в ответе.
- Разверните поле группы условия.
- Нажмите кнопку "Добавить..." чтобы открыть диалоговое окно для определения условий.
- Для параметра "Condition input:" введите эту строку: "{URL}". Модуль переопределения URL-адресов настраивается для использования URL-пути, запрошенного веб-клиентом.
- В раскрывающемся списке выберите "Соответствует шаблону".
- Введите
^/(webmail|payroll)/.*
в текстовое поле Шаблон . Это регулярное выражение используется для сопоставления URL-путей, которые начинаются с/webmail
или/payroll
. Круглые скобки в шаблоне захватывают часть совпадающей строки URL-адреса, чтобы ее можно было использовать при создании замещающего URL-адреса. - Нажмите кнопку ОК, чтобы сохранить условие и вернуться к пользовательскому интерфейсу "Добавить правило".
Определение действия
Выберите тип действия "Перезаписать", указанный в поле группы "Действие". В текстовом поле "Значение" введите следующую строку:
/{C:1}/{R:1}
Эта строка задает новое значение, на которое необходимо переписать адрес ссылки. {C:1} является обратной ссылкой на группу отслеживания шаблонов условий, и она будет заменена строками "webmail" или "payroll". {R:1} является обратной ссылкой на группу отслеживания шаблонов правил, и в этом конкретном случае она будет заменена исходным URL-путем, который использовался в гиперссылке.
Оставьте значения по умолчанию для всех остальных параметров. Страница свойств "Изменить правило исходящего трафика" должна выглядеть следующим образом:
Сохраните правило, щелкнув действие "Применить" справа.
Чтобы проверка конфигурацию только что созданных правил, откройте файл web.config, расположенный в %SystemDrive%\inetput\wwwroot\
. В этом файле вы увидите <rewrite>
раздел, содержащий это определение правила:
<rewrite>
<rules>
<rule name="Reverse Proxy to webmail" stopProcessing="true">
<match url="^webmail/(.*)" />
<action type="Rewrite" url="http://localhost:8081/{R:1}" />
</rule>
<rule name="Reverse Proxy to payroll" stopProcessing="true">
<match url="^payroll/(.*)" />
<action type="Rewrite" url="http://localhost:8082/{R:1}" />
</rule>
</rules>
<outboundRules>
<rule name="Add application prefix" preCondition="IsHTML">
<match filterByTags="A" pattern="^/(.*)" />
<conditions>
<add input="{URL}" pattern="^/(webmail|payroll)/.*" />
</conditions>
<action type="Rewrite" value="/{C:1}/{R:1}" />
</rule>
<preConditions>
<preCondition name="IsHTML">
<add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
</preCondition>
</preConditions>
</outboundRules>
</rewrite>
Тестирование правила
Чтобы проверить, правильно ли правило перезаписывает URL-адреса в ответе, откройте веб-браузер и отправьте запрос к http://localhost/webmail/default.aspx
или http://localhost/payroll/default.aspx
. Вы увидите, что правило перезаписи для исходящего трафика изменило ссылку в HTML-ответе:
Итоги
В этом пошаговом руководстве вы узнали, как настроить модуль перезаписи URL-адресов и маршрутизацию запросов приложений для реализации сценария обратного прокси-сервера. Кроме того, вы узнали, как использовать новую функцию исходящего перезаписи модуля переопределения URL-адресов 2.0 для исправления ссылок в ответах приложений перед их обслуживанием веб-клиенту.
Обратите внимание, что при использовании обратного прокси-сервера часто также требуется перезаписать заголовки HTTP-ответа. Сведения о том, как использовать модуль переопределения URL-адресов 2.0 для изменения заголовка HTTP ответа, см. в статье Изменение заголовков ответа HTTP.