json字串太長 被截斷

2022-04-29 18:57:08 字數 1608 閱讀 3687

最近我們有個專案,之前一直沒有安裝監控,因為是老得專案,之前沒有安裝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 目錄的寫許可權,於是剩下的資料就丟失掉了。

以上就是對自己遇到的乙個問題做了乙個總結。

CSS截斷字串

方法一 任意長度的字串 說明 優點是內容可以為任何html元素,包括超連結和等,在ie6中還會在結尾自動顯示省略號。缺點是必須指定寬度數值,並且寬度不能是百分數,否則在ie中會被認為是字元總長的百分比。方法二 說明 優點是寬度可以設為百分數。但缺點是內容只能為純文字,不能有超連結等內容。css 截斷...

sql中字串被截斷的問題除錯

今天下午在程式呼叫乙個儲存過程的時候出現了字串截斷問題,因為自己是實習生,而且對sql比較生疏,所以花了乙個多小時才排查出來。首先是檢視報錯資訊,執行儲存過程 出錯 物件名 b 無效。16 03 26,124 error stderr com.ztkj.batj.exception.daoexcep...

MySQL 插入的長字串被截斷問題

mysql 出現了乙個問題,插入乙個長字串 二十幾kb 結果導致被截斷。首先排除了資料型別的問題,用的 mediumtext 型別。接著排除了php 的問題,因為取出 sql 直接在 mysql 中執行還是被截斷。發現一點很奇怪,截斷的那個長字串差不多很接近 8kb,如果加上其他欄位的內容,可能正好...