net::ERR_INCOMPLETE_CHUNKED_ENCODING(php项目+nginx)

解决net::ERR_INCOMPLETE_CHUNKED_ENCODING
针对PHP+Nginx环境下出现的net::ERR_INCOMPLETE_CHUNKED_ENCODING错误,本文介绍了一种有效的解决方案,通过调整Nginx配置中的fastcgi_buffers和fastcgi_buffer_size参数来应对大数据量的返回情况。

项目是php+nginx。

今天发现有个页面,chrome浏览器打开报错net::ERR_INCOMPLETE_CHUNKED_ENCODING。浏览器报错如图:
在这里插入图片描述

初步判断是后端接口返回的json数据过大导致的,使用postman工具调用接口,返回的报文有139KB。
在这里插入图片描述
网上找资料,有各种原因,常见的比如php-fpm权限问题,php-tmp临时目录权限问题等,但是都未解决问题。

最后通过新增fastcgi_buffersfastcgi_buffer_size参数解决了问题。

  • 修改nginx.conf文件的php配置片段, 新增最后两行解决问题:
server {
		listen       80;
		server_name  xxx域名;
		
		//此处省略配置... 

		location ~ .*\.php$	{
			include fastcgi.conf;		
			fastcgi_pass  127.0.0.1:9000;
			fastcgi_index index.php;
			expires off;
			access_log off;
			fastcgi_send_timeout 60;
			fastcgi_read_timeout 300;
      
		    ## 解决网络错误 net::ERR_INCOMPLETE_CHUNKED_ENCODING
		    fastcgi_buffers 4 64k;
		    fastcgi_buffer_size 64k;				 
		}
}		

参考博客:

  • https://www.cnblogs.com/jiuyachun/p/10848404.html
  • https://github.com/microsoft/WSL/issues/2100
  • https://www.cnblogs.com/yuanxian/p/5591039.html
  • https://blog.youkuaiyun.com/chenthe1/article/details/81475796
### 可能的原因 `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、付费专栏及课程。

余额充值