nginx 限速限流配置示例

并发连接限制 : limit_conn_module

请求频率限制 : limit_req_module

限制用户和服务器之间传输的字节数,最常用的场景可能就是下载/上传限速: limit_rate

limit_req_zone

语法:limit_req_zone key zone=name:size rate=rate;

只能在http块中使用

此指令用于声明请求限制zonezone可以保存各种key的状态,namezone的唯一标识,size代表zone的内存大小,rate指定速率限制。

参数详解:

1.key

若客户的请求匹配了key,则进入zone。可以是文本、变量,通常为Nginx变量。

$binary_remote_addr(客户的ip),$uri(不带参数的请求地址)$request_uri(带参数的请求地址)$server_name(服务器名称)

支持组合使用,使用空格隔开。

2.zone

使用zone=test,指定此zone的名字为test。

3.size

在zone=name后面紧跟:size,指定此zone的内存大小。如zone=name:10m,代表name的共享内存大小为10m。通常情况下,1m可以保存16000个状态。

4.rate

使用rate=1r/s,限制平均1秒不超过1个请求。使用rate=1r/m,限制平均1分钟不超过1个请求。

 

http {
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request"'
        '$status $body_bytes_sent "$http_referer" '
        '"$http_user_agent" '
        'ups_resp_time: $upstream_response_time'
        'request_time: $request_time';
    server_tokens off;
    fastcgi_intercept_errors on;
    server_names_hash_bucket_size 24;
    client_header_buffer_size 8k;
    large_client_header_buffers 4 32k;
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile on;
    tcp_nodelay on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    client_body_buffer_size 128k;
    client_max_body_size 10m;
    proxy_connect_timeout 30;
    proxy_read_timeout 30;
    proxy_send_timeout 30;
    proxy_buffer_size 16k;
    proxy_buffers 4 64k;
    proxy_busy_buffers_size 128k;
    proxy_temp_file_write_size 128k;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP $remote_addr;
    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 4;
    gzip_vary  on;
    vhost_traffic_status_zone;
    vhost_traffic_status_filter_by_host on;

    limit_conn_zone $binary_remote_addr zone=perip:10m;
    limit_conn_zone $server_name zone=perserver:10m;
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    limit_traffic_rate_zone  rate $remote_addr 32m;
    server {
        listen       80;
        server_name  localhost;
        charset utf-8;
        add_header X-Frame-Options "DENY";
        add_header X-XSS-Protection "1;mode=block";
        add_header X-Content-Type-Options "nosniff"; 
       if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})") { 
        set $year $1;
        set $month $2;
        set $day $3;
        set $hour $4;
        set $minutes $5;
        set $seconds $6;
        }
        access_log logs/$year-$month-$day-$hour-access.log main;
        location / {
            limit_conn perip 50;
            limit_conn perserver 100;
            limit_req zone=one burst=5 nodelay;
            limit_rate_after 500k;  ## 当请求的流量超500KB后进行限速
            limit_rate 50k;  ## 限速 50KB/s
            limit_traffic_rate rate 100k;

            root   html;
            index  index.html index.htm;

            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

 

posted @ 2023-01-11 15:04  太阳的阳ฅ  阅读(5)  评论(0)    收藏  举报