json字符串太长 被截断

最近咱们有个项目,以前一直没有安装监控,由于是老得项目,以前没有安装nginx,那就没办法收集nginx的日志,而后把日志作切分实时展现,因此上周咱们就装了nginx,而后就出现问题了nginx

咱们这个项目有个接口由于数据比较多,返回的json串就特别长,你用curl调这个接口,发现返回的json串被截断。json

 

解决:一、首先查看nginx的error日志,会有报错提示,相似:nginx的目录明下的文件 failed(13: Permission denied) while reading upstream, client:*.*.*.*,server:..........浏览器

         二、看报错提示是没有权限,缘由就是nginx存在一个buffer的机制,在数据过大超出缓冲区的最大容量,会将数据写入临时文件(临时目录),而此时若是你安装的nginx的用户权限不是服务器权限,就会报没有权限的问题,由于此时没有权限,因此再返回时,超出缓冲区的数据将丢失,就会出现截断。缓存

         三、最后将nginx的目录赋予权限就能够了服务器

         四、执行操做:curl

              sudo chown -R www:root nginx目录名称
              chmod -R  764 /usr/local/nginx/临时目录名称
 
补充:
        对于来自fastcgi server的response,nginx将其缓冲到内存中,而后依次发送到客户端浏览器,缓冲区的大小由fastcgi_buffers和fasecgi_buffer_size两个值控制,好比一下配置:

 

 

 

    fastcgi_buffer 8 128;此处表明nginx设置8个128k的块进行缓存,总共大小是8*128kurl

    fastcgi_buffer_size 128k; 此处表明每块大小,用于指定读取fastcgi应答第一部分须要用多大的缓冲区,这个值表示将使用1个128kb的缓冲区读取应答的一部分(应答头),能够设置为fastcgi_buffers选项指定的缓冲区大小。日志

    fastcgi_buffers : 指定本地须要用多少和多大的缓冲区来缓冲FastCGI的应答请求。若是一个PHP脚本所产生的页面大小为256KB,那么会为其分配4个64KB的缓冲区来缓存;若是页面大小大于256KB,那么大于256KB的部分会缓存到fastcgi_temp指定的路径中,可是这并非好方法,由于内存中的数据处理速度要快于硬盘。通常这个值应该为站点中PHP脚本所产生的页面大小的中间值,若是站点大部分脚本所产生的页面大小为256KB,那么能够把这个值设置为“16 16k”、“4 64k”等。
 
因此总计能建立的最大内存缓冲区大小是 4*64K+64K = 320k。而这些缓冲区是根据实际的 Response 大小动态生成的,并非一次性建立的。好比一个 128K 的页面,Nginx 会建立 2*64K 共 2 个 buffers。
 
    当 Response 小于等于 320k 时,全部数据固然所有在内存中处理。若是 Response 大于 320k 呢?fastcgi_temp 的做用就在于此。多出来的数据会被临时写入到文件中,放在这个目录下面。
内存中缓冲了 320K,剩下的会写入的文件中。而实际的状况是,运行 Nginx Process 的用户并无 fastcgi_temp 目录的写权限,因而剩下的数据就丢失掉了。

     以上就是对本身遇到的一个问题作了一个总结。server

相关文章
相关标签/搜索