背景
项目中自己开发的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 等)全部放这里;