記一次python web服務異常:接口返回json過長時被nginx截斷

一、背景

線上提供的一個根據查詢條件返回json數據的查詢接口,解析該接口返回的json數據報錯,錯誤信息如下:

net.sf.json.JSONException: Unterminated string at character 24106 of

單獨curl該接口後發現該接口返回的json數據不完整,被截斷了。

二、問題解決

Google nginx 返回的json不全,嘗試以下兩步可解決該問題。

1、調整Nginx緩存

server {
    ...
    proxy_buffers 16 1024k;
    proxy_buffer_size 1024k;
    ...
}

調整緩存後,大部分返回長json被截斷的問題被解決,但仍偶爾報錯,原因仍然爲返回的json被截斷。

2、修改Nginx數據緩存目錄權限

嘗試第一種方式後,仍偶爾報錯,此時查看Nginx error.log日誌發現有如下內容:

2019/04/08 13:26:25 [crit] 17724#0: *31140934 open() "/home/admin/your_nginx_cache_folder/data/uwsgi_temp/9/00/0000000009" failed (13: Permission denied) while reading upstream, client: your_client_ip, server: localhost, request: "POST your_api HTTP/1.1", upstream: "uwsgi://127.0.0.1:8000", host: "your_service_ip:8080"

原來原因如下:
nginx對於小的反向代理請求是使用內存作中轉,對於稍微大一點的,是使用臨時文件系統來做中轉,但是使用文件系統來中轉的時候沒有權限。

此時修改中轉用文件目錄的權限即可,對於爲何Nginx沒有讀取緩存文件目錄的權限,可能是某次啓動Nginx使用的用戶不對導致的。

至此,問題解決。

解決此問題也說明了查看日誌的重要性,如果沒有查看到Nginx的報錯日誌,該問題也不會得到根本解決。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章