我在node.js上有一个网站。我用iisnode托管应用程序。
我有一个页面,以像Pinterest这样的风格显示大量照片。图像以普通<img />
加载,并将适当的src附加到DOM。这些映像是服务器上的纯静态资源。
所有图片几乎立即加载到最新的Chrome Chrome,Android Chrome甚至iOS Chrome上。
然而,在iOS Safari上,对于每一百张照片,随机地,一张或两张照片不会立即加载,相反,这些照片将在大约20-30秒内加载。 Safari开发人员调试器表示该图像请求有20-30秒的延迟。
如果我不使用IISNode并直接使用node.exe作为Web服务器,则问题不存在。我怀疑IISnode和iOS Safari之间存在一些奇怪的兼容性问题。在我看来,IISNode在iOS Safari中触发了阻止HTTP连接的东西。
这个问题的原因是什么?
答案 0 :(得分:0)
这种情况与HTTP标头连接:保持活动有关。
IIS的设计不包括响应头连接:keep-alive ,因此IISNode在这里也不例外。对于桌面浏览器和Android浏览器,此行为可能是正常的。但是,如果没有连接:保持活动,似乎iOS Safari将遇到我称之为TCP剥夺的情况,其中旧的连接不会被重用,并且无法创建新的连接,因为旧连接仍处于打开状态且限制为已达到打开连接的总数。我个人认为这个理论解释了20-30秒的延迟行为。在20-30秒结束时,旧连接最终关闭,并且可以建立新连接。
iOS Safari和IISNode的组合导致了这个问题。由于无法使IIS包含连接:保持活动。在没有IISNode代理层的情况下直接在Node.exe内部提供所有内容是此问题的解决方案。