当使用 CDN(内容分发网络)加速时,Nginx 可能接收到来自 CDN 的请求,这些请求通常会替代用户的真实 IP 地址。为了对用户进行并发访问限制,您需要确保 Nginx 能够获取用户的真实 IP。以下是实现这一目标的方法。
1. 配置 Nginx 以获取真实 IP
1.1 使用 set_real_ip_from
在 Nginx 配置文件中,您需要使用 set_real_ip_from
指令来指定 CDN 的 IP 地址范围。然后使用 real_ip_header
指令来设置 Nginx 从哪个头部获取真实 IP。
示例配置
http {
# 指定 CDN 的 IP 地址范围
set_real_ip_from 203.0.113.0/24; # 示例:替换为您的 CDN IP 范围
set_real_ip_from 198.51.100.0/24; # 示例:替换为您的 CDN IP 范围
real_ip_header X-Forwarded-For;
server {
listen 80;
location / {
# 处理请求
}
}
}
1.2 允许多级代理
如果您的 CDN 可能在 X-Forwarded-For
中添加多个 IP,您可以使用 real_ip_recursive
指令来启用递归查找。
real_ip_recursive on;
2. 配置并发访问限制
在获取用户真实 IP 后,您可以使用 Nginx 的 limit_req
模块来限制并发访问。
2.1 配置 limit_req_zone
首先,您需要定义一个 limit_req_zone
,通常放在 http
块中。
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; # 每秒 1 个请求
server {
listen 80;
location / {
limit_req zone=one burst=5 nodelay; # 允许突发 5 个请求
# 处理请求
}
}
}
2.2 解释配置
limit_req_zone
:定义一个名为one
的限流区域,使用$binary_remote_addr
作为键,限制速率为每秒 1 个请求。limit_req
:在指定的location
中应用限流,允许突发的 5 个请求。
3. 完整配置示例
以下是一个完整的 Nginx 配置示例,包括获取真实 IP 和并发访问限制:
http {
# 获取真实 IP
set_real_ip_from 203.0.113.0/24; # 替换为您的 CDN IP 范围
set_real_ip_from 198.51.100.0/24; # 替换为您的 CDN IP 范围
real_ip_header X-Forwarded-For;
real_ip_recursive on;
# 并发访问限制
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
listen 80;
location / {
limit_req zone=one burst=5 nodelay;
# 处理请求
proxy_pass http://backend; # 替换为您的后端服务
}
}
}
4. 测试配置
在修改 Nginx 配置后,确保测试配置是否正确:
nginx -t
如果没有错误,可以重新加载 Nginx:
sudo systemctl reload nginx
5. 总结
通过正确配置 Nginx,您可以在使用 CDN 加速的情况下获取用户的真实 IP,并实现并发访问限制。这对保护您的应用程序免受恶意请求和流量攻击非常重要