nginx 返回截斷問題
場景
同一個請求?html?get?請求,在請求頭里有?Accept-Encoding: gzip?的時候,html 正常返回,沒有?Accept-Encoding: gzip?html 返回被截斷。
解決辦法
增加 nginx 日志,查看
100790 open() "/usr/local/nginx/proxy_temp/2/40/0000000402" failed (13: Permission denied) while reading upstream
問題很明顯,權(quán)限問題
問題原因
未開啟?gzip?的時候,響應(yīng)較大,由于響應(yīng)的文件過大,導(dǎo)致?nginx?緩沖區(qū)無法無法存下整個響應(yīng),然后將文件寫入了臨時目錄,但是由于臨時目錄存在權(quán)限問題,導(dǎo)致寫入臨時目錄失敗, 所以?nginx?只將緩沖區(qū)存儲的數(shù)據(jù)返回給了客戶端,而這個數(shù)據(jù)是只是響應(yīng)的一部分,導(dǎo)致客戶端收到不完整的響應(yīng),而開啟 gzip 壓縮后,數(shù)據(jù)量會變小,緩沖區(qū)可以存儲整個響應(yīng),就不會出現(xiàn)上述的問題。
知識補充
什么是代理緩沖區(qū)
Nginx作為一個常用的反向代理,提供了代理緩沖的功能。它允許nginx將server端的響應(yīng)讀取下來緩存在本地內(nèi)存或磁盤中,再以合適的速度發(fā)送給客戶端
為什么需要代理緩沖區(qū)
因為 客戶端-nginx-后端服務(wù) 之間的網(wǎng)絡(luò)速度不一致,沒有代理緩沖區(qū)的話,客戶端到?nginx?的網(wǎng)速過慢,導(dǎo)致?nginx?只能以一個較慢的速度將響應(yīng)傳給客戶端;進而導(dǎo)致后端?server?也只能以同樣較慢的速度傳遞響應(yīng)給?nginx,造成一次請求連接耗時過長。
在高并發(fā)的情況下,后端?server?可能會出現(xiàn)大量的連接積壓,最終拖垮?server?端。
開啟緩沖區(qū)后:
nginx?可以用較快的速度盡可能將響應(yīng)體從?server?端讀取并緩沖到本地內(nèi)存或磁盤中,然后同時根據(jù)客戶端的網(wǎng)絡(luò)質(zhì)量以合適的網(wǎng)速將響應(yīng)傳遞給客戶端。
代理緩沖區(qū)缺點
開啟代理緩沖會消耗nginx服務(wù)器的內(nèi)存,如果請求過多,可能會導(dǎo)致nginx內(nèi)存消耗過大
在響應(yīng)過大的情況下,設(shè)置的緩沖區(qū)無法存下整個響應(yīng)體,nginx會將剩余的內(nèi)容寫到磁盤臨時文件中。在請求量較大的情況下,可能會導(dǎo)致nginx服務(wù)器磁盤io過高。而往往臨時文件都存放在/tmp下,而/tmp目錄一般掛載在系統(tǒng)盤上,系統(tǒng)盤io過高會進一步導(dǎo)致系統(tǒng)負載上漲。
在客戶端網(wǎng)絡(luò)質(zhì)量很好的情況下,比如客戶端到nginx也是同機房內(nèi),這時關(guān)閉代理緩沖直接將響應(yīng)實時轉(zhuǎn)發(fā)給客戶端效率更高
配置參數(shù)
proxy_buffering 控制開關(guān)緩沖區(qū)
Syntax: proxy_buffering on | off; Default: proxy_buffering on; Context: http, server, location
當(dāng)開啟代理緩沖區(qū)時,nginx?會盡快的從server?端讀取響應(yīng)并緩存在內(nèi)存分配的緩沖區(qū)中。代理緩沖區(qū)的大小由proxy_buffer_size?和?proxy_buffers?參數(shù)指定。
當(dāng)響應(yīng)大小超出內(nèi)存緩沖區(qū)時,一部分響應(yīng)體可以保存在磁盤臨時文件中。磁盤臨時文件的大小由proxy_max_temp_file_size和proxy_temp_file_write_size參數(shù)指定。
proxy_buffer_size 響應(yīng)頭存儲大小
Syntax: proxy_buffer_size size; Default: proxy_buffer_size 4k|8k; Context: http, server, location
后端服務(wù)器的相應(yīng)頭會放到?proxy_buffer_size?當(dāng)中,這個大小默認等于proxy_buffers當(dāng)中的設(shè)置單個緩沖區(qū)的大小。?proxy_buffer_size只是響應(yīng)頭的緩沖區(qū),沒有必要也跟著設(shè)置太大
通常,該緩沖區(qū)大小設(shè)置為一個內(nèi)存頁的大小,具體是 4k 或 8k,取決于服務(wù)器平臺。也可以把它設(shè)置的更小,但是沒必要設(shè)置過大了,因為只是用于緩沖初始部分響應(yīng)。
proxy_buffers 響應(yīng)體緩沖區(qū)存儲大小
大小由 number * size 決定
Syntax: proxy_buffers number size; Default: proxy_buffers 8 4k|8k; Context: http, server, location
值得注意的是,這里設(shè)置的緩沖區(qū)大小是針對每個請求連接而言的。也就是說對于每一個連接,都會分配?number*size?大小的內(nèi)存緩沖區(qū)。
proxy_busy_buffers_size 發(fā)送客戶端數(shù)據(jù)緩沖區(qū)大小
Syntax: proxy_busy_buffers_size size; Default: proxy_busy_buffers_size 8k|16k; Context: http, server, location
nginx?未讀取到完整響應(yīng),允許開始給客戶端發(fā)送響應(yīng)的緩沖區(qū)大小
nginx?會在沒有完全讀完后端響應(yīng)的時候就開始向客戶端傳送數(shù)據(jù),所以它會劃出一部分緩沖區(qū)來專門向客戶端傳送數(shù)據(jù)(這部分的大小是由?proxy_busy_buffers_size?來控制的,建議為proxy_buffers中單個緩沖區(qū)大小的2倍),然后它繼續(xù)從后端取數(shù)據(jù),緩沖區(qū)滿了之后就寫到磁盤的臨時文件中。
proxy_max_temp_file_size 磁盤臨時文件大小
Syntax: proxy_max_temp_file_size size; Default: proxy_max_temp_file_size 1024m; Context: http, server, location
設(shè)置磁盤臨時文件的最大 size
當(dāng)?server?端返回的整個響應(yīng)超出?proxy_buffering?和?proxy_buffers?設(shè)置的內(nèi)存緩沖區(qū)大小時,剩余的響應(yīng)體可以保存在一個磁盤臨時文件中。proxy_max_temp_file_size?指定了該臨時文件的最大大小。
proxy_temp_file_write_size 每次寫入磁盤臨時文件的大小
Nginx
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。