NGINX_ERR_INCOMPLETE_CHUNKED_ENCODING

本文描述了前端访问时出现responsecode200但数据不完整的问题,并记录了Chrome浏览器报错ERR_INCOMPLETE_CHUNKED_ENCODING的具体情况及nginx错误日志。通过对服务器状态的分析,确定了问题是由于文件访问权限不足导致,并给出了相应的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述: 前端访问,response code 200 ,但是数据不完整,有时候正常,有时候不正常!

chrome 报错:ERR_INCOMPLETE_CHUNKED_ENCODING

nginx error log:

2016/07/05 10:43:50 [crit] 12754#0: *35579 open() "/usr/local/nginx/proxy_temp/6/18/0000000186" failed
(13: Permission denied) while reading upstream, client: 10.118.202.112, server: 10.118.230.25, request:
"GET /airscape-server/dependence/incorrect HTTP/1.1", upstream: "http://10.118.230.25:8081/airscape-
server/dependence/incorrect", host: "10.118.230.25", referrer: "http://10.118.230.25/"

服务器状态:

nobody   12754 27864  0 Jun29 ?        00:00:27 nginx: worker process
nobody   12755 27864  0 Jun29 ?        00:00:31 nginx: worker process
root     27864     1  0 Apr29 ?        00:00:00 nginx: master process ./nginx

显然访问权限问题: chown -R nobody ./proxy_temp

转载于:https://my.oschina.net/u/2402049/blog/706255

### 可能的原因 `net::ERR_INCOMPLETE_CHUNKED_ENCODING` 错误通常表示客户端接收到的数据流未按预期完成传输。当使用 `fetchEventSource` 进行 Server-Sent Events (SSE) 请求时,这种错误可能是由于服务器未能正确结束响应或者中间件(如 Nginx)在处理分块编码时出现问题所致[^1]。 以下是可能导致该问题的具体原因: 1. **Nginx 缓冲区设置不当**:如果 Nginx 的代理缓冲区大小不足以容纳 SSE 数据流,则可能会截断数据流并引发此错误[^4]。 2. **服务器端代码逻辑问题**:如果服务端未能正确发送完整的 HTTP 响应头或意外终止了连接,也可能导致此类错误[^3]。 3. **网络不稳定**:在网络质量较差的情况下,部分数据包可能丢失,从而造成不完整的数据流[^5]。 4. **Gzip 压缩冲突**:启用 Gzip 压缩功能后,某些情况下会干扰分块编码的正常工作。 --- ### 解决方案 #### 方案一:调整 Nginx 配置 可以通过修改 Nginx 配置来适应 SSE 流式传输的需求。具体参数如下: ```nginx http { ... proxy_buffering off; proxy_cache off; location /your-sse-endpoint/ { proxy_set_header Connection ''; proxy_http_version 1.1; chunked_transfer_encoding on; # 调整缓冲区大小以支持大流量 SSE 数据 proxy_buffer_size 4096k; proxy_buffers 16 4096k; proxy_busy_buffers_size 8192k; proxy_temp_file_write_size 8192k; } } ``` 以上配置禁用了代理缓冲机制 (`proxy_buffering`) 和缓存 (`proxy_cache`),确保数据能够实时传递给客户端而不被截断。 #### 方案二:检查服务端实现 验证服务端是否按照标准实现了 SSE 协议。以下是一个典型的 Node.js 实现示例: ```javascript app.get('/events', function(req, res) { res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache'); res.setHeader('Connection', 'keep-alive'); const sendEvent = () => { try { res.write(`data: ${JSON.stringify({ time: new Date().toISOString() })}\n\n`); } catch (e) { console.error(e); clearInterval(intervalId); // 清除定时器以防内存泄漏 } }; const intervalId = setInterval(sendEvent, 1000); req.on('close', () => { clearInterval(intervalId); }); }); ``` 注意以下几点: - 设置正确的 MIME 类型为 `text/event-stream`; - 添加必要的头部字段防止缓存; - 确保每次消息都以 `\n\n` 结束。 #### 方案三:排查网络与压缩设置 1. 如果启用了 Gzip 压缩,请考虑将其关闭或将特定路径排除在外: ```nginx gzip_types text/plain application/json; gzip_disable "msie6"; location /your-sse-endpoint/ { gzip off; } ``` 2. 检查是否有防火墙或其他设备拦截了长连接请求,并适当放宽限制条件。 #### 方案四:客户端重试机制 即使解决了大部分潜在问题,在极端条件下仍可能出现短暂掉线情况。因此建议加入自动重连逻辑: ```javascript const eventSource = new EventSource('/events'); eventSource.onerror = function(event) { console.log('Error occurred:', event); setTimeout(() => { console.log('Attempting reconnect...'); eventSource.close(); initEventSource(); // 自定义函数用于重新初始化连接 }, 5000); // 延迟 5 秒后再尝试恢复链接 }; ``` --- ### 总结 通过合理调整 Nginx 参数、完善服务端协议遵循度以及增强客户端鲁棒性可以有效缓解甚至彻底消除 `net::ERR_INCOMPLETE_CHUNKED_ENCODING` 错误的发生概率。实际操作中需结合具体情况逐一测试上述措施直至找到最佳组合方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值