json字符串太長 被截斷

最近咱們有個項目,以前一直沒有安裝監控,由於是老得項目,以前沒有安裝nginx,那就沒辦法收集nginx的日誌,而後把日誌作切分實時展現,因此上週咱們就裝了nginx,而後就出現問題了nginx

咱們這個項目有個接口由於數據比較多,返回的json串就特別長,你用curl調這個接口,發現返回的json串被截斷。json

 

解決:一、首先查看nginx的error日誌,會有報錯提示,相似:nginx的目錄明下的文件 failed(13: Permission denied) while reading upstream, client:*.*.*.*,server:..........瀏覽器

         二、看報錯提示是沒有權限,緣由就是nginx存在一個buffer的機制,在數據過大超出緩衝區的最大容量,會將數據寫入臨時文件(臨時目錄),而此時若是你安裝的nginx的用戶權限不是服務器權限,就會報沒有權限的問題,由於此時沒有權限,因此再返回時,超出緩衝區的數據將丟失,就會出現截斷。緩存

         三、最後將nginx的目錄賦予權限就能夠了服務器

         四、執行操做:curl

              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*128kurl

    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 目錄的寫權限,因而剩下的數據就丟失掉了。

     以上就是對本身遇到的一個問題作了一個總結。server

相關文章
相關標籤/搜索