nginx的限流和網(wǎng)關(guān)gatway限流詳解
1.場景描述
例如網(wǎng)站首頁采取二級緩存操作,減少對數(shù)據(jù)庫和redis的壓力,但是遇到惡意請求還是不能有效的緩解壓力,限流就能起到保護(hù)措施的作用了
2.nginx限流
nginx提供了兩種限流方案:
- 控制請求速率
- 控制并發(fā)連接數(shù)
3.控制速率
nginx常用控制速率的方式之一就是采用漏桶算法
3.1漏桶算法實現(xiàn)控制速率限流
概述:漏桶算法思想就是水(請求)滴入漏桶漏桶里,漏桶以一定速率出水(響應(yīng)速率),當(dāng)水滴入的速率過大時會溢出漏桶(訪問速率大于響應(yī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 :表示能存儲的訪問IP的地址,1M能存儲16000ip地址的訪問信息,10M可以存儲16W IP地址訪問信息
- 3.rate用于設(shè)置最大訪問速率,rate=2r/s 表示每秒能處理2個請求,也就是每500毫秒處理一次請求,若1s內(nèi)再有請求就會被拒絕
- 4.location /:攔截的請求,表示location下所有的請求
3.2突發(fā)性限流
場景:當(dāng)正常流量突然增大,超出的請求將被拒絕,無法處理突發(fā)流量,可以結(jié)合burst參數(shù)
server { location / { limit_req zone=myRateLimit burst=5; root html; index index.html index.htm; } }
burst:
會將超出的5個請求放入隊列中,按照處理速率處理,會一個個進(jìn)行處理.
但是會造成請求的等待時間過長,為了解決這個問題,可以加關(guān)鍵字 nodelay
,就會一次性的處理這些請求如
server { location / { limit_req zone=myRateLimit burst=5 nodelay; root html; index index.html index.htm; } }
nginx實現(xiàn)限流的總結(jié)
nginx限流采用的算法是漏桶算法,水滴入到漏桶中,再按一定速率流出,當(dāng)?shù)稳氲乃俾蚀笥诹鞒龅乃俾剩蜁绯觯簿褪钦埱笏俾蚀笥谔幚硭俾实臅r候就會拒絕請求。
具體的做法是 在nginx.conf文件中 配置rate 處理速率,配置漏桶能存儲的最大存儲量,1m能存儲16000個IP地址的訪問信息
burst:
nodelay
能處理突發(fā)性請求
網(wǎng)關(guān)gatway實現(xiàn)限流
使用場景:限制客戶端訪問服務(wù)端微服務(wù)的流量
gatway是采用令牌桶算法實現(xiàn)限流的,配置加入令牌的速率,和令牌桶能放入的最大令牌數(shù)量,只有請求獲得了令牌才能訪問,沒有獲得令牌就會拒絕訪問,令牌桶算法是基于redis實現(xiàn)的,默認(rèn)使用redis的RateLimter限流算法實現(xiàn)的
具體步驟:
- 1.添加依賴
- 2.在啟動類中定義方法返回對象 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 #請求數(shù)限流 名字不能隨便寫 args: key-resolver: "#{@ipKeyResolver}" redis-rate-limiter.replenishRate: 1 #令牌桶每秒填充平均速率 redis-rate-limiter.burstCapacity: 1 #令牌桶總?cè)萘?/pre>
步驟總結(jié)
首先引入依賴,在springboot啟動類中,指定限流的限流指標(biāo),通過@Bean交由IOC管理,例如聲明一個ipKeyResolver,以ip作為限流的指標(biāo)。
在配置文件中,配置令牌桶每秒填充的速率和令牌桶總?cè)萘?,限流的指?biāo)。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
nginx出現(xiàn)500 Internal Server Error錯誤的解決方法
這篇文章主要介紹了nginx出現(xiàn)500 Internal Server Error錯誤的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-09-09永中文檔在線轉(zhuǎn)換預(yù)覽基于nginx配置部署方案
這篇文章主要為大家介紹了永中文檔在線轉(zhuǎn)換預(yù)覽基于nginx配置部署方案的實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06通過Nginx實現(xiàn)前端與后端的協(xié)同部署
在現(xiàn)代 web 開發(fā)中,前端與后端的協(xié)同部署是一個關(guān)鍵問題,一個高效的部署策略不僅能提升用戶體驗,還能簡化開發(fā)流程,今天,我們就來探討如何利用 Nginx 實現(xiàn)前端與后端的協(xié)同部署,需要的朋友可以參考下2025-03-03