Что я пытаюсь сделать?
Я настраиваю сине-зеленое развертывание, чтобы обеспечить развертывание без простоев.
Как реализация?
Что не работает должным образом?
Когда я подключаюсь к веб-сайту с разных IP-адресов, особенно для статического содержимого, сине-зеленые приложения получают неправильные IP-адреса (REMOTE_ADDR), принадлежащие другому клиенту.
Пример:
Когда я проверяю журналы приложений IIS, в журнале запроса, поступающего от B, IP-адрес отображается как «A», хотя он должен быть B!
Я также могу подтвердить, что запрос поступает от B в соответствии с файлом cookie, мы храним IP-адрес в файле cookie, а IP-адрес в cookie не равен REMOTE_ADDR согласно журналу приложения IIS.
Редактировать: Я зафиксировал еще одну проблему: «иногда» некоторые из mime-типов ответа javascript становятся в ответах «text / html», поскольку мы реализуем X-Content-Type-Options = nosniff, эти сценарии не загружаются браузером.
Refused to execute script from 'https://foo.com/bundles/scripts/common?v=Pc3UWD-GF8GEIazC15mnIr_UYtcH3cQPlDPwAf2cXtU1' because its MIME type ('text/html') is not executable, and strict MIME type checking is enabled.
Редактировать 2: Нашел кое-что полезное. Когда я посещаю ссылку, которая возвращает код состояния 40x. Ошибка, связанная с постоянным воспроизведением IP-адреса. А вот URL-адрес, который меня перенаправили после того, как я не прошел аутентификацию.
Декодированное значение returnUrl: "/ error / notfound /? 404;https://foo.com:10003/error/notfound"
Странно?
Что я пытался разрешить в ситуации?
Я подумал, что это какая-то проблема с кешированием, тогда я отключил все известные мне механизмы кеширования;
Но это не сработало.
Я очистил все конфигурации и использовал ARR Helper который разработан для пересылки IP-адреса в самое заднее веб-приложение в таких конфигурациях, с которыми я столкнулся с тем же проблема.
Файлы конфигурации, которые могут вам понадобиться
Правило, устанавливающее HTTP_X_FORWARDED_FOR_INTERNAL в основном веб-приложении.
<rule name="Set HTTP_X_FORWARDED_FOR_INTERNAL">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
<serverVariables>
<set name="HTTP_X_FORWARDED_FOR_INTERNAL" value="{REMOTE_ADDR}" />
</serverVariables>
<action type="None" />
</rule>
Правило, устанавливающее REMOTE_ADDR в сине-зеленых приложениях.
<rule name="Set REMOTE_ADDR">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_X_FORWARDED_FOR_INTERNAL}" pattern="^$" negate="true" />
</conditions>
<serverVariables>
<set name="REMOTE_ADDR" value="{HTTP_X_FORWARDED_FOR_INTERNAL}" />
<set name="REMOTE_HOST" value="{HTTP_X_FORWARDED_FOR_INTERNAL}" />
</serverVariables>
<action type="None" />
</rule>
Правило, отключившее кеширование ARR на глобальном уровне.
<rewrite>
<globalRules>
<rule name="ARR_CacheControl_9dc69ea7-26f6-4654-af58-2e289d681463" enabled="true" patternSyntax="Wildcard" stopProcessing="true">
<match url="*" />
<serverVariables>
<set name="ARR_CACHE_CONTROL_OVERRIDE" value="1,no-cache" />
</serverVariables>
<action type="None" />
</rule>
</globalRules>
</rewrite>
Конфигурация всей веб-фермы
<webFarms>
<webFarm name="iissucks" enabled="true">
<server address="bluecloud" enabled="true">
<applicationRequestRouting httpPort="880" httpsPort="8443" />
</server>
<server address="greencloud" enabled="true">
<applicationRequestRouting httpPort="980" httpsPort="9443" />
</server>
<applicationRequestRouting>
<healthCheck url="https://iissucks/account/signin" interval="00:00:01" statusCodeMatch="200-599" responseMatch="I_am_healthy." />
<protocol xForwardedForHeaderName="X-Forwarded-For-Farm" includePortInXForwardedFor="false">
<cache enabled="false" queryStringHandling="NoCaching" validationInterval="00:00:00" />
</protocol>
</applicationRequestRouting>
</webFarm>
<applicationRequestRouting>
<hostAffinityProviderList>
<add name="Microsoft.Web.Arr.HostNameRoundRobin" />
</hostAffinityProviderList>
</applicationRequestRouting>
</webFarms>
Я далек от того, чтобы быть экспертом по IIS, но я нашел вашу проблему интересной. Я вижу, что ваше правило отключения глобального кеша имеет stopProcessing="true"
набор параметров в нем. Возможно, ваши правила установки переменных просто не выполняются после того, как правило отключения кеша перестает обрабатывать любые дальнейшие правила.