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