網站首頁 編程語言 正文
1 背景介紹
為了防止一些搶票助手所發起的一些無用請求,我們可以使用 nginx 中的限流策略進行限流操作。
常見的限流算法:計數器、漏桶算法、令牌桶算法
Java高并發系統限流算法的應用
從作用上來說,漏桶和令牌桶算法最明顯的區別就是是否允許突發流量(burst)的處理,漏桶算法能夠強行限制數據的實時傳輸(處理)速率,對突發流量不做額外處理;而令牌桶算法能夠在限制數據的平均傳輸速率的同時允許某種程度的突發傳輸。
2 Nginx 的限流策略
Nginx 的限流主要是兩種方式: 限制訪問頻率
和限制并發連接數
。
Nginx 按請求速率限速模塊使用的是漏桶算法,即能夠強行保證請求的實時處理速度不會超過設置的閾值。
Nginx 官方版本限制 IP 的連接和并發分別有兩個模塊:
1、limit_req_zone:用來限制單位時間內的請求數,即速率限制 , 采用的漏桶算法 “leaky bucket”。
2、limit_conn_zone:用來限制同一時間連接數,即并發限制。
2.1 limit_req_zone限制訪問頻率
使用語法:limit_req_zone key zone rate
key :定義限流對象,binary_remote_addr 是一種 key,表示基于 remote_addr(客戶端 IP) 來做限流,binary_ 的目的是壓縮內存占用量。
zone:定義共享內存區來存儲訪問信息, myRateLimit:10m 表示一個大小為 10M,名字為 myRateLimit 的內存區域。1M 能存儲 16000 IP 地址的
訪問信息,10M 可以存儲 16W IP 地址訪問信息。
rate: 用于設置最大訪問速率,rate=10r/s 表示每秒最多處理 10 個請求。Nginx 實際上以毫秒為粒度來跟蹤請求信息,因此 10r/s 實際上是限制:每 100 毫秒處理一個請求。這意味著,自上一個請求處理完后,若后續 100 毫秒內又有請求到達,將拒絕處理該請求。
舉例:
http { # 定義限流策略 limit_req_zone $binary_remote_addr zone=rateLimit:10m rate=1r/s ; # 搜索服務的虛擬主機 server { location / { # 使用限流策略,burst=5,重點說明一下這個配置,burst 爆發的意思,這個配置的意思是設置一個大小為 5 的緩沖區(隊列)當有大量請求(爆發)過來時, # 超過了訪問頻次限制的請求可以先放到這個緩沖區內。nodelay,如果設置,超過訪問頻次而且緩沖區也滿了的時候就會直接返回 503,如果沒有設置,則所 # 有請求會等待排隊。 limit_req zone=rateLimit burst=5 nodelay; proxy_pass http://train-manager-search ; } } }
頻繁訪問:
2.2 limit_conn_zone限制最大連接數
使用語法:limit_conn_zone key zone
key :定義限流對象,binary_remote_addr 是一種 key,表示基于 remote_addr(客戶端 IP) 來做限流,binary_ 的目的是壓縮內存占用量。
zone:定義共享內存區來存儲訪問信息, myRateLimit:10m 表示一個大小為 10M,名字為 myRateLimit 的內存區域。1M 能存儲 16000 IP 地址的
訪問信息,10M 可以存儲 16W IP 地址訪問信息。
舉例:
http { # 定義限流策略 limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m; # 搜索服務的虛擬主機 server { location / { # 對應的 key 是 $binary_remote_addr,表示限制單個 IP 同時最多能持有 1 個連接。 limit_conn perip 1; # 對應的 key 是 $server_name,表示虛擬主機(server) 同時能處理并發連接的總數。注意,只有當 request header 被 后端 server 處理后,這個連接才進行計數。 limit_conn perserver 10 ; proxy_pass http://train-manager-search ; } } }
3 黑名單設置
有時候會有一些惡意IP攻擊服務器,會基于程序頻繁發起請求對服務器造成巨大壓力,我們此時可以使用Nginx的黑名單功能實現黑名單過濾操作。我們首先需要配置黑名單IP,黑名單IP我們可以記錄到一個配置文件中,比如配置到blockip.conf
文件中:
配置固定IP為黑名單:
deny 192.168.100.1;
在nginx.conf
中引入blockip.conf
,可以放到http, server, location語句塊,配置如下:
#黑名單 include blockip.conf;
此時在192.168.100.1
的IP上訪問服務器,會報如下錯誤:
屏蔽ip的配置文件既可以屏蔽單個ip,也可以屏蔽ip段,或者只允許某個ip或者某個ip段訪問。
# 屏蔽單個ip訪問 deny IP; # 允許單個ip訪問 allow IP; # 屏蔽所有ip訪問 deny all; # 允許所有ip訪問 allow all; #屏蔽整個段即從123.0.0.1到123.255.255.254訪問的命令 deny 123.0.0.0/8 #屏蔽IP段即從123.45.0.1到123.45.255.254訪問的命令 deny 124.45.0.0/16 #屏蔽IP段即從123.45.6.1到123.45.6.254訪問的命令 deny 123.45.6.0/24 1234567891011121314
如果你想實現這樣的應用,除了幾個IP外,其他全部拒絕,那需要你在blockip.conf中這樣寫:
allow 192.168.100.1; allow 192.168.100.2; deny all; 123
但是這種手動配置的方式可能太過繁瑣,我們也可以配置動態黑白名單。
配置動態黑白名單,我們可以采用Lua+Redis實現,將黑名單存入到Redis緩存,每次執行請求時,通過lua腳本先獲取用戶IP,匹配IP是否屬于黑名單,如果是,則不讓請求,如果不是,則放行。
原文鏈接:https://blog.csdn.net/ZGL_cyy/article/details/124817960
相關推薦
- 2022-04-15 Go語言io?pipe源碼分析詳情_Golang
- 2022-10-31 Rust?實現?async/await的詳細代碼_相關技巧
- 2022-02-27 記錄npm 在windows下cmd中報錯以及idea下terminal安裝依賴時同樣報錯
- 2022-05-27 C++回溯算法深度優先搜索舉例分析_C 語言
- 2022-03-27 帶你從內存的角度看Python中的變量_python
- 2022-07-26 Python程序元素分析和注意事項
- 2022-07-29 Linux進程管理方法介紹_linux shell
- 2022-04-30 DataGridView設置單元格的提示內容ToolTip_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支