Nginx + HTTP 服务:解决响应数据包截断,返回内容不全问题

背景

项目中自己开发的HTTP服务端,在很多机器都正常,但移植到其他机器以及换了一些数据后,发现前端不能正常显示。通过Fiddler抓包工具,发现是服务端返回的数据,没有完整。在此记录下。

问题出现在2个地方:

① 开发的HTTP服务释放tcpsocket前没有等待写入:

cpp 复制代码
tcpSocket->write(HttpResponse::message(json->toJson()).toUtf8());
// 这里缺少一步
tcpSocket->disconnectFromHost();
tcpSocket->waitForDisconnected();

② Nginx 反向代理缓存缓冲区未配置,控制 Nginx 从后端 upstream(代理的后端服务)读取响应数据时,用多少内存缓冲区存放后端返回内容。

具体截图如下:

Fiddler抓到的http响应头:

看下最响应的最末尾。

可见是一个不完整json,json格式有问题。

解决

添加waitForBytesWritten()函数,解决问题 ①,如下所示,进行简单解决:

cpp 复制代码
tcpSocket->write(HttpResponse::message(json->toJson()).toUtf8());
tcpSocket->waitForBytesWritten(10 * 1000);    //等10s,socket写入到tcp缓冲区中。
tcpSocket->disconnectFromHost();
tcpSocket->waitForDisconnected();

在nginx中反向代理中进行配置:

cpp 复制代码
proxy_buffers 8 1M;
proxy_buffer_size 2M;

proxy_buffers 8 1M;

含义:为单个代理请求分配:8 个缓冲区,每个缓冲区大小 1MB 单个请求缓冲区总上限:8 * 1M = 8M

  • 这组缓冲区用来存放后端返回的响应主体(body),分段存放;
  • 缓冲区是按需申请,不是一次性直接占用 8M 内存,有数据才分配;
  • 如果后端响应内容超过 8M,超出部分会写到磁盘临时文件(proxy_temp_path)。

proxy_buffer_size 2M;

含义:单独开辟一块缓冲区,用来存放后端返回的响应头(response header)

  • 这个 buffer 独立于上面 proxy_buffers 的 8 个 buffer;
  • 后端返回的 HTTP 响应头(Status、Cookie、Set-Cookie、自定义 header 等)全部放这里;
相关推荐
重生之高冷汉堡包1 小时前
Perplexity爬虫怎么做?2026常见方案对比、实操教程与问题排查
大数据·网络·爬虫·安全·ai
承渊政道1 小时前
Linux网络学习【深入理解应用层HTTP协议、Cookie与Session机制及HTTPS协议原理】
linux·网络·学习·http·cookie·session
启博网络1 小时前
IPv4枯竭、NAT穿透卡顿?用公网IPv6直连搭建异地组网,速度直接起飞
网络·远程安全访问·启博
羑悻的小杀马特1 小时前
超越Bridge:全面掌握Docker网络隔离与通信的底层逻辑!
运维·网络·docker·容器
电梯界知识分子2 小时前
江西赣州赣县三层设计师自建房:1700mm中空极限利用,全观光铝合金电梯的精度与防震处理
大数据·服务器·网络·人工智能·家用电梯
lhh_qrsly5 小时前
HTTP / HTTPS / MQTT / MQTTs(嵌入式学习版)
学习·http·https
裕晟资质规划21 小时前
三类资质变更报告时限差在哪?军工 15 日、集成印制 10 日
大数据·服务器·网络
轻舟技术A1 天前
Provider 不属于 Agent 核心:rpi 的分层理由与收益
服务器·网络