1. 程式人生 > >頁面訪問伺服器返回json格式資料太大,導致資料不全被截斷,無法展示

頁面訪問伺服器返回json格式資料太大,導致資料不全被截斷,無法展示

問題:頁面展示呼叫查詢方法查詢全部資料的時候一直顯示loading。。。,開啟偵錯程式顯示 Failed to load resource: net::ERR_SPDY_PROTOCOL_ERROR,而少部分查詢則正常顯示。

因為資料中有圖片轉成的二進位制陣列,資料比較長,由此懷疑是返回資料大小的問題,經過排查發現查詢全部時返回的json資料不全,被截斷了,因此頁面無法解析。(這個問題真的很坑,排查了很久才發現是nginx的問題)

經過查詢資料,發現是nginx代理的問題。

原因nginx對於小的反向代理請求是使用記憶體作中轉,對於稍微大一點的,是使用臨時檔案系統來做中轉的,臨時檔案目錄/usr/local/nginx/proxy_temp,而對這個目錄沒有讀寫許可權,導致資料不全。

解決:然後讓運維看了下nginx的日誌和目錄許可權,發現確實如此,給臨時檔案目錄加上讀寫許可權,搞定。
 

 

附上nginx機制解釋:(引用自:https://blog.csdn.net/j6915819/article/details/80603846

Nginx 的 buffer 機制,對於來自 FastCGI Server 的 Response,Nginx 將其緩衝到記憶體中,然後依次傳送到客戶端瀏覽器。緩衝區的大小由 fastcgi_buffers 和 fastcgi_buffer_size 兩個值控制。
比如如下配置:
fastcgi_buffers 8 4K; 
fastcgi_buffer_size 4K;
fastcgi_buffers 控制 nginx 最多建立 8 個大小為 4K 的緩衝區,而 fastcgi_buffer_size 則是處理 Response 時第一個緩衝區的大小,不包含在前者中。所以總計能建立的最大記憶體緩衝區大小是 84K+4K = 36k。而這些緩衝區是根據實際的 Response 大小動態生成的,並不是一次性建立的。比如一個 8K 的頁面,Nginx 會建立 2

4K 共 2 個 buffers。
當 Response 小於等於 36k 時,所有資料當然全部在記憶體中處理。如果 Response 大於 36k 呢?fastcgi_temp 的作用就在於此。多出來的資料會被臨時寫入到檔案中,放在這個目錄下面。
記憶體中緩衝了 36Kb,剩下的會寫入的檔案中。而實際的情況是,執行 Nginx Process 的使用者並沒有 fastcgi_temp 目錄的寫許可權,於是剩下的資料就丟失掉了。