O que estou tentando fazer?
Estou configurando a implantação de azul e verde para obter uma implantação sem tempo de inatividade.
Como está a implementação?
- Eu tenho um servidor.
- Eu criei um web farm.
- Eu defini três sites em azul, verde e principal em diferentes portas. Main lida com todas as solicitações dos clientes e reescreve as solicitações para o web farm.
- O Web farm roteia a solicitação para o site ativo (azul ou verde) via ARR (Application Request Routing)
- Como os sites azuis / verdes recebem a solicitação do Web Farm / ARR, o REMOTE_ADDR (endereço IP do cliente) mostra 127.0.0.1.
- Eu não quero isso, embora seja esperado, eu criei uma regra de regravação de URL que define a variável de servidor HTTP_X_FORWARDED_FOR_INTERNAL com REMOTE_ADDR no site principal.
- Eu criei outra regra em sites azuis / verdes que define a variável de servidor REMOTE_ADDR com HTTP_X_FORWARDED_FOR_INTERNAL que vem do site principal.
- No resultado, estou recebendo o REMOTE_ADDR como endereço IP do cliente real. YAY!
- Tudo funciona bem com o usuário único cliente.
O que não está funcionando como esperado?
Quando eu me conecto ao site a partir de endereços IP diferentes, especialmente para conteúdo estático - aplicativos azuis / verdes que recebem endereços IP incorretos (REMOTE_ADDR) que são de propriedade de outro cliente.
Exemplo:
- A e B são diferentes endereços IP.
- A conecta-se a foo.com/somestaticfile.css.
- B conecta-se a foo.com/somestaticfile.css.
Quando eu verifico os logs do aplicativo IIS, o log da solicitação vindo de B mostra o endereço IP como 'A', embora deva ser B!
Também posso confirmar que a solicitação está vindo de B de acordo com o cookie, estamos mantendo o endereço IP no cookie e o endereço IP no cookie não é igual a REMOTE_ADDR de acordo com o log do aplicativo do IIS.
Editar: capturei outro problema, "às vezes" alguns tipos de mime da resposta do javascript estão se tornando "text / html" em respostas, já que implementamos o X-Content-Type-Options = nosniff, esses scripts não estão sendo carregados pelo navegador.
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.
Editar 2 : Eu encontrei algo útil. Quando visito algum link que retorna 40x código de status. O erro relacionado com o endereço IP reproduzindo todas as vezes. E aqui está o URL que eu estou sendo redirecionado, depois que eu não me autentiquei.
link
O valor decodificado do returnUrl é:
"/ error / notfound /? 404; link "
Estranho?
O que tentei resolver a situação?
Eu pensei que fosse algum tipo de problema de cache, então eu desabilitei todos os mecanismos de cache que eu sei quais são;
- Cache do IIS desativado nas configurações globais.
- Cache ARR desativado por meio da criação da regra de controle de cache.
- Cache de farm da web desativado.
No entanto, não funcionou.
Limpei todas as configurações e usei ARR Helper , que é desenvolvido para encaminhar o endereço IP para o aplicativo web mais atrasado em configurações como essa, eu encontrei com o mesmo problema.
Arquivos de configuração que você pode precisar
Regra que define HTTP_X_FORWARDED_FOR_INTERNAL no aplicativo principal da web.
<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>
Regra que define o REMOTE_ADDR em aplicativos azuis / verdes.
<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>
Regra que desativou o armazenamento em cache da ARR no nível global.
<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>
Configuração inteira do web farm
<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>