先从可信代理恢复客户端地址,再按 IP 限制请求。否则多个访问者可能被当成同一台 CDN 服务器计数。
为什么会误伤其他用户?
Alice 和 Bob 都经过同一个 CDN 地址。没有真实 IP 处理时,Nginx 看到的都是该 CDN 地址。Alice 的流量可能用完 Bob 看起来也在共享的额度。
信任指定代理,而不是任意传入的头
这段示例配置位于 http 内。文档示例地址必须替换为实际可信代理范围;假设代理正确维护 X-Forwarded-For:
nginx
set_real_ip_from 192.0.2.10;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
limit_req_zone $binary_remote_addr zone=per_client:10m rate=5r/s;
server {
listen 80;
location /api/ {
limit_req zone=per_client burst=10;
limit_req_status 429;
proxy_pass http://127.0.0.1:3000;
}
}
指定谁可以提供地址。递归处理会选择转发链中最后一个不属于可信范围的地址。 随后按恢复的客户端 IP 计数; 将限制应用到路由。这里超出速率但在 burst 范围内的请求可能被延迟,超过 burst 的请求被拒绝。速率只是示例,不是生产默认值。
