首頁 運維 Nginx Nginx如何限制http資源請求

Nginx如何限制http資源請求

May 17, 2023 pm 12:16 PM
http nginx

前置條件:nginx 需要有ngx_http_limit_conn_module 和ngx_http_limit_req_module 模組,可以使用指令2>&1 nginx -v | tr ' ' '\n'|grep limit 檢查有沒有對應模組,如果沒有請重新編譯安裝這兩個模組。

測試版本為:nginx版本為1.15

#限制連結數

#1.使用limit_conn_zone 指令定義金鑰並設定共享記憶體區域的參數(工作進程將使用此區域來共享金鑰值的計數器)。第一個參數指定作為鍵計算的表達式。第二個參數zone 指定區域的名稱及其大小:

limit_conn_zone $binary_remote_addr zone=addr:10m;
登入後複製

2.在location {} , server {} 或http {} 上下文中使用limit_conn 指令來套用限制,第一個參數為上面設定的共享記憶體區域名稱,第二個參數為每個key被允許的連結數:

location /download/ {
 limit_conn addr 1;
}
登入後複製

使用$binary_remote_addr 變數作為參數的時候,是基於ip 位址的限制,同樣可以使用$server_name 變量進行給定伺服器連線數的限制:

http {
 limit_conn_zone $server_name zone=servers:10m;

 server {
 limit_conn servers 1000;
 }
}
登入後複製

限制請求速率

#速率限制可用於防止ddos,cc 攻擊,或防止上游伺服器同時被太多請求淹沒。該方法基於 leaky bucket 漏桶演算法,請求以各種速率到達桶並以固定速率離開桶。在使用速率限制之前,您需要配置"漏桶" 的全域參數:

  • key - 用於區分一個客戶端與另一個客戶端的參數,通常是變數

  • shared memory zone - 保留這些金鑰狀態的區域的名稱和大小(即"漏桶")

  • rate - 每秒請求數( r/s)或每分鐘請求數(r/m)("漏桶排空")中指定的請求速率限制。每分鐘請求數用於指定小於每秒一個請求的速率。

這些參數使用 limit_req_zone 指令設定。該指令在http {} 層級定義- 這種方法允許應用不同的區域並請求溢出參數到不同的上下文:

http {
 #...

 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
}
登入後複製

使用此配置,將創建大小為10m 字節,名稱為one 的共享記憶體區域。此區域保存使用 $binary_remote_addr 變數設定的客戶端 ip 位址的狀態。請注意, $remote_addr 還包含客戶端的 ip 位址,而 $binary_remote_addr 保留更短的 ip 位址的二進位表示。

可以使用以下資料計算共享記憶體區域的最佳大小: $binary_remote_addr ipv4 位址的值大小為 4 個位元組,64 位元平台上的儲存狀態佔用 128 個位元組。因此,大約 16000 個 ip 位址的狀態資訊佔用該區域的 1m 位元組。

如果在 nginx 需要新增條目時儲存空間耗盡,則會刪除最舊的條目。如果釋放的空間仍然不足以容納新記錄,nginx 將傳回 503 service unavailable 狀態代碼,狀態碼可以使用 limit_req_status 指令重新定義。

一旦該區域被設置,你可以使用nginx 配置中的任何地方使用limit_req 指令限制請求速率,尤其是server {} , location {} 和http {} 上下文:

http {
 #...

 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

 server {
 #...

 location /search/ {
  limit_req zone=one;
 }
 }
}
登入後複製

使用如上配置,nginx 在/search/ 路由下將每秒鐘處理不超過1 個請求,延遲處理這些請求的方式是總速率不大於設定的速率。 nginx 將延遲處理此類請求,直到 "儲存區"(共用儲存區 one)已滿。對於到達完整儲存桶的請求,nginx 將回應 503 service unavailable 錯誤(當 limit_req_status 未自訂設定狀態碼時)。

限制寬頻

要限制每個連線的頻寬,請使用下列limit_rate 指令:

location /download/ {
 limit_rate 50k;
}
登入後複製

透過此設置,客戶端將能夠透過單一連線以最高50k/秒的速度下載內容。但是,客戶端可以開啟多個連線跳過此限制。因此,如果目標是阻止下載速度大於指定值,則連線數也應該受到限制。例如,每個 ip 位址一個連線(如果使用上面指定的共用記憶體區域):

location /download/ {
 limit_conn addr 1;
 limit_rate 50k;
}
登入後複製

要僅在客戶端下載一定數量的資料後施加限制,請使用該 limit_rate_after 指令。允許客戶端快速下載一定數量的資料(例如,檔案頭 - 電影索引)並限制下載其餘資料的速率(使用戶觀看電影而不是下載)可能是合理的。

limit_rate_after 500k;
limit_rate 20k;
登入後複製

以下範例顯示了用於限制連線數和頻寬的組合配置。允許的最大連接數設定為每個客戶端位址 5 個連接,這適用於大多數常見情況,因為現代瀏覽器通常一次最多打開 3 個連接。同時,提供下載的位置只允許一個連線:

http {
 limit_conn_zone $binary_remote_address zone=addr:10m

 server {
 root /www/data;
 limit_conn addr 5;

 location / {
 }

 location /download/ {
  limit_conn addr 1;
  limit_rate_after 1m;
  limit_rate 50k;
 }
 }
}
登入後複製

以上是Nginx如何限制http資源請求的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1670
14
CakePHP 教程
1428
52
Laravel 教程
1329
25
PHP教程
1273
29
C# 教程
1256
24
nginx在windows中怎麼配置 nginx在windows中怎麼配置 Apr 14, 2025 pm 12:57 PM

如何在 Windows 中配置 Nginx?安裝 Nginx 並創建虛擬主機配置。修改主配置文件並包含虛擬主機配置。啟動或重新加載 Nginx。測試配置並查看網站。選擇性啟用 SSL 並配置 SSL 證書。選擇性設置防火牆允許 80 和 443 端口流量。

docker怎麼啟動容器 docker怎麼啟動容器 Apr 15, 2025 pm 12:27 PM

Docker 容器啟動步驟:拉取容器鏡像:運行 "docker pull [鏡像名稱]"。創建容器:使用 "docker create [選項] [鏡像名稱] [命令和參數]"。啟動容器:執行 "docker start [容器名稱或 ID]"。檢查容器狀態:通過 "docker ps" 驗證容器是否正在運行。

docker容器名稱怎麼查 docker容器名稱怎麼查 Apr 15, 2025 pm 12:21 PM

可以通過以下步驟查詢 Docker 容器名稱:列出所有容器(docker ps)。篩選容器列表(使用 grep 命令)。獲取容器名稱(位於 "NAMES" 列中)。

怎麼查看nginx是否啟動 怎麼查看nginx是否啟動 Apr 14, 2025 pm 01:03 PM

確認 Nginx 是否啟動的方法:1. 使用命令行:systemctl status nginx(Linux/Unix)、netstat -ano | findstr 80(Windows);2. 檢查端口 80 是否開放;3. 查看系統日誌中 Nginx 啟動消息;4. 使用第三方工具,如 Nagios、Zabbix、Icinga。

docker怎麼創建容器 docker怎麼創建容器 Apr 15, 2025 pm 12:18 PM

在 Docker 中創建容器: 1. 拉取鏡像: docker pull [鏡像名] 2. 創建容器: docker run [選項] [鏡像名] [命令] 3. 啟動容器: docker start [容器名]

nginx怎麼查版本 nginx怎麼查版本 Apr 14, 2025 am 11:57 AM

可以查詢 Nginx 版本的方法有:使用 nginx -v 命令;查看 nginx.conf 文件中的 version 指令;打開 Nginx 錯誤頁,查看頁面的標題。

nginx怎麼配置雲服務器域名 nginx怎麼配置雲服務器域名 Apr 14, 2025 pm 12:18 PM

在雲服務器上配置 Nginx 域名的方法:創建 A 記錄,指向雲服務器的公共 IP 地址。在 Nginx 配置文件中添加虛擬主機塊,指定偵聽端口、域名和網站根目錄。重啟 Nginx 以應用更改。訪問域名測試配置。其他注意事項:安裝 SSL 證書啟用 HTTPS、確保防火牆允許 80 端口流量、等待 DNS 解析生效。

nginx服務器掛了怎麼辦 nginx服務器掛了怎麼辦 Apr 14, 2025 am 11:42 AM

當 Nginx 服務器宕機時,可執行以下故障排除步驟:檢查 nginx 進程是否正在運行。查看錯誤日誌以獲取錯誤消息。檢查 nginx 配置語法正確性。確保 nginx 具有訪問文件所需的權限。檢查文件描述符打開限制。確認 nginx 正在偵聽正確的端口。添加防火牆規則以允許nginx流量。檢查反向代理設置,包括後端服務器可用性。如需進一步幫助,請聯繫技術支持。

See all articles