Устранение неполадок со службой приложений в шлюзе приложений

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

Обзор

В этой статье вы научитесь устранять следующие неполадки.

  • URL-адрес службы приложений открывается в браузере при перенаправлении.
  • В качестве домена файлов cookie ARRAffinity службы приложений вместо имени исходного узла используется имя узла службы приложений: example.azurewebsites.net.

В случае отправки внутренним приложением ответа перенаправления, возможно, придется перенаправить клиента на URL-адрес, отличный от указанного во внутреннем приложении. Это может потребоваться, если служба приложений размещена за шлюзом приложений и требует от клиента перенаправления на свой относительный путь. Например, перенаправление с contoso.azurewebsites.net/path1 на contoso.azurewebsites.net/path2.

При отправке ответа перенаправления служба приложений использует то же имя узла в заголовке расположения своего ответа, что и в запросе, полученном от шлюза приложений. Например, клиент делает прямой запрос домену contoso.azurewebsites.net/path2, а не через contoso.com/path2 шлюза приложений. Это выполняется в обход шлюза приложений.

Данная проблема может возникать по следующим основным причинам.

  • Перенаправление, настроенное в службе приложений. Перенаправление может осуществляться из-за добавления в запрос завершающей косой черты.
  • Проверка подлинности Azure Active Directory, приводящая к перенаправлению.

При использовании служб приложений, расположенных за шлюзом приложений, доменное имя, связанное со шлюзом приложений (example.com), отличается от доменного имени службы приложений (например, example.azurewebsites.net). Значение домена файлов cookie ARRAffinity, заданное службой приложений, содержит нежелательное имя домена example.azurewebsites.net. Исходное имя узла example.com должно быть значением доменного имени в файле cookie.

Пример конфигурации

  • Базовый и многосайтовый прослушиватель HTTP
  • Серверный пул адресов: Служба приложений
  • Параметры протокола HTTP: активная команда Выбрать имя узла из серверного пула адресов
  • Проба: активная команда Выбрать имя узла из параметров HTTP

Причина

Служба приложений является многоклиентской, поэтому использует заголовок узла в запросе для перенаправления запроса в правильную конечную точку. Доменное имя по умолчанию для служб приложений *. azurewebsites.net (например, contoso.azurewebsites.net) отличается от доменного имени шлюза приложений (например, contoso.com).

В качестве имени узла исходный запрос клиента использует доменное имя шлюза приложений contoso.com. Необходимо настроить шлюз приложений, чтобы изменить имя узла в исходном запросе на имя узла службы приложений при маршрутизации запроса в серверную часть службы приложений. Используйте переключатель Выбрать имя узла из серверного пула адресов в конфигурации HTTP-параметров шлюза приложений. Используйте переключатель Выбрать имя узла из внутренних параметров HTTP в конфигурации пробы работоспособности.

Изменение имени узла шлюзом приложений

В процессе перенаправления вместо исходного имени узла contoso.com служба приложений использует переопределенное имя узла contoso.azurewebsites.net в заголовке расположения, если не настроено иное. Ознакомьтесь со следующим примером заголовков запросов и ответов.

## Request headers to Application Gateway:

Request URL: http://www.contoso.com/path

Request Method: GET

Host: www.contoso.com

## Response headers:

Status Code: 301 Moved Permanently

Location: http://contoso.azurewebsites.net/path/

Server: Microsoft-IIS/10.0

Set-Cookie: ARRAffinity=b5b1b14066f35b3e4533a1974cacfbbd969bf1960b6518aa2c2e2619700e4010;Path=/;HttpOnly;Domain=contoso.azurewebsites.net

X-Powered-By: ASP.NET

Обратите внимание, что в предыдущем примере для перенаправления заголовок ответа использует код состояния 301. Заголовок расположения использует имя узла службы приложений вместо исходного имени узла www.contoso.com.

Решение. Выполните перезапись заголовка расположения

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

Примечание

Поддержка перезаписи HTTP-заголовков доступна только для Standard_v2 и WAF_V2 SKU шлюза приложений. При использовании номера SKU версии 1 рекомендуется выполнить миграцию из версии 1 в версию 2. Можно использовать функцию перезаписи и другие расширенные возможности, доступные в номере SKU версии 2.

Альтернативное решение: использование имени личного домена

При использовании номера SKU версии 1 перезапись заголовка расположения невозможна. Эта функция доступна только для номера SKU версии 2. Чтобы устранить проблему перенаправления и не производить переопределение узла, передайте в службу приложений имя узла, полученное шлюзом приложений.

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

Необходимо быть владельцем личного домена и выполнить следующую процедуру.

  • Зарегистрируйте домен в списке личных доменов службы приложений. В личном домене должна быть запись CNAME, указывающая на полное доменное имя службы приложений. Дополнительные сведения см. в разделе Сопоставление существующего настраиваемого DNS-имени со службой приложений Azure.

    Список личных доменов службы приложений

  • Ваша служба приложений готова к приему имени узла www.contoso.com. Измените запись CNAME в DNS, чтобы она указывала на полное доменное имя шлюза приложений, например appgw.eastus.cloudapp.azure.com.

  • Убедитесь, что ваш домен www.contoso.com разрешается в полном доменном имени шлюза приложений при выполнении запроса DNS.

  • Задайте пользовательскую пробу, чтобы отключить команду Выбрать имя узла из внутренних параметров HTTP. На портале Azure снимите флажок в параметрах пробы. В PowerShell не используйте переключатель -PickHostNameFromBackendHttpSettings для команды Set-AzApplicationGatewayProbeConfig. В поле имени узла пробы введите полное доменное имя службы приложений example.azurewebsites.net. Запросы пробы, отправленные из шлюза приложений, содержат в заголовке узла полное доменное имя.

    Примечание

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

  • Задайте параметры HTTP для шлюза приложений, чтобы отключить команду Выбрать имя узла из пула серверных адресов. Снимите флажок на портале Azure. В PowerShell не используйте переключатель -PickHostNameFromBackendAddress для команды Set-AzApplicationGatewayBackendHttpSettings.

  • Снова привяжите пользовательскую пробу к внутренним параметрам HTTP и убедитесь в работоспособности серверной части.

  • Теперь шлюз приложений должен перенаправлять это же имя узла www.contoso.com в службу приложений. Перенаправление происходит по тому же имени узла. Ознакомьтесь со следующим примером заголовков запросов и ответов.

Чтобы выполнить предыдущие шаги с помощью PowerShell для существующей установки, используйте приведенный ниже пример сценария PowerShell. Обратите внимание, что в конфигурации пробы и HTTP-параметров не использованы переключатели -PickHostname.

$gw=Get-AzApplicationGateway -Name AppGw1 -ResourceGroupName AppGwRG
Set-AzApplicationGatewayProbeConfig -ApplicationGateway $gw -Name AppServiceProbe -Protocol Http -HostName "example.azurewebsites.net" -Path "/" -Interval 30 -Timeout 30 -UnhealthyThreshold 3
$probe=Get-AzApplicationGatewayProbeConfig -Name AppServiceProbe -ApplicationGateway $gw
Set-AzApplicationGatewayBackendHttpSettings -Name appgwhttpsettings -ApplicationGateway $gw -Port 80 -Protocol Http -CookieBasedAffinity Disabled -Probe $probe -RequestTimeout 30
Set-AzApplicationGateway -ApplicationGateway $gw
## Request headers to Application Gateway:

Request URL: http://www.contoso.com/path

Request Method: GET

Host: www.contoso.com

## Response headers:

Status Code: 301 Moved Permanently

Location: http://www.contoso.com/path/

Server: Microsoft-IIS/10.0

Set-Cookie: ARRAffinity=b5b1b14066f35b3e4533a1974cacfbbd969bf1960b6518aa2c2e2619700e4010;Path=/;HttpOnly;Domain=www.contoso.com

X-Powered-By: ASP.NET

Дальнейшие действия

Если описанные выше шаги не устранят проблему, отправьте запрос в службу поддержки.