Karp 的技术博客

当使用 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,并实现并发访问限制。这对保护您的应用程序免受恶意请求和流量攻击非常重要

版权属于:karp
作品采用:本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
更新于: 2024年10月21日 07:51
0

目录

来自 《Nginx在CDN加速之后,获取用户真实IP做并发访问限制的方法》