You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nuxt /_loading/sse请求报ERR_INCOMPLETE_CHUNKED_ENCODING问题排查

问题成因分析

这个错误是SSE(Server-Sent Events)长连接异常结合Nginx上游超时共同导致的,核心成因可拆解为以下几点:

  • Nginx超时配置与SSE长连接不兼容:SSE依赖HTTP长连接维持实时推送,若Nginx的proxy_connect_timeout、proxy_send_timeout、proxy_read_timeout设置过短,当上游Node服务未在超时窗口内推送新事件时,Nginx会主动断开与Node的连接,导致浏览器接收到不完整的分块响应,触发ERR_INCOMPLETE_CHUNKED_ENCODING。
  • Docker容器间网络通信异常:如果Nginx容器与Node容器不在同一自定义网络、DNS解析失败、端口映射错误,或存在容器间防火墙限制,会导致Nginx无法稳定连接上游Node服务,触发连接超时(110错误)。
  • Nuxt 2.14内置SSE接口的实现问题:/_loading/sse是Nuxt内置的加载状态推送接口,若服务端未正确处理SSE连接的保活机制,或空闲时意外关闭连接,会被Nginx判定为上游超时。
  • 分块传输编码格式错误:若Node服务返回的SSE响应未正确维护分块编码规则(比如未及时刷新响应流、分块大小标识异常),Nginx代理时无法解析完整响应,也会触发连接中断。
是否属于预期情况?

这绝对不属于预期情况。正常配置下,Nginx可稳定代理SSE长连接,浏览器不会频繁出现编码错误。该问题属于配置不当、容器网络异常或服务实现漏洞导致的异常,需针对性修复。

调试排查步骤

1. 调整Nginx代理超时配置适配SSE长连接

修改Nginx反向代理配置,针对SSE接口添加长连接支持参数:

location /_loading/sse {
    proxy_pass http://node-service:3000;  # 替换为你的Node容器地址/端口
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    
    # 延长超时时间,适配SSE长连接特性
    proxy_connect_timeout 600s;
    proxy_send_timeout 600s;
    proxy_read_timeout 600s;
    
    # 开启HTTP/1.1并禁用Connection头,保持长连接
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    
    # 禁用缓存,避免SSE响应被缓存截断
    proxy_buffering off;
    proxy_cache off;
}

修改后重启Nginx容器,观察错误是否缓解。

2. 验证Docker容器间网络连通性

  • 进入Nginx容器,ping Node容器的服务名/IP,确认网络可达:
    docker exec -it nginx-container-name ping node-service
    
  • 在Nginx容器内用curl直接调用Node的SSE接口,检查是否能正常接收事件:
    docker exec -it nginx-container-name curl http://node-service:3000/_loading/sse
    

若ping不通或curl失败,需检查Docker网络配置(如是否在同一自定义网络、容器端口是否正确暴露)。

3. 排查Node服务(Nuxt)的SSE稳定性

  • 查看Nuxt服务日志,确认是否有SSE连接相关错误(如连接意外关闭、服务无响应):
    docker logs node-container-name
    
  • 绕过Nginx,直接访问Node服务的SSE接口(如http://localhost:3000/_loading/sse),观察是否能稳定接收事件,排除Node服务本身的问题。

4. 检查TLS/SSL配置对长连接的影响

由于使用HTTPS(444端口),需确认Nginx的SSL配置支持长连接:

server {
    listen 444 ssl;
    ...
    # 延长HTTPS长连接超时时间
    keepalive_timeout 600s;
    # 开启SSL会话复用,减少握手开销
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 600s;
}

同时检查SSL协议和套件是否兼容浏览器长连接需求,避免因SSL握手失败导致连接中断。

5. 启用Nginx详细代理日志定位问题

在Nginx配置中开启调试级别的代理日志,记录请求全生命周期:

http {
    ...
    log_format proxy_debug '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for" '
                          'upstream_addr=$upstream_addr '
                          'upstream_response_time=$upstream_response_time '
                          'request_time=$request_time';

    access_log /var/log/nginx/access.log proxy_debug;
}

重启Nginx后,查看日志中的upstream_response_time和request_time字段,确认超时发生在连接阶段还是数据读取阶段,进一步缩小排查范围。

内容的提问来源于stack exchange,提问作者Serious Angel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 14:55:10