nginx

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > nginx > Nginx客户端限制

Nginx对客户端的限制方法

作者:難釋懷

在Nginx中,你可以通过多种方式对客户端进行限制,以保护服务器资源不被滥用,例如限制请求速率、连接数、带宽等,本文介绍Nginx对客户端的限制,感兴趣的朋友跟随小编一起看看吧

一、引言:为什么需要限制“好”客户端?

在互联网世界,流量既是财富,也可能是灾难。一个设计良好的系统,不仅要能服务海量的正常用户,更要能抵御恶意的、异常的流量冲击。

Nginx 作为 Web 架构的流量入口,天然地承担着“守门人”的角色。通过对客户端施加合理的限制,我们可以:

💡 核心价值
掌握 Nginx 的客户端限制能力,是构建一个健壮、高可用 Web 服务不可或缺的安全基石

二、三大核心限制策略:连接、请求与带宽

Nginx 主要通过三个内置模块来实现对客户端的精细化控制。

1.ngx_http_limit_conn_module- 并发连接数限制

2.ngx_http_limit_req_module- 请求速率限制

3.limit_rate- 单连接带宽限制

三、实战配置详解

1. 限制并发连接数

http {
    # 定义一个名为 "perip" 的共享内存区域,大小为 10MB,
    # 用于存储客户端 IP ($binary_remote_addr) 的连接计数。
    limit_conn_zone $binary_remote_addr zone=perip:10m;
    server {
        listen 80;
        server_name example.com;
        location / {
            # 限制每个 IP 最多只能有 20 个并发连接
            limit_conn perip 20;
            # 可选:自定义超过限制时返回的状态码
            limit_conn_status 503; 
            proxy_pass http://backend;
        }
    }
}

2. 限制请求速率(带突发)

http {
    # 定义一个名为 "one" 的共享内存区域,大小为 10MB,
    # 限制每个 IP 的请求速率为每秒 10 个 (10r/s)。
    limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
    server {
        location /api/ {
            # 应用限制规则
            # burst=20: 允许突发最多 20 个额外请求进入“缓冲队列”
            # nodelay: 不延迟处理突发的请求,直接放行(否则会按速率匀速处理)
            limit_req zone=one burst=20 nodelay;
            proxy_pass http://api_backend;
        }
    }
}

3. 限制单连接带宽

server {
    location /download/ {
        # 限制每个连接的下载速度为 128KB/s
        limit_rate 128k;
        # 可以结合内部变量实现动态限速
        # 例如,对特定 User-Agent 限速
        if ($http_user_agent ~* "BadBot") {
            set $limit_rate 1k;
        }
        alias /path/to/files/;
    }
}

四、高级技巧与注意事项

1.识别真实客户端 IP

如果 Nginx 前面还有 CDN 或代理(如 LVS, HAProxy),$remote_addr 获取到的是代理服务器的 IP,而非真实用户 IP。此时需要配合 real_ip 模块:

set_real_ip_from 192.168.1.0/24; # 可信代理的IP段
real_ip_header X-Forwarded-For;   # 从该Header中获取真实IP
real_ip_recursive on;             # 递归解析X-Forwarded-For
# 之后再使用 $realip_remote_addr 或重新赋值 $binary_remote_addr
map $realip_remote_addr $client_ip {
    "" $remote_addr;
    default $realip_remote_addr;
}
limit_conn_zone $client_ip zone=real_perip:10m;

2.白名单机制

对于重要的合作伙伴或监控系统,我们通常需要将其加入白名单,豁免限制。可以结合 geo 模块实现:

geo $limited_ip {
    default 1;          # 默认所有IP都需要被限制
    10.0.0.0/8 0;       # 内网IP豁免
    1.2.3.4 0;          # 特定IP豁免
}
map $limited_ip $limit_key {
    0 "";               # 豁免IP,映射为空字符串
    1 $binary_remote_addr; # 需要限制的IP,映射为其IP
}
limit_req_zone $limit_key zone=api:10m rate=10r/s;
location /api/ {
    limit_req zone=api burst=20 nodelay;
}

3.日志记录与监控

在 access_log 中记录被限制的请求,便于后续分析和告警。

log_format main_ext '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent" '
                    'rt=$request_time uct="$upstream_connect_time" '
                    'uht="$upstream_header_time" urt="$upstream_response_time" '
                    'limit_req_status=$limit_req_status'; # 记录限流状态
access_log /var/log/nginx/access.log main_ext;

五、结语

到此这篇关于Nginx对客户端的限制的文章就介绍到这了,更多相关Nginx客户端限制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文