如何使用Nginx限制同时访问指定路径的客户端IP总数?
用Nginx限制特定路径的同时在线客户端IP总数
可以实现这个需求,通过结合Nginx的limit_conn模块和map指令,就能精准限制example.com/download路径的同时在线客户端IP总数,且不限制单个IP的连接数。
实现思路
核心逻辑是标记每个IP的首次连接,仅让首次连接占用IP名额,后续同IP的多连接不消耗名额,以此统计并限制同时在线的唯一IP总数。
具体配置
在Nginx主配置或站点配置文件中添加以下内容:
1. 定义连接计数的Zone
# 记录单个IP的当前连接数(用于判断是否为首次连接) limit_conn_zone $binary_remote_addr zone=per_ip_conn:10m; # 记录首次连接的IP数量(用于限制唯一IP总数) limit_conn_zone $is_new_ip zone=total_ip_count:10m;
2. 用Map标记IP的首次连接
map $connection_count $is_new_ip { # 当IP的连接数为1时,标记为首次连接(占用IP名额) 1 1; # 连接数>1时,不标记(不占用名额) default 0; }
3. 在目标Location中应用限制
server { server_name example.com; location /download { # 给单个IP设置足够大的连接上限,确保不限制单IP连接数 limit_conn per_ip_conn 10000; # 限制同时在线的唯一IP总数(此处设为50,可按需调整) limit_conn total_ip_count 50; # 可选:超过限制时返回的HTTP状态码,默认是503,这里改为429更贴合场景 limit_conn_status 429; # 你的业务配置(比如静态文件根目录、反向代理地址等) root /path/to/your/download/files; } }
配置说明
per_ip_connzone:用于统计每个IP的实时连接数,设置极大的连接上限(如10000),确保单个IP的连接数不受限制。map指令:通过$connection_count变量(由limit_conn模块自动提供)判断是否为IP的首次连接,仅首次连接会触发$is_new_ip=1。total_ip_countzone:统计所有首次连接的IP数量,通过limit_conn指令限制总数,达到控制同时在线唯一IP的目的。
验证与生效
修改配置后,执行以下命令验证配置合法性并重载Nginx:
nginx -t systemctl reload nginx
内容的提问来源于stack exchange,提问作者Mohammad Haghdoost
相关产品推荐
相关产品推荐

