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 等)全部放这里;
相关推荐
xiaoye-duck10 分钟前
《C++ 项目:手写大模型接入 SDK》Ollama接口设计(上):初始化、全量响应实现和测试
开发语言·网络·c++·语言模型
无足鸟ICT2 小时前
【RHCA+】iptraf-ng(网络监控分析)
linux·网络
坤坤子吖4 小时前
Linux网络编程:TCP服务器的多进程与多线程实现
linux·服务器·开发语言·网络·c++·笔记·学习
xiaoye-duck6 小时前
《C++ 项目:手写大模型接入 SDK》LLMManager架构设计与实现
开发语言·网络·c++·语言模型
andxe6 小时前
工业级 PoE 交换机选型指南:破解边缘部署四大核心难题
运维·网络·安全·光通信·交换机
LK_079 小时前
【FastAPI】基础篇 01|开始之前:API、HTTP 与 FastAPI 到底是什么
网络协议·http·fastapi
say_fall9 小时前
【Linux网络编程】计算机网络基础:局域网与广域网、OSI七层模型与TCP/IP五层模型、封装解包与MAC/IP地址、端口号与socket编程接口
linux·网络·tcp/ip·计算机网络·信息与通信
阿星_9 小时前
pydio登陆不了分析问题
网络协议·http·https
Joy T9 小时前
Gzip 压缩原理与实践:HTTP 响应压缩、性能收益与工程配置
网络·网络协议·http
叼烟扛炮9 小时前
Linux 学习笔记(五十四):内网穿透实战——用 frp 让外网访问你的私人电脑
linux·服务器·网络·笔记·学习