Nginx如何实现限流?

Nginx可以通过ngx_http_limit_conn_module和ngx_http_limit_req_module两个模块实现限流功能。限流主要用于:

  • 防止DDos攻击:限制每客户端的连接数与请求数,防止流量暴增。
  • 保护上游服务器:限制到上游服务器的请求流量,避免过载。
  • 应用级保护:限制到应用服务器的请求数,保证其正常运行。
ngx_http_limit_conn_module限制客户端连接数。语法:
limit_conn_zone $binary_remote_addr zone=addr:10m;

server {
  ...
  limit_conn addr 5;  # 限制每个IP的连接数为5
}
  • limit_conn_zone 定义共享内存区域,存储连接信息。
  • limit_conn 定义限制连接数的具体规则。
    ngx_http_limit_req_module限制客户端请求数。语法:
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;

server {
  ...
  limit_req zone=one burst=10; # 限制请求数为每秒5个,突发值为10
}
  • limit_req_zone 定义共享内存区域以及限速规则。rate设置速率,r/s代表每秒请求数。
  • limit_conn 定义将请求限速规则应用于哪个zone。burst设置突发值,超过速率时允许的最大请求数。
    例如:
# 限制每个IP的连接数为100 
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;  
limit_conn conn_limit 100;   

# 限制每个IP的请求数为每秒20个,突发值为50
limit_req_zone $binary_remote_addr zone=req_limit:10m  rate=20r/s;
limit_req zone=req_limit  burst=50; 

这种方式可以有效的保护Nginx免受DDos攻击与流量暴增的影响,实现稳定高效的服务能力。