1. 程式人生 > >PHP返回資料被nginx截斷問題的解決方法

PHP返回資料被nginx截斷問題的解決方法

出現的問題現象:

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: "f
astcgi://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 目錄賦讀寫許可權可以解決問題。