Nginx 限流是防止惡意請(qǐng)求與流量洪峰的重要手段,使用limit_req模塊實(shí)現(xiàn)精確控制。生產(chǎn)環(huán)境中,惡意攻擊和流量洪峰可能導(dǎo)致服務(wù)壓力過(guò)高,因此配置限流是必要的。
在現(xiàn)代互聯(lián)網(wǎng)架構(gòu)中,Nginx 已經(jīng)成為了非常重要的組件,廣泛應(yīng)用于負(fù)載均衡、反向代理以及靜態(tài)資源的服務(wù)。除了這些基本功能,Nginx 還提供了豐富的配置選項(xiàng)來(lái)處理限流(Rate Limiting)和鑒權(quán)(Authentication)。這兩項(xiàng)技術(shù)對(duì)于確保服務(wù)的可用性和安全性至關(guān)重要,特別是在高并發(fā)和敏感數(shù)據(jù)訪問(wèn)場(chǎng)景中。本文將詳細(xì)介紹如何在 Nginx 中配置限流和鑒權(quán),并講解其在實(shí)際應(yīng)用中的必要性。
點(diǎn)擊關(guān)注 持續(xù)更新
一、Nginx 限流:防止惡意請(qǐng)求與流量洪峰
1. 限流的必要性
在生產(chǎn)環(huán)境中,尤其是面對(duì)大規(guī)模用戶訪問(wèn)時(shí),系統(tǒng)可能會(huì)遭遇各種形式的惡意攻擊和流量洪峰。常見(jiàn)的場(chǎng)景包括:
暴力破解:攻擊者通過(guò)不斷嘗試用戶名和密碼進(jìn)行暴力破解,這種攻擊方式會(huì)消耗大量的服務(wù)器資源。
爬蟲攻擊:不受控制的爬蟲請(qǐng)求可能會(huì)導(dǎo)致服務(wù)器負(fù)載過(guò)高,甚至導(dǎo)致服務(wù)宕機(jī)。
DoS/DDoS 攻擊:分布式拒絕服務(wù)攻擊(DDoS)通過(guò)大量請(qǐng)求壓垮服務(wù)器,造成服務(wù)不可用。
限流可以幫助我們有效控制每個(gè)客戶端在單位時(shí)間內(nèi)的請(qǐng)求頻率,從而減少服務(wù)的壓力,防止惡意攻擊。
2. 使用limit_req 模塊實(shí)現(xiàn)限流
Nginx 提供了limit_req 模塊來(lái)實(shí)現(xiàn)請(qǐng)求限流。它可以基于客戶端 IP 或路徑進(jìn)行限流,并支持精確的控制。
示例配置:按 IP 限制請(qǐng)求頻率
http {
# 定義一個(gè)限制請(qǐng)求速率的區(qū)域
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
listen 80;
server_name example.com;
location / {
# 使用指定的限制區(qū)域
limit_req zone=one burst=5 nodelay;
# 正常處理請(qǐng)求
proxy_pass http://backend;
}
}
}
limit_req_zone:定義了限流的區(qū)域,這里基于客戶端的 IP 地址($binary_remote_addr),并限制請(qǐng)求頻率為每秒 1 個(gè)請(qǐng)求。zone=one:10m 表示為這個(gè)限流區(qū)域分配 10MB 的內(nèi)存。
limit_req:實(shí)際限制每秒的請(qǐng)求數(shù)量,burst=5 表示允許最多 5 個(gè)突發(fā)請(qǐng)求,nodelay 表示不延遲處理突發(fā)請(qǐng)求。
使用場(chǎng)景:
防止暴力破解:限制一個(gè) IP 每秒只能發(fā)起 1 次請(qǐng)求,可以有效防止暴力破解密碼的攻擊。
應(yīng)對(duì)爬蟲流量:對(duì)于爬蟲或不受控制的自動(dòng)化工具,設(shè)定限流策略可以減輕服務(wù)器負(fù)載,保護(hù)重要接口不被過(guò)度訪問(wèn)。
3. Nginx 限流的其他方式
雖然按IP 限流是最常見(jiàn)的方式,但 Nginx 還支持多種限流策略,可以幫助針對(duì)不同的業(yè)務(wù)場(chǎng)景靈活配置限流機(jī)制。以下是其他一些常見(jiàn)的限流方式:
按URI(路徑) 限流
在某些場(chǎng)景下,我們希望對(duì)特定路徑的請(qǐng)求進(jìn)行限流,比如 API 接口。Nginx 可以通過(guò)$request_uri 或location 配置項(xiàng)進(jìn)行路徑級(jí)別的限流。
示例:按 URI 限流
http {
limit_req_zone $request_uri zone=path:10m rate=1r/s;
server {
listen 80;
server_name example.com;
location /api/ {
# 使用路徑限流
limit_req zone=path burst=5 nodelay;
proxy_pass http://backend;
}
}
}
limit_req_zone $request_uri:將路徑作為限流的依據(jù),限制每個(gè)路徑每秒最多接受 1 個(gè)請(qǐng)求,burst=5 允許最多 5 次突發(fā)請(qǐng)求。
按Session ID 限流
某些應(yīng)用場(chǎng)景下,我們可能需要根據(jù)用戶的會(huì)話信息進(jìn)行限流,比如同一個(gè)用戶在短時(shí)間內(nèi)不能發(fā)起過(guò)多請(qǐng)求??梢酝ㄟ^(guò)cookie 來(lái)標(biāo)識(shí)會(huì)話。
示例:按 Session ID 限流
http {
limit_req_zone $cookie_session_id zone=session:10m rate=2r/s;
server {
listen 80;
server_name example.com;
location / {
# 使用 Session ID 限流
limit_req zone=session burst=10 nodelay;
proxy_pass http://backend;
}
}
}
$cookie_session_id:從請(qǐng)求的 cookie 中獲取 Session ID,作為限流的依據(jù)。每個(gè) Session 每秒最多接受 2 個(gè)請(qǐng)求。
按請(qǐng)求頭 限流
通過(guò)limit_req 配合請(qǐng)求頭信息(如User-Agent 或X-Forwarded-For)進(jìn)行限流,可以針對(duì)特定的用戶設(shè)備或來(lái)源 IP 進(jìn)行控制。
示例:按 User-Agent 限流
http {
limit_req_zone $http_user_agent zone=user_agent:10m rate=5r/s;
server {
listen 80;
server_name example.com;
location / {
# 使用 User-Agent 限流
limit_req zone=user_agent burst=10 nodelay;
proxy_pass http://backend;
}
}
}
$http_user_agent:從請(qǐng)求的User-Agent 頭中提取設(shè)備信息,并基于此進(jìn)行限流。
4. 限流的應(yīng)對(duì)策略
平滑限流:通過(guò)設(shè)置burst 參數(shù),可以允許短時(shí)間內(nèi)的請(qǐng)求激增,但在超過(guò)限制時(shí)會(huì)被延遲處理,避免直接拒絕。
動(dòng)態(tài)調(diào)整:根據(jù)不同的業(yè)務(wù)需求,可能需要?jiǎng)討B(tài)調(diào)整限流參數(shù),比如根據(jù)流量變化自動(dòng)調(diào)整請(qǐng)求限制。
二、Nginx 鑒權(quán):保障應(yīng)用安全
1. 鑒權(quán)的必要性
鑒權(quán)是保障應(yīng)用安全的核心機(jī)制之一,特別是在敏感數(shù)據(jù)的訪問(wèn)控制上。沒(méi)有有效的鑒權(quán)措施,任何人都可以通過(guò)直接訪問(wèn) API 或接口獲取數(shù)據(jù),帶來(lái)安全風(fēng)險(xiǎn)。常見(jiàn)的鑒權(quán)方式包括:
基本認(rèn)證:通過(guò)用戶名和密碼進(jìn)行身份驗(yàn)證。
JWT 鑒權(quán):基于 JSON Web Token 的認(rèn)證方式。
OAuth 2.0:第三方授權(quán)認(rèn)證,適用于需要跨域訪問(wèn)的應(yīng)用。
在 Nginx 中配置鑒權(quán),可以有效防止未授權(quán)的訪問(wèn),確保只有合法用戶能夠訪問(wèn)敏感資源。
2. 使用auth_basic 實(shí)現(xiàn) HTTP 基本認(rèn)證
最常見(jiàn)的鑒權(quán)方式是基本認(rèn)證,也就是用戶在訪問(wèn)某些路徑時(shí)需要提供用戶名和密碼。Nginx 通過(guò)auth_basic 模塊來(lái)實(shí)現(xiàn)這種方式。
示例配置:設(shè)置 HTTP 基本認(rèn)證
server {
listen 80;
server_name example.com;
location /secure/ {
# 啟用基本認(rèn)證
auth_basic "Restricted Area";
auth_basic_user_file /etc/nginx/.htpasswd;
# 代理請(qǐng)求到后端
proxy_pass http://backend;
}
}
auth_basic:指定認(rèn)證區(qū)域的名稱,瀏覽器會(huì)顯示該名稱作為認(rèn)證提示。
auth_basic_user_file:指定存儲(chǔ)用戶名和密碼的文件路徑。你可以使用工具(如htpasswd)生成該文件。
使用場(chǎng)景:
保護(hù)管理后臺(tái):僅允許經(jīng)過(guò)認(rèn)證的用戶訪問(wèn)管理后臺(tái)或控制臺(tái)。
敏感數(shù)據(jù)訪問(wèn):限制只有特定用戶能夠訪問(wèn)涉及個(gè)人數(shù)據(jù)、財(cái)務(wù)信息等敏感接口。
3. 使用 JWT 進(jìn)行鑒權(quán)
對(duì)于更復(fù)雜的認(rèn)證需求,可以采用JWT 鑒權(quán)。JWT(JSON Web Token)是一種輕量級(jí)的身份驗(yàn)證方式,廣泛應(yīng)用于現(xiàn)代 Web 應(yīng)用和 API。通過(guò) JWT,用戶只需在第一次認(rèn)證后獲得一個(gè) token,后續(xù)請(qǐng)求中通過(guò)帶上該 token 實(shí)現(xiàn)身份驗(yàn)證。
Nginx 本身不直接支持 JWT,但可以借助第三方模塊(如ngx_http_jwt_module)來(lái)實(shí)現(xiàn) JWT 鑒權(quán)。
示例配置:基于 JWT 的鑒權(quán)
server {
listen 80;
server_name example.com;
location /api/ {
# 檢查 Authorization 頭中的 JWT token
auth_jwt "Restricted Access";
auth_jwt_key /etc/nginx/jwt-public.pem;
# 代理請(qǐng)求到后端
proxy_pass http://backend;
}
}
auth_jwt:?jiǎn)⒂?JWT 鑒權(quán),指定需要身份驗(yàn)證的區(qū)域。
auth_jwt_key:指定用于驗(yàn)證 JWT 的公鑰。
使用場(chǎng)景:
微服務(wù)架構(gòu):多個(gè)服務(wù)之間需要進(jìn)行安全的通信,可以通過(guò) JWT 實(shí)現(xiàn)單點(diǎn)登錄(SSO)和跨服務(wù)鑒權(quán)。
移動(dòng)應(yīng)用:移動(dòng)端應(yīng)用常常采用 JWT 進(jìn)行身份驗(yàn)證,確保每次請(qǐng)求都可以驗(yàn)證用戶身份。
三、總結(jié)
Nginx 提供了豐富的限流和鑒權(quán)配置選項(xiàng),能夠幫助開(kāi)發(fā)者有效控制流量、保護(hù)服務(wù)安全。限流不僅有助于防止惡意攻擊,還能在流量突發(fā)時(shí)保護(hù)服務(wù)穩(wěn)定;而鑒權(quán)則保障了敏感資源的安全,確保只有授權(quán)用戶可以訪問(wèn)。通過(guò)靈活運(yùn)用這些功能,您可以讓您的應(yīng)用更安全、更高效。
如有任何問(wèn)題,歡迎在評(píng)論區(qū)與我交流!
原文來(lái)源:https://mp.weixin.qq.com/s/tRGstOkvvxighAsdfsoRRA
來(lái)源:本文內(nèi)容搜集或轉(zhuǎn)自各大網(wǎng)絡(luò)平臺(tái),并已注明來(lái)源、出處,如果轉(zhuǎn)載侵犯您的版權(quán)或非授權(quán)發(fā)布,請(qǐng)聯(lián)系小編,我們會(huì)及時(shí)審核處理。
聲明:江蘇教育黃頁(yè)對(duì)文中觀點(diǎn)保持中立,對(duì)所包含內(nèi)容的準(zhǔn)確性、可靠性或者完整性不提供任何明示或暗示的保證,不對(duì)文章觀點(diǎn)負(fù)責(zé),僅作分享之用,文章版權(quán)及插圖屬于原作者。
Copyright©2013-2025 ?JSedu114 All Rights Reserved. 江蘇教育信息綜合發(fā)布查詢平臺(tái)保留所有權(quán)利
蘇公網(wǎng)安備32010402000125
蘇ICP備14051488號(hào)-3技術(shù)支持:南京博盛藍(lán)睿網(wǎng)絡(luò)科技有限公司
南京思必達(dá)教育科技有限公司版權(quán)所有 百度統(tǒng)計(jì)