nginx的限流和網(wǎng)關(guān)gatway限流詳解
1.場(chǎng)景描述
例如網(wǎng)站首頁采取二級(jí)緩存操作,減少對(duì)數(shù)據(jù)庫(kù)和redis的壓力,但是遇到惡意請(qǐng)求還是不能有效的緩解壓力,限流就能起到保護(hù)措施的作用了
2.nginx限流
nginx提供了兩種限流方案:
- 控制請(qǐng)求速率
- 控制并發(fā)連接數(shù)
3.控制速率
nginx常用控制速率的方式之一就是采用漏桶算法
3.1漏桶算法實(shí)現(xiàn)控制速率限流
概述:漏桶算法思想就是水(請(qǐng)求)滴入漏桶漏桶里,漏桶以一定速率出水(響應(yīng)速率),當(dāng)水滴入的速率過大時(shí)會(huì)溢出漏桶(訪問速率大于響應(yīng)速率),然后就拒絕請(qǐng)求,漏桶算法能強(qiáng)轉(zhuǎn)限制數(shù)據(jù)的傳輸速率
配置示例
在nginx的nginx.conf配置文件
http{ limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=2r/s; ... server{ ... location / { limit_req zone=myRateLimit; burst=5; } } } }
具體配置示例
修改/usr/local/openresty/nginx/conf/nginx.conf:
#user nobody; user root root; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet‐stream; #log_format main '$remote_addr ‐ $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=2r/s; server { listen 8081; server_name localhost; charset utf‐8; location / { limit_req zone=myRateLimit; root html; index index.html index.htm; } } }
需要關(guān)注以下配置
limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=2r/s; server { listen 8081; server_name localhost; charset utf‐8; location / { limit_req zone=myRateLimit; root html; index index.html index.htm; } } }
說明:
- 1.binary_remote_addr 是一種key,表示基于 remote_addr(客戶端IP) 來做限流
- 2.zone=myRateLimit:10m :表示能存儲(chǔ)的訪問IP的地址,1M能存儲(chǔ)16000ip地址的訪問信息,10M可以存儲(chǔ)16W IP地址訪問信息
- 3.rate用于設(shè)置最大訪問速率,rate=2r/s 表示每秒能處理2個(gè)請(qǐng)求,也就是每500毫秒處理一次請(qǐng)求,若1s內(nèi)再有請(qǐng)求就會(huì)被拒絕
- 4.location /:攔截的請(qǐng)求,表示location下所有的請(qǐng)求
3.2突發(fā)性限流
場(chǎng)景:當(dāng)正常流量突然增大,超出的請(qǐng)求將被拒絕,無法處理突發(fā)流量,可以結(jié)合burst參數(shù)
server { location / { limit_req zone=myRateLimit burst=5; root html; index index.html index.htm; } }
burst:
會(huì)將超出的5個(gè)請(qǐng)求放入隊(duì)列中,按照處理速率處理,會(huì)一個(gè)個(gè)進(jìn)行處理.
但是會(huì)造成請(qǐng)求的等待時(shí)間過長(zhǎng),為了解決這個(gè)問題,可以加關(guān)鍵字 nodelay
,就會(huì)一次性的處理這些請(qǐng)求如
server { location / { limit_req zone=myRateLimit burst=5 nodelay; root html; index index.html index.htm; } }
nginx實(shí)現(xiàn)限流的總結(jié)
nginx限流采用的算法是漏桶算法,水滴入到漏桶中,再按一定速率流出,當(dāng)?shù)稳氲乃俾蚀笥诹鞒龅乃俾剩蜁?huì)水溢出,也就是請(qǐng)求速率大于處理速率的時(shí)候就會(huì)拒絕請(qǐng)求。
具體的做法是 在nginx.conf文件中 配置rate 處理速率,配置漏桶能存儲(chǔ)的最大存儲(chǔ)量,1m能存儲(chǔ)16000個(gè)IP地址的訪問信息
burst:
nodelay
能處理突發(fā)性請(qǐng)求
網(wǎng)關(guān)gatway實(shí)現(xiàn)限流
使用場(chǎng)景:限制客戶端訪問服務(wù)端微服務(wù)的流量
gatway是采用令牌桶算法實(shí)現(xiàn)限流的,配置加入令牌的速率,和令牌桶能放入的最大令牌數(shù)量,只有請(qǐng)求獲得了令牌才能訪問,沒有獲得令牌就會(huì)拒絕訪問,令牌桶算法是基于redis實(shí)現(xiàn)的,默認(rèn)使用redis的RateLimter限流算法實(shí)現(xiàn)的
具體步驟:
- 1.添加依賴
- 2.在啟動(dòng)類中定義方法返回對(duì)象 KeyResolver
@SpringBootApplication @EnableEurekaClient public class GatewayApplication { public static void main(String[] args) { SpringApplication.run(GatewayApplication.class,args); } /** * 通過KeyResolver來指定限流的Key * @return */ @Bean public KeyResolver ipKeyResolver() { return new KeyResolver() { @Override public Mono<String> resolve(ServerWebExchange exchange) { return Mono.just(exchange.getRequest().getRemoteAddress().getHostName()); } }; } }
- 3.在配置中聲明令牌產(chǎn)生的速率,令牌桶的大小
filters: - StripPrefix= 1 - name: RequestRateLimiter #請(qǐng)求數(shù)限流 名字不能隨便寫 args: key-resolver: "#{@ipKeyResolver}" redis-rate-limiter.replenishRate: 1 #令牌桶每秒填充平均速率 redis-rate-limiter.burstCapacity: 1 #令牌桶總?cè)萘?/pre>
步驟總結(jié)
首先引入依賴,在springboot啟動(dòng)類中,指定限流的限流指標(biāo),通過@Bean交由IOC管理,例如聲明一個(gè)ipKeyResolver,以ip作為限流的指標(biāo)。
在配置文件中,配置令牌桶每秒填充的速率和令牌桶總?cè)萘?,限流的指?biāo)。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Kubernetes之安裝nginx-controller作為統(tǒng)一網(wǎng)關(guān)方式
- nginx的location配置導(dǎo)致網(wǎng)關(guān)返回404問題
- Springboot解決跨域問題方案總結(jié)(包括Nginx,Gateway網(wǎng)關(guān)等)
- 解決Nginx網(wǎng)關(guān)超時(shí)出現(xiàn)504 GATEWAY TIMEOUT的問題
- Nginx gateway集群和動(dòng)態(tài)網(wǎng)關(guān)的實(shí)現(xiàn)思路
- 在網(wǎng)關(guān)中使用Nginx配置HTTP透明代理案例
相關(guān)文章
nginx出現(xiàn)500 Internal Server Error錯(cuò)誤的解決方法
這篇文章主要介紹了nginx出現(xiàn)500 Internal Server Error錯(cuò)誤的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-09-09永中文檔在線轉(zhuǎn)換預(yù)覽基于nginx配置部署方案
這篇文章主要為大家介紹了永中文檔在線轉(zhuǎn)換預(yù)覽基于nginx配置部署方案的實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06詳解Nginx 被動(dòng)檢查服務(wù)器的存活狀態(tài)
Nginx 可以持續(xù)測(cè)試您的上游服務(wù)器,避免出現(xiàn)故障的服務(wù)器,并將恢復(fù)的服務(wù)器優(yōu)雅地添加到負(fù)載均衡組中。這篇文章主要介紹了Nginx 被動(dòng)檢查服務(wù)器的存活狀態(tài),需要的朋友可以參考下2021-10-10通過Nginx實(shí)現(xiàn)前端與后端的協(xié)同部署
在現(xiàn)代 web 開發(fā)中,前端與后端的協(xié)同部署是一個(gè)關(guān)鍵問題,一個(gè)高效的部署策略不僅能提升用戶體驗(yàn),還能簡(jiǎn)化開發(fā)流程,今天,我們就來探討如何利用 Nginx 實(shí)現(xiàn)前端與后端的協(xié)同部署,需要的朋友可以參考下2025-03-03