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

來源:互聯網
上載者:User
出現的問題現象:

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 目錄賦讀寫權限可以解決問題。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.