Nginx 连接限制

通过ip限制、并发限制、单位时间请求数限制,屏蔽恶意连接,保持Nginx性能。

拒绝非指定ip,使用的ip访问

    # 拒绝非指定ip,使用ip或<不在其他server_name范围内的域名>访问
    server {
        listen	80 default_server;
        listen	[::]:80 default_server;
        listen	443 ssl default_server;
        listen	[::]:443 ssl default_server;
        http2 on;
        # 证书文件随便配置个即可,如果不配置ssl证书字段会报[emerg]
        ssl_certificate      cert/y.z-crt.pem;
        ssl_certificate_key  cert/y.z-key.pem;
        server_name  "";
        
        if ($time_iso8601 ~ "^(\d{4})-(\d{2})") {
            set $year $1;
            set $month $2;
        }
        access_log  logs/access-$year$month-Other.log main;
        #return 301 http://y.z;        
        location / {
            allow  1.1.1.1;
            allow  2.2.2.2;
            # 其他ip访问提示403
            deny   all;
            root   html;
            index  index.html;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

限制单个IP的并发连接数和时间段内请求处理数

1、结合业务,谨慎使用,避免限制配置上线后,业务反而出问题,或者只使用其中一个限制方式。

2、限速操作时,需要 limit_rate 和 limit_conn 模块联合起来使用才能达到限速的效果。

限制单个IP并发连接数

在http区域:

  • 定义一个zone的名称与大小,用于存储会话的状态。key=$binary_remote_addr是 获取客户端ip地址的变量,为 IPv4 时占用 4B,为 IPv6 时占用 16B。
  • 1MB 的内存空间可以存储 3.2W个 32B 或 1.6W个 64B 的变量计数状态,而变量计数状态在 32 位系统平台占用 32B 或 64B,在 64 位系统平台占用 64B。
limit_conn_zone key zone=name:size;

在http、server、location区域:

limit_conn zone number; # 一个会话的最大并发连接数
limit_conn_status code; # 可选,一个会话并发请求超过最大并发连接数,返回code,默认为503
limit_conn_log_level error; # 可选,默认为error,其他可选值info/notice/warn

示例

limit_conn_zone $binary_remote_addr zone=conn_addr:2m;
limit_conn conn_addr 2;
limit_conn_status 503;

限制单个IP某段时间内的请求处理数

在http区域:

  • rate=1r/s 表示允许相同标识的客户端每秒1次,即每秒只处理一个请求;比如 30r/m 为每2秒才处理一个请求。
limit_req_zone key zone=name:size rate= number r/s;

在http、server、location:

  • burst=5 为设置一个大小为5的缓冲区,当有大量请求过来时,超过访问频次限制 rate=1r/s 的请求可以先放到这个缓冲区内等待,但是这个缓冲区只有5个位置,超过这个缓冲区的请求直接报503并返回。
  • nodelay:在瞬间提供处理(rate+burst)个请求的能力,请求超时(rat+burst)的时候直接返回503,永远不存在请求需要等待的情况。如果没有设置,则所有请求会依次等待排队;
limit_req zone=name [burst=number] [nodelay | delay=number]; 
limit_req_status code; # 可选,返回code,默认为503
limit_req_log_level error; # 可选,默认为error,其他可选值info/notice/warn

示例

limit_req_zone $binary_remote_addr zone=req_addr:2m rate=1r/s;
limit_req zone=req_addr burst=3 nodelay; 
limit_req_status 503;

使用过的示例

    # 开启限制单个IP最大并发连接数N,超过错误429;N在server中配置。
    limit_conn_zone $binary_remote_addr zone=conn_addr:2m;
    limit_conn_status 429;
    # 开启限制单个IP每秒处理N次请求,超过错误504,区分上面的503;引用和缓存数在server中配置。
    limit_req_zone $binary_remote_addr zone=defaul_req_addr:2m rate=2r/s;
    limit_req_zone $binary_remote_addr zone=www_req_addr:2m rate=30r/s;
    limit_req_zone $binary_remote_addr zone=rp_req_addr:2m rate=50r/s;
    limit_req_status 504;


        limit_conn conn_addr 1;
        limit_req zone=defaul_req_addr; 
        
        limit_conn conn_addr 5;
        limit_req zone=rp_req_addr; 
        
        limit_conn conn_addr 3;
        limit_req zone=www_req_addr;

断点续传

Nginx 默认支持断点续传功能,无需额外配置。但如果你需要确保该功能正常工作,可以检查以下配置项:

        # 确保支持 Range 请求,如果不支持断点续传,可以设置为 none。可配置区域 http/server/location
        add_header Accept-Ranges bytes;

对于反向代理的断点续传,需要http_slice_module,可通过 nginx -V 查看是否支持。

# http 配置
    proxy_cache_path /tmp/nginx/cache levels=1:2 keys_zone=cache:100m;

# location 配置
        location / {
            slice 1m;
            proxy_cache cache;
            proxy_cache_key $uri$is_args$args$slice_range;
            proxy_set_header Range $slice_range;
            proxy_cache_valid 200 206 1h;
            #proxy_set_header Range $http_range;
            proxy_pass http://127.0.0.1:8080;

        }

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注