本文最后更新于 2024-07-16,

若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益, 请联系我 删除。

本站只有Telegram群组为唯一交流群组, 点击加入

文章内容有误?申请成为本站文章修订者或作者? 向站长提出申请

环境 Arm

Nginx版本 Nginx openresty-1.25.3.1(Arm推荐安装openresty)

aapanel版本 7.0.5

使用存储:minio

Nginx端配置文件(nginx.conf)

user www www;
worker_processes auto;
error_log  /www/wwwlogs/nginx_error.log  crit;
pid        /www/server/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;

events {
    use epoll;
    worker_connections 51200;
    multi_accept on;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    # Nginx proxy configuration
    include       proxy.conf;

    # Server settings
    server_names_hash_bucket_size 512;
    client_header_buffer_size 64k;
    large_client_header_buffers 4 32k;
    client_max_body_size 15360m;
    sendfile   on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 60;

    # FastCGI settings
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 256k;
    fastcgi_intercept_errors on;

    # Gzip settings
    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 2;
    gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/json image/jpeg image/gif image/png font/ttf font/otf image/svg+xml application/xml+rss text/x-js;
    gzip_vary on;
    gzip_proxied expired no-cache no-store private auth;
    gzip_disable "MSIE [1-6]\.";

    # Limiting concurrent connections per IP and server
    limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
    limit_conn_zone $server_name zone=perserver:10m;

    # Map to check if client exceeded download limit
    map $binary_remote_addr $limit_rate_adjusted {
        default "";
        ~^(\d+\.\d+\.\d+\.\d+)$ $binary_remote_addr;
    };

    # Track download stats in shared memory
    limit_req_zone $binary_remote_addr zone=download_limit:10m rate=1r/s;
    limit_req_status 429;

    # Lua shared dictionary for download statistics
    lua_shared_dict download_stats 10m;

    # Server tokens and access log
    server_tokens off;
    access_log off;

    # Include additional virtual host configurations
    include /www/server/panel/vhost/nginx/*.conf;
}

默认不动,配置后重载服务

Server端配置文件(xxx.com.conf)

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name 你的minio域名;

    ssl_certificate /www/server/panel/vhost/cert/你的minio域名/fullchain.pem;
    ssl_certificate_key /www/server/panel/vhost/cert/你的minio域名/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
    ssl_prefer_server_ciphers on;

    # Increase maximum upload size to 10GB
    client_max_body_size 10G;

    # Limit concurrent connections per IP address
    limit_conn conn_limit_per_ip 1;

    location / {
        # Limit download speed to 2048 KB/s from the start
        limit_rate 2048k;

        # Limit rate after 10240MB downloaded (10737418240 bytes)
        limit_rate_after 10737418240;

        # Apply download rate limit if exceeded
        if ($limit_rate_adjusted) {
            limit_rate $limit_rate_adjusted;
        }

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass https://localhost:你的minio端口;
        proxy_ssl_verify off;  # If using self-signed certificates
    }

    error_page 497 https://$host$request_uri;

    access_log /var/log/nginx/你的minio域名_access.log;
    error_log /var/log/nginx/你的minio域名_error.log;
}

修改你的minio端口号和域名信息

实现功能

limit_rate_after 设置为10240MB,即10GB,您需要将其转换为字节并在Nginx配置中使用。

将大小转换为字节:

  • 10240MB = 10240 * 1024 * 1024 = 10737418240 字节

这样配置就会限制客户端在下载超过10240MB后的速率。

在Nginx中,limit_rate_after指令的值必须是一个有效的字节大小。通常情况下,Nginx不支持直接使用单位(如G、M、K)来表示大小,而是需要使用以字节为单位的具体数值。这可能导致配置文件中的错误,因为Nginx不能正确解析指令的值。

配置说明:

  1. limit_req_zone 指令:
    • 使用 limit_req_zone 指令创建一个名为 download_limit 的限速区域,以 $binary_remote_addr 为键,每秒限速为 1r/s,用于跟踪每个 IP 地址的下载请求。
  2. limit_rate_after 指令
    • limit_rate_after 10737418240; 设置全局下载量限制为 10GB。
    • limit_rate_after $limit_rate_adjusted 0; 根据 $limit_rate_adjusted 变量来动态调整下载量限制,对于匹配的 IP 地址,下载量为 0,即超过限制后启用速率限制。
  3. if ($limit_rate_adjusted) 条件
    • 如果 $limit_rate_adjusted 变量为真(即客户端 IP 地址超过了限制),则应用动态调整的下载速率限制。
  4. 其他配置
    • 保留了 SSL 配置、错误页面、访问日志等。

这种方式能够在每个 IP 地址达到设定的下载量(10GB)后,启用动态调整的速率限制,并在24小时后重置该限制。请根据实际情况测试和调整适合您的需求的参数和逻辑。