nginx之依據IP做限制

2022-04-11 09:20:17 字數 3711 閱讀 3558

環境如下:

1.既然依據ip做限制,那麼可限制的一般有連線數、請求數、速率、頻寬2.nginx官方已經提供的有對應的模組,且預設是已經載入的,如果需要取消則--without-*,那麼,模組具體資訊如下:

http_limit_req_module請求數限制

連線數限制

http_core_module速率、頻寬限制

http_map_module以第乙個變數值為條件,新增第二個自定義變數

http_geo_module以客戶端ip位址作為變數條件,新增第二個自定義變數

連線數和請求數限制可能有人會迷惑。這裡解惑一下:乙個頁面可能存在多個,我們請求了這個頁面,建立了鏈結,但是這個鏈結包含了10個請求(均是)。所以這兩個模組結合起來比較好。

map和geo的目的在於設定限定範圍,畢竟我們有時候需要針對某乙個範圍的ip進行限制,如僅對外網進行限制

3.模組解析:

http上下文中,可做如下:

limit_req_zone $variable zone=zone_name:num rate=numr/s;

limit_req_zone:固定格式

$variable:指的是對某個ip作出限定,此變數一般從$binary_remote_addr或者$remote_addr獲取,當然也可以直接呼叫這兩個變數

zone=zone_name:num:指定共享記憶體空間名和大小,比如說zone=req1:5m

rate=numr/s:指定請求速率,這裡值只能是整數,比如說1r/s表示每秒最多1個請求,30r/m表示每分鐘最多30個請求,也就是每秒最多2個請求

location上下文中,可做如下:

limit_req zone=zone_name burst=num;

limit_req:固定格式

zone:設定共享記憶體空間名

burst:如果請求頻率超出了http上下文中限定的速率,則指定允許超出多少,當然,這超出的部分會被延遲處

理。如果繼續超出burst的限定值,則返回503錯誤

此模組基本和http_limit_conn_module一致

http上下文中,可做如下:

limit_conn_zone $variable zone=zone_name:num;

location上下文中,可做如下:

limit_conn zone_name num;

num:限定每秒連線數,併發

location上下文中,可做如下:

limit_rate_after num;

限定使用多少頻寬之後,再執行限速,如1m

limit_rate  num;限定具體速度,如100k,即限定100kb/s

http上下文中,可做如下:

map $var1 $var2

例1:依據乙個具體數值,限定ip範圍,當white為1時,則ip為請求的客戶端ip

map $white $ip

例2:依據網域名稱,賦值

定義從指定的變數獲取客戶端的ip位址。預設情況下,nginx從$remote_addr變數取得客戶端ip位址,但也可以從其他變數獲得。

http上下文中,可做如下:

geo $var1 $var2

例1:依據ip位址,賦值給變數2。如果是來訪客戶端是127.0.0.1,則white為1,反之為0.

geo $white

4.乙個綜合例子

}測試:加入限制前:客戶端訪問nginx的狀態

加入限制後:客戶端訪問nginx的狀態

來自為知筆記(wiz)

nginx限制請求之四 目錄進行IP限制

高可用服務設計之二 rate limiting 限流與降級 nginx限制請求之一 ngx http limit conn module 模組 nginx限制請求之二 ngx http limit req module 模組 nginx限制請求之三 nginx lua redis 對請求進行限制 n...

nginx 限制 ip 訪問

環境 centos7.6 nginx 1.16.1 背景 nginx 伺服器已經配置好了公網 ip 和 網域名稱證書 公網 ip 對我來說是透明的,沒有管理許可權,所以只好在 nginx 伺服器上做 ip 限制 未修改之前,登入日誌的 remote addr 總是為 192.12.182.3,猜測這...

nginx限制ip訪問

nginx限制ip,目前從網上發現了兩種解決方法 1 是採用原生的方式來實現 set flag f if remote addr 10.1.20.35 if flag 1 2 是採用geo模組來實現,預設1.16.1是自帶的有這個模組 http中增加如下 geo bad user location中...