日常问题记录

接口返回数据过长导致被截断

  • 【问题描述】:客户端使用curl命令向nginx请求数据,当返回数据量较大时,数据被截断,客户端无法获取完整的数据。

  • 【问题原因】:nginx配置文件中包含了proxy_buffer_size、proxy_buffers两个配置字段,其中proxy_buffer_size用来接收后端服务器response的第一部分,proxy_buffers用来设置读取被代理服务器的缓冲区数目和大小,如果proxy_buffers关闭,nginx不会等到所有后端数据都被获取到之后才返回,而是尽快将接收到的数据传给客户端,在数据传完之前,nginx接收的最大缓存不能超过proxy_buffer_size。如果proxy_buffers打开了,nginx会尽可能的读取后端数据到buffer中,直至proxy_buffers设置的所有buffer都被写满或数据都被读取完,此时nginx开始向客户端传输数据。

  • 【解决方案】:在nginx.conf配置文件中新增proxy_buffers、proxy_buffer_size的设置:

...
proxy_buffer_size  1024k;
proxy_buffers 16 1024k;
...
  • 【后续问题】:调整缓存后,大部分返回长json被截断的问题被解决,但仍偶尔报错,原因仍然为返回的json被截断。

  • 【解决方案】:修改Nginx数据缓存目录权限

    • 尝试第一种方式后,仍偶尔报错,此时查看Nginx error.log日志发现有如下内容:
2019/04/08 13:26:25 [crit] 17724#0: *31140934 open() "/home/admin/your_nginx_cache_folder/data/uwsgi_temp/9/00/0000000009" failed (13: Permission denied) while reading upstream, client: your_client_ip, server: localhost, request: "POST your_api HTTP/1.1", upstream: "uwsgi://127.0.0.1:8000", host: "your_service_ip:8080"
  • 【原因如下】:nginx对于小的反向代理请求是使用内存作中转,对于稍微大一点的,是使用临时文件系统来做中转,但是使用文件系统来中转的时候没有权限。eg:proxy_temp

  • 【解决方案】:此时修改中转用文件目录(proxy_temp)的权限即可,对于为何Nginx没有读取缓存文件目录的权限,可能是某次启动Nginx使用的用户不对导致的。

3D转换
JSRUN前端笔记, 是针对前端工程师开放的一个笔记分享平台,是前端工程师记录重点、分享经验的一个笔记本。JSRUN前端采用的 MarkDown 语法 (极客专用语法), 这里属于IT工程师。