记一次nginx加载数据不完整的问题

加载一个api数据时,数据加载不完全,每次刷新返回的数据量都不一样。

查看nginx错误日志发现

2015/05/14 16:40:31 [crit] 13639#0: *159 open() "/usr/local/nginx/fastcgi_temp/5/06/0000000065" failed (13: Permission denied) while reading upstream, client: 192.168.16.158, server: 197bigdata.valsun.cn, request: "GET /xxx/xxx.php HTTP/1.1", upstream: "fastcgi://unix:/tmp/php-cgi.sock:", host: "xxx.com"

提示fastcgi_temp下面的目录没有写的权限
看了下用户及用户组是 nobody:nobody
修改用户及用户组改为www:www

chown -R www:www fastcgi_temp/*

再次刷新页面OK,问题解决

PS: fastcgi_temp 文件夹说明,参考链接
先简单的说一下 Nginx 的 buffer 机制,对于来自 FastCGI Server 的 Response,Nginx 将其缓冲到内存中,然后依次发送到客户端浏览器。缓冲区的大小由 fastcgi_buffers 和 fastcgi_buffer_size 两个值控制。

比如如下配置:

fastcgi_buffers 8 4K; fastcgi_buffer_size 4K;
fastcgi_buffers 控制 nginx 最多创建 8 个大小为 4K 的缓冲区,而 fastcgi_buffer_size 则是处理 Response 时第一个缓冲区的大小,不包含在前者中。所以总计能创建的最大内存缓冲区大小是 8*4K+4K = 36k。而这些缓冲区是根据实际的 Response 大小动态生成的,并不是一次性创建的。比如一个 8K 的页面,Nginx 会创建 2*4K 共 2 个 buffers。

当 Response 小于等于 36k 时,所有数据当然全部在内存中处理。如果 Response 大于 36k 呢?fastcgi_temp 的作用就在于此。多出来的数据会被临时写入到文件中。

3. 可以得出结论:请求的response大小超过了36k,其中36k会缓冲到内存中,剩余部分会写到fastcgi_temp目录文件中,而实际的情况是,运行 Nginx Process 的用户并没有 fastcgi_temp 目录的写权限,于是剩下的数据就丢失掉了。

Comments are closed.