返回xml過長時被nginx截斷的解決辦法
問題描述:
通過網頁獲取數據,數據格式為xml。當xml比較短時,可以正常獲取數據。但是xml長度過長時不能正常獲取數據,通過觀察返回數據的源代碼,發現xml被截斷了。
服務器環境:CentOS 6.5,Nginx 1.0.15,PHP 5.3.3
解決方法:
對比發現,使用apache代替nginx的時候可以正常獲取長的xml數據。確定問題出現在nginx的配置上。
查看ngnix日志(yum安裝默認目錄:/var/log/nginx/)發現問題所在。
"/var/lib/nginx/tmp/fastcgi/1/01/0000000011"failed (13: Permission denied) while reading upstream, client: 192.16 8.56.1, server: , request:"GET /index.php?param=****** HTTP/1.1", upstream:"fastcgi://127.0 .0.1:9000", host:"centos.ctrip.dev:8001"
問題出現在此時nginx臨時向/var/lib/nginx/tmp/目錄下寫入了臨時數據,而執行nginx的用戶沒有該目錄的寫入權限。
解決該權限問題后問題解決。
另外php.ini nginx 對請求大小的配置也可能有影響,HTTP協議中使用Content-Length這個頭來告知數據的長度。
===================================
過PHP請求接口時發現接口的內容輸出沒有完整的返回整個數據,早上只修改了nginx api_metrics插件里的計算response大小的代碼,觀察日志發現一條:
"/usr/local/nginx/proxy_temp/8/00/0000000008" failed (13: Permission denied) while reading upstream, client: 59.***.**.***, server: ******.banckle.com, request: "GET /livechat/livechat-backend.do HTTP/1.1", upstream: "http://127.0.0.1:8084/livechat/livechat-backend.do", host: "******.banckle.com"
該目錄無法被nginx的nobody賬戶訪問,那就設置權限:
sudo chown -R nobody:nobody /usr/local/nginx/proxy_temp/
刷新瀏覽器,一切正常。
出現這個問題的原因是nginx里對於小的反向代理請求是使用內存作中轉,對於稍微大一點的,是使用文件系統來做中轉。
然后之前調試nginx插件的時候,為了方便訪問日志等數據就在root下調試的,部分子目錄被nginx刪除后重建,owner變了,所以正式的nginx反而不能訪問了。
PS:要先用命令查一下50上的臨時文件夾在那個地方,對應的權限是什么 ,不同環境的路徑是不一樣的