我在做什么?
我正在设置蓝绿色部署以实现零停机部署。
如何执行?
什么不按预期工作?
当我从不同的IP地址连接到网站,特别是对于静态内容,蓝色/绿色应用程序接收到其他客户端拥有的错误IP地址(REMOTE_ADDR)。
例:
当我检查IIS应用程序日志时,来自B的请求的日志显示IP地址为'A',虽然它应该是B!
我也可以根据cookie确认请求是来自B,我们在cookie中保存ip地址,根据IIS应用日志,cookie中的ip地址不等于REMOTE_ADDR。
编辑:我捕获了另一个问题,“有时”一些JavaScript响应的MIMEtypes正在成为“文本/ 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 :我find了一些有用的东西。 当我访问一些返回40x状态码的链接时。 与每次IP地址重放有关的错误。 在我未经authentication之后,这里是我被redirect的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 ”
奇怪的?
我试图解决的情况是什么?
我认为这是某种caching问题,然后我禁用了所有我知道的caching机制;
但它没有工作。
我已经清除了所有的configuration,并使用了针对这种configuration转发IP地址到后端Web应用开发的ARR Helper ,我遇到了同样的问题。
您可能需要的configuration文件
在主Web应用程序中设置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>
在全局级别禁用ARRcaching的规则。
<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>
整个Web场configuration
<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专家,但我发现你的问题很有趣。 我看到你的全局caching禁用规则中设置了一个stopProcessing="true"参数。 在caching禁用规则停止处理任何进一步的规则之后,也许您的variables设置规则不会被执行。