nginx限流怎么使用

nginx限流怎么使用
最新回答
淺笑ペ安然

2026-03-20 00:18:25

Nginx 限流功能主要通过 ngx_http_limit_conn_module(连接数限制)和 ngx_http_limit_req_module(请求速率限制)两个模块实现。以下是具体使用方法:

一、连接数限制(ngx_http_limit_conn_module)1. 启用模块

在 nginx.conf 主配置文件中加载模块(若编译时已内置则无需单独加载):

load_module modules/ngx_http_limit_conn_module.so;2. 配置限流规则

在 http 块中定义共享内存区域(存储客户端状态):

http { limit_conn_zone $binary_remote_addr zone=mylimit:10m; # $binary_remote_addr:客户端IP(二进制格式节省空间) # zone=mylimit:10m:名为"mylimit"的共享内存区,大小10MB(约可存储16万个IP状态)}3. 应用限流规则

在 server 或 location 块中限制并发连接数:

server { location / { limit_conn mylimit 20; # 每个IP最多允许20个并发连接 # 超出限制的请求返回503错误 }}4. 自定义错误页面(可选)error_page 503 /custom_503.html;location = /custom_503.html { root /path/to/error_pages; internal;}二、请求速率限制(ngx_http_limit_req_module)1. 启用模块load_module modules/ngx_http_limit_req_module.so;2. 配置限流规则

在 http 块中定义共享内存区域和速率:

http { limit_req_zone $binary_remote_addr zone=reqlimit:10m rate=10r/s; # rate=10r/s:每个IP每秒最多10个请求(支持r/m或r/h)}3. 应用限流规则

在 server 或 location 块中限制请求速率:

location /api { limit_req zone=reqlimit burst=20 nodelay; # burst=20:允许突发超出20个请求(排队等待) # nodelay:不延迟处理,立即返回503(若未配置则排队等待)}三、完整示例配置http { # 连接数限制配置 limit_conn_zone $binary_remote_addr zone=connlimit:10m; # 请求速率限制配置 limit_req_zone $binary_remote_addr zone=reqlimit:10m rate=5r/s; server { listen 80; server_name example.com; location / { # 连接数限制:每个IP最多10个并发连接 limit_conn connlimit 10; # 请求速率限制:每秒5个请求,突发20个,不延迟 limit_req zone=reqlimit burst=20 nodelay; # 自定义错误页面 error_page 503 /50x.html; } location = /50x.html { root /usr/share/nginx/html; } }}四、关键参数说明
  • 共享内存大小:如 10m,需根据实际IP数量调整(约1MB存储1.6万个IP状态)。
  • burst参数:允许短暂超出速率限制的请求数,超出部分返回503或排队。
  • nodelay:禁用排队,直接拒绝超出速率的请求。
  • $binary_remote_addr:比 $remote_addr 更节省内存。
五、注意事项
  1. 模块依赖:确保Nginx编译时包含 --with-http_limit_conn_module 和 --with-http_limit_req_module。
  2. 动态调整:限流规则需通过重载配置生效(nginx -s reload)。
  3. 日志监控:通过访问日志分析 503 错误,优化限流阈值。
  4. 组合使用:可同时启用 limit_conn 和 limit_req 实现多维度限制。

通过以上配置,Nginx可以有效防止恶意请求或突发流量导致的服务器过载,保障服务稳定性。