在 NGINX 中根據(jù)用戶的真實 IP 進(jìn)行限制,可以通過配置 geo 模塊和 http 相關(guān)的配置來實現(xiàn)。以下是一個基本的步驟和示例:
獲取真實 IP: 如果 NGINX 后面有反向代理(如 Cloudflare、nginx-proxy 等),需要確保能夠獲取到用戶的真實 IP。你需要配置 real_ip 模塊。
配置 geo 模塊: 使用 geo 指令來定義一個變量,該變量可以根據(jù) IP 地址進(jìn)行限制。
配置訪問控制: 使用 limit_req 或 deny 指令根據(jù)真實 IP 進(jìn)行限制。
以下是一個基本的示例配置,限制某個 IP 地址的請求速率,并允許通過 X-Forwarded-For 獲取到真實的客戶端 IP。
http {
# 開啟 real_ip 模塊以獲取真實 IP
set_real_ip_from 192.0.2.0; # 反向代理服務(wù)器的 IP
set_real_ip_from 203.0.113.0; # 反向代理服務(wù)器的 IP
real_ip_header X-Forwarded-For;
# 定義一個限制請求速率的區(qū)域
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
listen 80;
server_name example.com;
location / {
# 應(yīng)用請求速率限制
limit_req zone=one burst=5 nodelay;
# 處理請求的其他配置
proxy_pass http://backend;
}
# 拒絕某些 IP 地址
deny 192.0.2.100; # 拒絕特定 IP 地址
allow all; # 允許所有其他 IP
}
}
set_real_ip_from: 這條指令用于告訴 NGINX 哪些 IP 地址是可信的代理。如果你的 NGINX 服務(wù)器前面有負(fù)載均衡器或 CDN,確保將它們的 IP 添加到這里。
real_ip_header: 指定從哪個 HTTP 頭獲取真實的客戶端 IP,這里使用的是 X-Forwarded-For。
limit_req_zone: 定義一個請求限速區(qū)域,$binary_remote_addr 是用戶的真實 IP 地址。這里設(shè)置為每秒一個請求,最大突發(fā)請求為 5 個。
limit_req: 在 location 塊中應(yīng)用請求限制。
deny 和 allow: 可以根據(jù) IP 地址拒絕或允許訪問。
確保你的 NGINX 配置文件無誤,并使用 nginx -t 命令檢查配置。
重新加載 NGINX 配置,使用 nginx -s reload。
根據(jù)你的實際需求調(diào)整速率限制和允許/拒絕的 IP 地址。
這樣配置后,NGINX 就可以根據(jù)用戶的真實 IP 進(jìn)行請求限制。