最近我們有個項目,之前一直沒有安裝監控,因為是老得項目,之前沒有安裝nginx,那就沒辦法收集nginx的日志,然后把日志做切分實時展示,所以上周我們就裝了nginx,然后就出現問題了
我們這個項目有個接口因為數據比較多,返回的json串就特別長,你用curl調這個接口,發現返回的json串被截斷。
解決:1、首先查看nginx的error日志,會有報錯提示,類似:nginx的目錄明下的文件 failed(13: Permission denied) while reading upstream, client:*.*.*.*,server:..........
2、看報錯提示是沒有權限,原因就是nginx存在一個buffer的機制,在數據過大超出緩沖區的最大容量,會將數據寫入臨時文件(臨時目錄),而此時如果你安裝的nginx的用戶權限不是服務器權限,就會報沒有權限的問題,因為此時沒有權限,所以再返回時,超出緩沖區的數據將丟失,就會出現截斷。
3、最后將nginx的目錄賦予權限就可以了
4、執行操作:
sudo chown -R www:root nginx目錄名稱
chmod -R 764 /usr/local/nginx/臨時目錄名稱
補充:
對於來自fastcgi server的response,nginx將其緩沖到內存中,然后依次發送到客戶端瀏覽器,緩沖區的大小由fastcgi_buffers和fasecgi_buffer_size兩個值控制,比如一下配置:
fastcgi_buffer 8 128;此處代表nginx設置8個128k的塊進行緩存,總共大小是8*128k
fastcgi_buffer_size 128k; 此處代表每塊大小,用於指定讀取fastcgi應答第一部分需要用多大的緩沖區,這個值表示將使用1個128kb的緩沖區讀取應答的一部分(應答頭),可以設置為fastcgi_buffers選項指定的緩沖區大小。
fastcgi_buffers : 指定本地需要用多少和多大的緩沖區來緩沖FastCGI的應答請求。如果一個PHP腳本所產生的頁面大小為256KB,那么會為其分配4個64KB的緩沖區來緩存;如果頁面大小大於256KB,那么大於256KB的部分會緩存到fastcgi_temp指定的路徑中,但是這並不是好方法,因為內存中的數據處理速度要快於硬盤。一般這個值應該為站點中PHP腳本所產生的頁面大小的中間值,如果站點大部分腳本所產生的頁面大小為256KB,那么可以把這個值設置為“16 16k”、“4 64k”等。
所以總計能創建的最大內存緩沖區大小是 4*64K+64K = 320k。而這些緩沖區是根據實際的 Response 大小動態生成的,並不是一次性創建的。比如一個 128K 的頁面,Nginx 會創建 2*64K 共 2 個 buffers。
當 Response 小於等於 320k 時,所有數據當然全部在內存中處理。如果 Response 大於 320k 呢?fastcgi_temp 的作用就在於此。多出來的數據會被臨時寫入到文件中,放在這個目錄下面。
內存中緩沖了 320K,剩下的會寫入的文件中。而實際的情況是,運行 Nginx Process 的用戶並沒有 fastcgi_temp 目錄的寫權限,於是剩下的數據就丟失掉了。
以上就是對自己遇到的一個問題做了一個總結。