fastcgi_temp目录权限不当导致页面加载不完全的问题

这个博客用的wordpress,这两天发现后台里的样式乱掉了,前台的标签及按月分类等也看不到了,第一反应是css没有加载上,但通过页面源码里的链接是可以直接打开css文件的,到vps上看了下nginx的error.log,发现如下错误

2015/07/07 14:31:27 [crit] 20844#0: *8686 open() "/usr/local/nginx/fastcgi_temp/4/28/0000000284" failed (13: Permission denied) while reading upstream, client: 121.79.18.36, server: gunner.me, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "gunner.me"

错误很明显,fastcgi_temp目录的权限不够,导致了php输出内容不全,chown改成与nginx运行用户一致后问题解决了。 OK,顺便了解下这个目录的作用,从nginx的buffer机制说起,对于来自 fastcgi server 的 response,nginx 先将其缓冲到内存中,然后依次发送到客户端浏览器。缓冲区的大小由 fastcgi_buffers 和 fastcgi_buffer_size 两个值控制。

fastcgi_buffer_size
语法:fastcgi_buffer_size the_size ;
使用字段:http, server, location 
这个参数指定将用多大的缓冲区来读取从FastCGI进程到来应答头。 默认的缓冲区大小为fastcgi_buffers指令中的每块大小,可以将这个值设置更小。 fastcgi_buffers 语法:fastcgi_buffers the_number is_size; 使用字段:http, server, location 这个参数指定了从FastCGI进程到来的应答,本地将用多少和多大的缓冲区读取。

如果是如下配置

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 的作用就在于此。多出来的数据会被临时写入到文件中,放在这个目录下面。 我遇到的情况是前台和后台页面大于默认的内存缓冲区,而运行nginx的用户并没有fastcgi_temp目录的写权限,于是剩下的数据就丢失掉了,所以页面显示不完整。 参考:http://www.phpvim.net/os/ubuntu/fastcgi_temp_error_and_nginx_buffer.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注