Nginx代理Windows Server 2016 IIS站点出现NS_ERROR_NET_PARTIAL_TRANSFER部分传输问题求助
你好,针对你遇到的这个Nginx代理Windows Server 2016 IIS站点出现部分传输失败的问题,我结合类似的排查经验整理了几个可能的解决方向,你可以逐一尝试:
首先先明确下已确认的问题现象,方便后续排查对比:
通过Nginx代理访问Windows Server 2016 Datacenter的IIS站点时,图片、main.js等资源会随机加载失败,Firefox控制台报
NS_ERROR_NET_PARTIAL_TRANSFER;直接访问服务器IP则正常,换成Windows 10的IIS(同Server 2016主机上的VM)或Windows Server 2019/2022各版本都无此问题,已尝试调整Nginx配置、关闭Server 2016的防火墙/Defender、解除IIS限制,均无效。
1. 调整Nginx的连接超时与缓冲区配置
NS_ERROR_NET_PARTIAL_TRANSFER通常和连接中断、数据传输不完整有关,大概率是Nginx的超时设置过短或缓冲区不足导致传输截断。可以在代理的location块中添加或修改以下配置:
proxy_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 60s; proxy_buffering on; proxy_buffer_size 16k; proxy_buffers 4 64k; proxy_busy_buffers_size 128k;
如果站点有大体积静态资源(比如高清图片),可以适当调大proxy_buffers的数值,避免缓冲区不够导致数据截断。
2. 检查IIS的内核缓存与压缩设置
Windows Server 2016的IIS默认配置和Win10/新Server版本存在差异,部分内核级缓存或压缩选项可能和Nginx交互冲突:
- 打开IIS管理器,找到目标站点的输出缓存,尝试禁用内核模式缓存后测试;
- 暂时关闭IIS的静态内容压缩(Gzip/Deflate),避免Nginx和IIS同时压缩导致数据格式异常;
- 检查IIS的请求筛选,确认
最大允许请求长度设置足够大,不会截断大资源文件。
3. 调整Windows Server 2016的TCP/IP堆栈参数
Server 2016默认的TCP自动调优配置可能和Nginx的连接机制不兼容,尝试通过命令调整:
以管理员权限打开命令提示符,执行以下命令:
netsh int tcp set global autotuninglevel=normal netsh int tcp set global rss=enabled
执行完成后重启服务器,再测试代理访问是否正常。
4. 启用Nginx调试日志定位根因
如果以上方法都无效,建议开启Nginx的详细调试日志,捕捉传输过程中的异常细节:
在Nginx配置的http块中添加:
error_log /var/log/nginx/error_debug.log debug;
触发问题后查看日志,重点关注是否有连接中断、超时或IIS提前关闭连接的记录,这能帮你精准定位问题出在代理端还是后端IIS。
5. 尝试禁用Nginx的HTTP/2支持
如果你的Nginx配置了HTTP/2(即listen 443 ssl http2;),可能和Windows Server 2016的IIS存在兼容性问题,暂时注释掉http2参数,改用HTTP/1.1测试,看是否解决资源加载失败的问题。
备注:内容来源于stack exchange,提问作者Dylan D

