发生在23年时候遇到的一个故障,好久没更新博客园了,今年一直在忙其他事情,整理资料的时候突然看到之前整理的文档,索性拿出来发一下
一、问题现象
客户端访问HTTP服务,在GET数据时有部分接口数据返回不完整,导致页面加载画面显示不全。
客户端控制台看部分接口有报错
使用Wireshark打开抓取的数据包后发现传输的数据不完整
二、处理过程和数据分析
1、信息收集
客户端源地址:XXXX
服务器目的地址:XXXX
端口:XXXX
协议:HTTP
请求URL:/iuap-apcom-workbench/manager/application/getAllAppsbyLabelGroup?isFastPermission=false
2、在出口溯源抓取数据包分析
在溯源设备上抓取对应数据包后,使用wireshark打开分析
对URL请求使用命令进行过滤
http.request.uri=="/iuap-apcom-workbench/manager/application/getAllAppsbyLabelGroup?isFastPermission=false"
追踪对应的请求流发现,数据包中含有 TCP Window full,并且数据传输未完成的情况下服务器主动发 RST断开了连接。
TCP window full:是指的发送端发送的数据已经达到的接受窗口的上限。继而停止发送,等待新的接收窗口的通告。
RST报文:TCP首部中的6个标志比特之一,表示重置连接、复位连接。
整个交互过程中网络层面未发现明显问题,大致判断数据中断是由RST报文导致,而触发RST的条件很有可能是TCP window full
联系业务侧进行测试,修改接受文件大小拨测,由原来的900K改为100K左右测试结果数据传输正常。
结论:数据传输的大小影响传输是否成功
遂联系业务同事排查系统应用层面是否存在限制
3、系统应用排查
检查nginx发现异常日志
2023/08/02-14:26:28[crit]18223#0:*759884open()"/usr/local/webserver/nginx/proxytemp/2/36/0000001362" failed(13: Permission denied) while reading upstream,
通过网上论坛得知,使用nginx代理转发接口数据过大的时候,nginx会将多余缓存的部分写入内存,报错日志为写入内存无权限。
三、解决方案
1、修改文件权限
chmod
语法: chmod [who] [+ - =] [mode] 文件名
操作对象who可是下述字母中的任一个或者它们的组合:
u 表示“用户 (user)”,即文件或目录的所有者
g 表示“同组 (group) 用户”,即与文件属主有相同组ID的所有用户
o 表示“其他 (others) 用户”
a 表示“所有 (all) 用户”。它是系统默认值
添加某个权限
取消某个权限。
2、设置缓存区大小
proxy_buffer_size
proxy_buffer_size 的默认值是 4k 或者 8k, 它的作用是指定 nginx 读缓存的大小。Nginx 使用 proxy_buffer_size 的大小申请相应 read_buf。
直接在系统视图执行poxy_buffer_size 20K;即可,按照需求配置大小
执行完需要nginx s reload重新加载nginx 配置使得命令生效。