温馨提示×

Debian系统Nginx资源限制设置

小樊
41
2025-11-14 08:13:08
栏目: 智能运维

Debian 下 Nginx 资源限制实用指南

一 全局与连接层限制

  • 工作进程与连接数:在 /etc/nginx/nginx.confhttp 块设置进程数与单进程最大连接数,影响可承载并发连接的上限(并发上限≈worker_processes × worker_connections)。
  • 文件描述符:提升 worker_rlimit_nofile 可避免 “too many open files”,需与系统级限制匹配。
  • 典型配置示例:
    user www-data;
    worker_processes auto;         # 一般设为 CPU 核心数
    worker_rlimit_nofile 65536;    # 提升 worker 可打开文件数
    
    events {
        use epoll;                 # Linux 推荐事件模型
        worker_connections 16384;  # 单 worker 并发连接上限
        multi_accept on;
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout 65;
    }
    
    调整后执行:sudo nginx -t && sudo systemctl reload nginx 使配置生效。

二 请求速率与并发连接限制

  • 速率限制:使用 limit_req_zone 定义共享内存区与速率,在 server/location 中用 limit_req 应用,可配合 burstnodelay 平滑突发流量。
  • 并发连接限制:使用 limit_conn_zone 定义并发键与共享内存区,在 location 中用 limit_conn 限制同一键的并发数。
  • 示例(限制每个 IP 每秒 1 个请求,突发 5;每个 IP 并发连接不超过 10):
    http {
        # 速率限制:按客户端 IP,1r/s,共享内存 10MB
        limit_req_zone $binary_remote_addr zone=req_limit:10m rate=1r/s;
    
        # 并发连接限制:按客户端 IP,共享内存 10MB
        limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
    
        server {
            listen 80;
            server_name example.com;
    
            location / {
                # 应用速率限制:突发 5,nodelay 立即处理不排队
                limit_req zone=req_limit burst=5 nodelay;
    
                # 应用并发连接限制:每个 IP 最多 10 个并发连接
                limit_conn conn_limit 10;
    
                proxy_pass http://backend;
            }
        }
    }
    
    调整后执行:sudo nginx -t && sudo systemctl reload nginx

三 带宽与请求体大小限制

  • 带宽限速:在 http/server/location 使用 limit_rate 限制单个连接的传输速率,可按路径精细化控制(如下载限速)。
  • 请求体大小:用 client_max_body_size 限制客户端请求体(如上传),防止过大请求耗尽资源。
  • 示例(下载限速 100KB/s;上传上限 10MB):
    server {
        listen 80;
        server_name example.com;
    
        # 下载限速:每个连接 100KB/s
        location /download/ {
            alias /var/www/downloads/;
            limit_rate 100k;
        }
    
        # 上传限制:最大 10MB
        client_max_body_size 10m;
    
        location / {
            proxy_pass http://backend;
        }
    }
    
    调整后执行:sudo nginx -t && sudo systemctl reload nginx

四 白名单与按条件限制

  • 使用 geomap 组合实现 IP 白名单:白名单 IP 的限流键设为空,从而跳过限制;其他 IP 按 $binary_remote_addr 限流。
  • 示例(内网段与单 IP 白名单):
    http {
        # 定义白名单:1 表示受限,0 表示放行
        geo $limit {
            default 1;
            192.168.1.0/24 0;
            10.0.0.1      0;
        }
    
        # 将 $limit 映射为限流键:白名单为空(不限流),其他为客户端 IP
        map $limit $limit_key {
            0 "";
            1 $binary_remote_addr;
        }
    
        limit_req_zone $limit_key zone=req_limit:10m rate=1r/s;
    
        server {
            listen 80;
            server_name example.com;
    
            location / {
                limit_req zone=req_limit burst=5 nodelay;
                proxy_pass http://backend;
            }
        }
    }
    
    调整后执行:sudo nginx -t && sudo systemctl reload nginx

五 系统级与 Systemd 资源限制

  • 临时调整(当前会话):ulimit -n 65535(仅对当前 shell 有效,重启失效)。
  • 永久调整(登录会话生效):编辑 /etc/security/limits.conf/etc/security/limits.d/*.conf,如:
    * soft nofile 65535
    * hard nofile 65535
    
    注意:通过 systemd 启动的服务默认不读取 limits.conf,需在单元文件设置。
  • Systemd 服务级限制(推荐):编辑 /lib/systemd/system/nginx.service/etc/systemd/system/nginx.service,在 [Service] 段添加:
    [Service]
    LimitNOFILE=65536
    LimitNPROC=4096
    LimitCORE=infinity
    
    使配置生效:sudo systemctl daemon-reload && sudo systemctl restart nginx
  • 全局默认(可选):在 /etc/systemd/system.conf/etc/systemd/user.conf 设置如 DefaultLimitNOFILE=655360,影响所有服务(需重启或重新登录)。
  • 提示:提升 nofile 等限制会占用更多系统资源,请根据硬件与业务规模谨慎调整。

0