在 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 进行请求限制。