温馨提示×

Ubuntu LNMP如何实现流量控制

小樊
44
2025-11-24 13:52:31
栏目: 智能运维

Ubuntu LNMP流量控制实战

一、控制维度与适用场景

  • 速率限制:限制单个客户端单位时间的请求数,平滑突发流量,保护后端(如 PHP-FPM)。
  • 并发连接限制:限制单个客户端或虚拟主机的并发连接数,防止连接洪泛。
  • 带宽限速:限制响应体发送速率,常用于下载目录或接口返回大文件场景。
  • 边界与系统层控制:用 UFW 做端口/IP 白名单,用系统/内核参数提升可承载连接数。

二、Nginx层限流配置示例

  • 在 http 段定义共享内存区与规则(作用于全局或继承到 server/location):
http {
    # 每个 server_name 的并发连接数(示例上限 100)
    limit_conn_zone $server_name zone=perserver:10m;
    # 每个客户端 IP 的并发连接数(示例上限 10)
    limit_conn_zone $binary_remote_addr zone=peraddr:10m;
    # 每个客户端 IP 的请求速率(示例 5 请求/秒,突发 10,不延迟处理突发)
    limit_req_zone $binary_remote_addr zone=perreq:10m rate=5r/s;

    server {
        listen 80;
        server_name example.com;

        # 对整站应用速率与并发限制
        limit_req zone=perreq burst=10 nodelay;
        limit_conn peraddr 10;
        limit_conn perserver 100;

        # 对下载目录按 IP 限速(示例 200 KB/s)
        location /download/ {
            alias /var/www/download/;
            limit_conn peraddr 5;              # 下载并发更严
            limit_rate 200k;                   # 带宽限速
            limit_rate_after 1m;               # 先放行 1MB 再限速(可选)
        }

        # 对 PHP 动态请求单独限流(示例 3 请求/秒,突发 5)
        location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass 127.0.0.1:9000;     # 或 unix:/run/php/phpX.Y-fpm.sock
            limit_req zone=perreq burst=5 nodelay;
        }
    }
}
  • 说明
    • 速率限制使用 limit_req_zone + limit_req;并发连接使用 limit_conn_zone + limit_conn;带宽限速使用 limit_rate/limit_rate_after
    • 突发队列与 nodelay 的组合可平滑突发而不丢弃合法请求(超出速率的请求会占用队列或直接拒绝,取决于配置)。

三、生效与验证

  • 语法检查与热加载
sudo nginx -t
sudo systemctl reload nginx
  • 验证方法
    • 速率/并发:使用 abwrkjmetercurl 并发压测,观察返回码(如 429 表示触发速率限制)、响应时延与是否被限速。
    • 带宽限速:在下载目录放置大文件,用浏览器或命令行工具(如 curl)下载,观察实际速率是否接近 limit_rate 设定值。

四、边界与系统层补充

  • 防火墙与访问控制(UFW)
    • 仅放行业务与运维所需端口,并对敏感端口(如 22/SSH)做来源 IP 白名单:
sudo apt update && sudo apt install -y ufw
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow from <你的IP> to any port 22
sudo ufw enable
sudo ufw status
  • 系统/内核与连接承载能力
    • 提升文件描述符与内核网络参数,配合 Nginx 的并发能力(示例思路):
# /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535

# /etc/sysctl.conf(按需调整)
net.core.somaxconn = 65535
net.ipv4.tcp_tw_reuse = 1
  • 修改后执行 sudo sysctl -p 生效。该步骤可缓解高并发下的 “Too many open files” 与连接排队问题。

五、进阶与排错建议

  • 粒度与策略
    • 将更严格的规则放在更具体的 location(如下载目录、管理后台),对静态资源可适当放宽或交由 CDN
    • 对 API 与静态资源使用不同的 limit_req_zone/limit_conn_zone,避免“一刀切”。
  • 观测与调优
    • 结合 Nginx 访问日志/错误日志 与压测结果逐步微调 rate、burst、limit_conn、limit_rate 参数。
    • 若使用 CDN,请在 CDN 侧配置速率/并发与 WAF 策略,源站仅作为回源控制兜底。

0