nginx 499錯(cuò)誤處理及nginx的配置參數(shù)小結(jié)
背景
近期響應(yīng)集團(tuán)降本增效,節(jié)省ci,stg機(jī)器,我們項(xiàng)目開始容器化,在改造過程中,鏈路的訪問發(fā)生了變化,導(dǎo)致出現(xiàn)了499,解決方如下
訪問鏈路: 域名—> ELB (內(nèi)網(wǎng)訪問) —> openrestry (stg環(huán)境,支持自定義lua腳本) —> ELB(提供服務(wù)固定ip) —> (容器集群)POd
499處理
nignx報(bào)499的原因是服務(wù)端響應(yīng)超時(shí),nginx主動(dòng)斷開連接。例如:nginx配置默認(rèn)超時(shí)時(shí)間為60s,當(dāng)服務(wù)端接口響應(yīng)為62s才返回結(jié)果,那么當(dāng)60s時(shí),nginx主動(dòng)斷開連接。
1. 調(diào)整如下proxy_xxx_timeout
2. 優(yōu)化接口,提高接口的響應(yīng)速度
server{ location / { proxy_connect_timeout 200; proxy_send_timeout 200; proxy_read_timeout 200; } }
proxy_connect_timeout: 控制與后端服務(wù)器建立連接的超時(shí)時(shí)間,單位是秒,默認(rèn)是60秒。
proxy_read_timeout: 控制等待后端服務(wù)器響應(yīng)的超時(shí)時(shí)間,單位是秒,默認(rèn)是60秒。
proxy_send_timeout: 控制發(fā)送請(qǐng)求到后端服務(wù)器的超時(shí)時(shí)間,單位是秒,默認(rèn)是60秒。
這三個(gè)參數(shù)都是在使用 nginx 作為反向代理時(shí),用于限制與后端服務(wù)器通信的超時(shí)時(shí)間,從而避免代理服務(wù)器被后端服務(wù)器的響應(yīng)阻塞而無法響應(yīng)客戶端的請(qǐng)求。例如,如果后端服務(wù)器出現(xiàn)了異常或網(wǎng)絡(luò)故障,會(huì)導(dǎo)致響應(yīng)的延遲或永遠(yuǎn)不返回,此時(shí)代理服務(wù)器會(huì)等待超時(shí)時(shí)間,然后返回錯(cuò)誤響應(yīng)。
注意:在使用這些超時(shí)設(shè)定時(shí),應(yīng)當(dāng)考慮應(yīng)用程序的網(wǎng)絡(luò)和運(yùn)行環(huán)境,以便確定適當(dāng)?shù)某瑫r(shí)時(shí)間。超時(shí)時(shí)間設(shè)置過短可能導(dǎo)致請(qǐng)求失敗,而設(shè)置過長可能導(dǎo)致前端網(wǎng)站的響應(yīng)變慢??梢赃m當(dāng)根據(jù)實(shí)際情況調(diào)整,并進(jìn)行測(cè)試,以確保可靠性和性能。參數(shù)值也不是越大越好,對(duì)于確實(shí)響應(yīng)慢的接口,要進(jìn)行性能優(yōu)化。
知識(shí)擴(kuò)展: nginx配置參數(shù)
server{ location / { proxy_ignore_client_abort on; proxy_connect_timeout 200; proxy_send_timeout 200; proxy_read_timeout 200; } }
proxy_ignore_client_abort: 用于實(shí)現(xiàn)“忽略客戶端終止”功能。默認(rèn)情況下,“nginx”會(huì)將與客戶端的連接請(qǐng)求轉(zhuǎn)發(fā)到后端服務(wù)器,但如果客戶端中途斷開請(qǐng)求服務(wù),則通常會(huì)導(dǎo)致到后端的連接被提前關(guān)閉。這時(shí),后端程序可能會(huì)繼續(xù)執(zhí)行一段時(shí)間,但已經(jīng)無法將響應(yīng)發(fā)送回代理服務(wù)器,因此可能導(dǎo)致代理服務(wù)器上的錯(cuò)誤響應(yīng)。
proxy_ignore_client_abort: off 默認(rèn)配置,客戶端斷開連接會(huì)中止響應(yīng)
proxy_ignore_client_abort: on 客戶端斷開連接不會(huì)中止響應(yīng),代理服務(wù)器將忽略客戶端請(qǐng)求終止,并讓后端服務(wù)器繼續(xù)響應(yīng),直到響應(yīng)完成。
http:{ fastcgi_connect_timeout 200; fastcgi_send_timeout 200; fastcgi_read_timeout 200; }
以上參數(shù)當(dāng)你的技術(shù)選型里有包含F(xiàn)astCGI,可以考慮開啟上述fastcgi_xx_timeout參數(shù)。
如未接觸過,我們來簡單介紹下: FastCGI(Fast Common Gateway Interface)是一種 Web 應(yīng)用程序的接口協(xié)議,它提出了一種新型的方式來處理動(dòng)態(tài) Web 內(nèi)容。astCGI 和早期的 CGI 腳本處理方式不同,CGI 腳本在每次請(qǐng)求時(shí)都會(huì)啟動(dòng)新的進(jìn)程,這可能造成性能損失和資源浪費(fèi)。而 FastCGI 利用了一些進(jìn)程復(fù)用技術(shù),使得每個(gè)應(yīng)用程序可以一直保持在內(nèi)存中的狀態(tài),等待下一次請(qǐng)求,大大提高了性能。
Tomcat容器并未內(nèi)置FastCGI功能,在標(biāo)準(zhǔn)的SpringBoot應(yīng)用程序中,你需要特別安裝、配置和/或使用第三方 FastCGI 庫或框架來實(shí)現(xiàn)與 FastCGI 協(xié)議的通信。例如,可以使用 Mod_jk 來實(shí)現(xiàn) Tomcat 與前端 Web 服務(wù)器之間的 FastCGI 通信。
http { client_max_body_size 500m; //限制客戶端請(qǐng)求體超過配置的值,超過返回413 client_body_buffer_size 10M; // # client_body_temp: /xx // 大于client_body_buffer_size是存儲(chǔ)的磁盤目錄 keepalive_timeout 65s; // client_header_timeout 600s; // client_body_timeout 600s; // proxy_connect_timeout 200s; proxy_send_timeout 200s; proxy_read_timeout 200s; proxy_max_temp_file_size 0; limit_req_zone $binary_remote_addr zone=burstLimit:10m rate=40r/s; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_types text/plain text/css application/json application/x-javascript application/javascript text/javascript appliaction/xml; gzip_comp_level 3; gzip_disable "MSIE [1-6].(?!.*SV1)"; gzip_vary off; }
client_max_body_size: 限制客戶端請(qǐng)求體超過配置的值,超過返回413 Request Entity Too Large,在http,server,location均可配置。這個(gè)參數(shù)是針對(duì)單個(gè)請(qǐng)求體的大小,而不是控制所有請(qǐng)求的綜合大小。
client_body_buffer_size: 客戶端請(qǐng)求體數(shù)據(jù)到內(nèi)存時(shí)緩存區(qū)分配的大小。如果請(qǐng)求的數(shù)據(jù)小于這個(gè)配置直接將數(shù)據(jù)先在存在內(nèi)存,如果請(qǐng)求的值大于client_body_buffer_size小client_max_body_size,就會(huì)將數(shù)據(jù)先存儲(chǔ)到臨時(shí)文件中,臨時(shí)文件默認(rèn)路徑是/tmp/,也可通過配置client_body_temp指定目錄
client_body_temp: 當(dāng)請(qǐng)求體大于client_body_buffer_size小于client_max_body_size是,配置這個(gè)參數(shù)存儲(chǔ)到指定的磁盤路徑,注意這個(gè)需要修改權(quán)限(chomd),否則會(huì)報(bào)Permission denied
keepalive_timeout: 當(dāng)使用http/1.1協(xié)議是,可以使用keepalive復(fù)用tcp的連接,減少tcp三次握手四次揮手建立網(wǎng)絡(luò)連接的時(shí)間。keepalive_time的意思是每次請(qǐng)求完畢后保持指定時(shí)間的連接,可以避免頻繁創(chuàng)建和關(guān)閉連接的過程。默認(rèn)值是75s,若設(shè)置為0,表示禁止keepalive連接
client_header_timeout: 客戶端像服務(wù)端發(fā)送一個(gè)完整的request header的超時(shí)時(shí)間,默認(rèn)60s,如果客戶端在指定時(shí)間內(nèi)沒有發(fā)送一個(gè)完整的request header,nginx返回http 408(request time out)
client_body_timeout: 戶端像服務(wù)端發(fā)送一個(gè)完整的request body的超時(shí)時(shí)間, 默認(rèn)60s,如果客戶端在指定時(shí)間內(nèi)沒有接受到請(qǐng)求體數(shù)據(jù),注意不是整個(gè)請(qǐng)求提數(shù)據(jù)傳輸,是在接受到header后到開始傳輸body這個(gè)過程的超時(shí)時(shí)間(官方文檔: The timeout is set only for a period between two successive read operations, not for the transmission of the whole request body If a client does not transmit anything within this time, the request is terminated with the 408 (Request Time-out) error.), nginx返回http 408(request time out)。
proxy_max_temp_file_size: 緩存到磁盤的文件大小,如果設(shè)置為0,則不緩存到磁盤。如果超過了設(shè)置的值,則nginx將與proxy的服務(wù)器同步的傳遞內(nèi)容,則不在還緩沖到磁盤
limit_req_zone: nginx限流模塊,$binary_remote_addr表明限制的目標(biāo),remote_addr記錄的是ip信息占用7~15個(gè)字節(jié),binary_remote_addr表示壓縮的ip,僅占用4個(gè)字節(jié)。zone=name:size分配一個(gè)名為name的并且大小為size的內(nèi)存空間,用來存儲(chǔ)訪問的頻次信息;rate=40r/s表示同一個(gè)ip每秒只允許40個(gè)請(qǐng)求通過
gzip: on:開啟gzip壓縮靜態(tài)資源, off關(guān)閉
gzip_min_length: 1k 配置開啟壓縮的大小,資源大于這個(gè)的才壓縮,再小就不要壓縮
gzip_buffers 4: 16k 緩沖,壓縮在內(nèi)存緩沖幾塊,每塊多大
gzip_types: text/plain text/css application/json application/x-javascript application/javascript text/javascript appliaction/xml; 對(duì)那些類型的文件用壓縮
gzip_comp_level: 3; 壓縮級(jí)別([1-9]級(jí)別越高,壓的越小,越耗費(fèi)CPU計(jì)算時(shí)間)
gzip_disable: “MSIE [1-6].(?!.*SV1)”; 正則匹配什么樣的uri不進(jìn)行g(shù)zip壓縮,此處表示ie6及一下不啟用gzip(因?yàn)檫@些版本不支持)
gzip_vary: off 是否傳輸壓縮標(biāo)志
nginx增加健康檢查
nginx開源版本沒有自帶負(fù)載均衡后端節(jié)點(diǎn)的健康檢查,但是通過額外的nginx_upstream_check_module模塊對(duì)后端節(jié)點(diǎn)做健康檢查。
upstream name{ server 192.168.0.1:80; server 192.168.0.2:80; check interval=3000 rise=2 fail=5 timeout=1000 type=http; }
對(duì)name的這個(gè)upstream負(fù)載均衡,每個(gè)節(jié)點(diǎn)3s檢測(cè)一次,請(qǐng)求2次正常則標(biāo)記realserver狀態(tài)為up,如果檢測(cè)5次都失敗,則標(biāo)記ralserver狀態(tài)為down,超時(shí)時(shí)間為1s.
各種負(fù)載均衡軟硬件
ELB HAproxy nginx openresty F5 LVS
HaProxy: 一款負(fù)載均衡軟件,與nginx角色一樣,支持TCP/HTTP兩種協(xié)議的負(fù)載均衡,使得其負(fù)載均衡功能非常豐富;支持8種左右的負(fù)載均衡算法,尤其是在http模式下,有非常多的實(shí)用的均衡算法;擁有一個(gè)功能出色的監(jiān)控頁面,實(shí)時(shí)了解系統(tǒng)當(dāng)前的狀態(tài);功能強(qiáng)大的ACL支持,給用戶極大的方便(ACL access control list訪問控制列表: 符合ACL規(guī)則請(qǐng)求由backend指定的后端服務(wù)器池執(zhí)行基于ACL規(guī)則的負(fù)載均衡,不符合的可以直接中斷響應(yīng),也可以交由其他服務(wù)器執(zhí)行);自帶監(jiān)控檢查,nginx需要增加額外的模塊支持健康檢查。缺點(diǎn)是配置文件比較繁瑣,需要一定的技術(shù)水平和經(jīng)驗(yàn)進(jìn)行部署和維護(hù)。
ELB: AWS提供的云軟件負(fù)載均衡服務(wù),實(shí)用云端的應(yīng)用部署,有點(diǎn)易于使用;缺點(diǎn)是定制化自定義有限,對(duì)企業(yè)級(jí)需要可能不夠全面
F5: 負(fù)載均衡硬件,性能非常好,每秒處理的請(qǐng)求數(shù)可以達(dá)到百萬級(jí),采購價(jià)格也非常貴十幾萬到百萬人民幣都有,適用于大型企業(yè)流量特別多的情況。
LVS: 軟件負(fù)載均衡,由阿里的章文嵩博士研發(fā),是國內(nèi)最早的自由軟件,配置方便,抗負(fù)載能力強(qiáng);不足:不支持正則處理,不支持做動(dòng)靜分離,對(duì)網(wǎng)絡(luò)環(huán)境比較依賴
openresty: 對(duì)nginx的擴(kuò)展,自由度高支持實(shí)用lua及大量的第三方模塊,方便的搭建能夠處理高并發(fā),擴(kuò)展性極高的web應(yīng)用,網(wǎng)關(guān),從而將nginx從簡單的負(fù)載均衡,變成一個(gè)強(qiáng)大的網(wǎng)關(guān)、通用的web應(yīng)用平臺(tái)。
參考
nginx官方文檔 Module ngx_http_core_module
Nginx的超時(shí)keeplive_timeout配置詳解
nginx限流方法一:limit_req&limit_req_zone限制處理速率
Haproxy 的 ACL 規(guī)則及實(shí)戰(zhàn)案例
Nginx和HAProxy對(duì)比,各有什么優(yōu)點(diǎn)與不足?
nginx負(fù)載均衡配置,宕機(jī)自動(dòng)切換
到此這篇關(guān)于nginx 499錯(cuò)誤處理及nginx的配置參數(shù)小結(jié)的文章就介紹到這了,更多相關(guān)nginx 499錯(cuò)誤內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
nginx自定義變量與內(nèi)置預(yù)定義變量的使用
這篇文章主要介紹了nginx自定義變量與內(nèi)置預(yù)定義變量的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06nginx+tomcat 通過域名訪問項(xiàng)目的實(shí)例
這篇文章主要介紹了nginx+tomcat 通過域名訪問項(xiàng)目的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05Nginx配置反向代理服務(wù)器實(shí)現(xiàn)在https網(wǎng)站中請(qǐng)求http資源
?Nginx反向代理?是一種將客戶端請(qǐng)求轉(zhuǎn)發(fā)到后端服務(wù)器的技術(shù),主要用于負(fù)載均衡、提高安全性和提升性能,本文給大家介紹了Nginx配置反向代理服務(wù)器實(shí)現(xiàn)在https網(wǎng)站中請(qǐng)求http資源,需要的朋友可以參考下2025-03-03Nginx 出現(xiàn) 403 Forbidden 最終解決方法
這篇文章給大家介紹了Nginx 出現(xiàn) 403 Forbidden 最終解決方法,下面分步驟給大家介紹的非常詳細(xì),感興趣的的朋友一起看看吧2017-08-08詳解實(shí)現(xiàn)Nginx+Tomcat實(shí)現(xiàn)單IP、多域名、多站點(diǎn)的訪問
這篇文章主要介紹了詳解實(shí)現(xiàn)Nginx+Tomcat實(shí)現(xiàn)單IP、多域名、多站點(diǎn)的訪問的相關(guān)資料,這里提供實(shí)例幫助到大家實(shí)現(xiàn)改功能,希望能幫助到大家,需要的朋友可以參考下2017-08-08