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

ARR смешивание переменных HTTP-сервера среди пользователей-клиентов

Что я пытаюсь сделать?

Я настраиваю сине-зеленое развертывание, чтобы обеспечить развертывание без простоев.

Как реализация?

  1. У меня один сервер.
  2. Я создал веб-ферму.
  3. Я установил 3 сайта: синий, зеленый, основной на разные порты. Main обрабатывает все запросы от клиентов и перезаписывает запросы к веб-ферме.
  4. Веб-ферма направляет запрос на активный веб-сайт (синий или зеленый) через ARR (маршрутизация запросов приложений)
  5. Поскольку сине-зеленые веб-сайты получают запрос от веб-фермы / ARR, REMOTE_ADDR (IP-адрес клиента) показывает 127.0.0.1.
  6. Я не хочу этого, хотя это ожидается, я создал правило перезаписи URL, которое устанавливает серверную переменную HTTP_X_FORWARDED_FOR_INTERNAL с REMOTE_ADDR на основном веб-сайте.
  7. Я создал еще одно правило на сине-зеленых веб-сайтах, которое устанавливает переменную сервера REMOTE_ADDR с HTTP_X_FORWARDED_FOR_INTERNAL, которая поступает с основного веб-сайта.
  8. В результате я получаю REMOTE_ADDR как реальный IP-адрес клиента. УРА!
  9. Все работает нормально с одним клиентским пользователем.

Что не работает должным образом?

Когда я подключаюсь к веб-сайту с разных IP-адресов, особенно для статического содержимого, сине-зеленые приложения получают неправильные IP-адреса (REMOTE_ADDR), принадлежащие другому клиенту.

Пример:

  1. A и B - разные IP-адреса.
  2. A подключается к foo.com/somestaticfile.css.
  3. B подключается к foo.com/somestaticfile.css.

Когда я проверяю журналы приложений 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-адрес, который меня перенаправили после того, как я не прошел аутентификацию.

https://foo.com/account/signin?sessionExpired=true&returnUrl=%2ferror%2fnotfound%2f%3f404%3bhttps%3a%2f%2ffoo.com%3a10003%2ferror%2fnotfound

Декодированное значение returnUrl: "/ error / notfound /? 404;https://foo.com:10003/error/notfound"

Странно?

Что я пытался разрешить в ситуации?

Я подумал, что это какая-то проблема с кешированием, тогда я отключил все известные мне механизмы кеширования;

  1. Отключен кэш IIS в глобальных настройках.
  2. Отключен кэш ARR через создание правила управления кешем.
  3. Отключен кеш веб-фермы.

Но это не сработало.

Я очистил все конфигурации и использовал 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" набор параметров в нем. Возможно, ваши правила установки переменных просто не выполняются после того, как правило отключения кеша перестает обрабатывать любые дальнейшие правила.