Назад | Перейти на главную страницу

Можно ли использовать Elastic Load Balancer на сервере IIS, принимающем загрузки BITS?

У меня есть веб-сайт, размещенный на EC2 с использованием IIS 8.5. У меня есть виртуальный каталог с включенной загрузкой BITS, и все работает через http, а теперь и через https, когда мой URL указывает на общедоступный EIP экземпляра.

Дизайн требует использования эластичного балансировщика нагрузки во фронтальном (-ых) экземпляре (-ах). Хитрость в том, что когда я подключаю ELB, я начинаю получать 500 ошибок для сеансов BITS. Мы определили, что, когда мы не используем ELB, задания выполняются правильно.

Конкретные ошибки BITS, которые мы видели в журналах IIS, назывались «Недействительный индекс». внутри ошибки HTTP 500. Видеть этот вопрос об отслеживании кодов ошибок BITS.

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

Несмотря на то, что AWS утверждает, что ELB поддерживает все HTTP-команды по состоянию на конец 2013 года, я столкнулся с той же проблемой, и мне пришлось использовать пересылку TCP, чтобы загрузки BITS работали через ELB.

Подробности: У меня есть две виртуальные машины Server 2012 R2, одна в кластере vSphere 5.5 в colo (VM1), другая в AWS (VM2), обе полностью исправлены по состоянию на 01.06.2016. VM1 использует PowerShell (Start-BitsTransfer -TransferType Upload) для отправки файлов на VM2 (работает IIS 8.5 с привязками HTTP и HTTPS, последняя использует сертификат, выданный CA).

  • Загрузка HTTP BITS с виртуальной машины 1 на эластичный IP-адрес виртуальной машины 2 выполнена успешно.
  • Биты HTTPS загружаются с VM1 на эластичный IP-адрес VM2.
  • HTTPS BITS загружает из VM1 в ELB VM2, настроенный для HTTPS (уровень 7) с разгрузкой SSL, указывает на сбой привязки HTTP экземпляра.
  • HTTPS BITS загружает из VM1 в ELB VM2, настроенную для пересылки TCP (уровень 4; без разгрузки SSL) в привязку HTTPS экземпляра.

Пункт 3 - это то, что я (и, кажется, вы) хотел, но вариант 4 - это то, что я выбрал, и он работает.

Детали ошибки для потомков (/ 50 человек в год, которые сталкиваются с этим вопросом): При исследовании варианта 3 VM1 выдает следующую ошибку:

PS C:\> $error[0] | Select-Object *
writeErrorStream      : True
PSMessageDetails      : 
Exception             : System.Exception: Invalid index.

TargetObject          : 
CategoryInfo          : InvalidOperation: (:) [Start-BitsTransfer], Exception
FullyQualifiedErrorId : StartBitsTransferCOMException,Microsoft.BackgroundIntelligentTransfer.Management.NewBitsTransferCommand
ErrorDetails          : 
InvocationInfo        : System.Management.Automation.InvocationInfo
ScriptStackTrace      : at <ScriptBlock>, <No file>: line 1
PipelineIterationInfo : {0, 1}

Журналы IIS VM2 показывают следующее:

#Software: Microsoft Internet Information Services 8.5
#Version: 1.0
#Date: 2016-06-03 01:08:56
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken
2016-06-03 01:20:52 xxx.xx.x.xx BITS_POST /upload/file.dat (bits_error:,500,0x80070585) 8080 - xxx.xx.x.xxx Microsoft+BITS/7.7 - 500 0 0 0

Как вы отметили, 0x80070585 соответствует исключению Invalid index, и, как вы отметили на еще один вопрос о переполнении стека, Отслеживание неудачных запросов показывает, что исключение происходит в bitssrv.dll, но я не смог определить в журналах ничего, что могло бы привести к действию.