> 백엔드 개발 > PHP 튜토리얼 > PHP返回数据被nginx截断问题的解决方法

PHP返回数据被nginx截断问题的解决方法

WBOY
풀어 주다: 2016-06-20 12:26:11
원래의
1432명이 탐색했습니다.

出现的问题现象:

1 直接在命令行运行php脚本返回数据正常

2 通过nginx访问返回数据被截断

经过排查是fastcgi_temp目录的读写权限问题,Nginx的错误日志出现大量类似如下的错误:

2016/06/07 00:41:28 [crit] 32763#0: *5439 open() "/Data/apps/nginx/fastcgi_temp/5/02/0000000025" failed (13: Permission denied) while reading upstream, client: 203.171.237.2, server: www.36nu.com, request: "GET /thread.html HTTP/1.0", upstream: "fastcgi://127.0.0.1:9000",...
로그인 후 복사

从这句判断应该是返回的数据过大要以文件的形式存放 ,但是nginx有没有读写权限造成.于是给fastcgi_temp读写权限,问题解决.

chmod -R 764 /usr/local/nginx/fastcgi_temp/
로그인 후 복사

下面简单说一下原理,Nginx的buffer机制是Nginx将来自FastCGI Server的Response缓冲到内存中,然后依次发送到客户端。缓冲区的大小由 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 的作用就在于此。多出来的数据会被临时写入到文件中,放在这个目录下面。内存中缓冲了 36Kb,剩下的会写入的文件中。而实际的情况是,运行 Nginx Process 的用户并没有 fastcgi_temp 目录的读写权限,解决方法就比较简单了,给fastcgi_temp 目录赋读写权限可以解决问题。

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿