Nginx 提供了多种方式来限制客户端连接数,防止服务器过载或被恶意攻击。以下是几种主要的连接数限制方法:
使用 ngx_http_limit_conn_module
模块可以限制单个IP地址的连接数。
http {
# 定义共享内存区域和键值
limit_conn_zone $binary_remote_addr zone=perip:10m;
server {
location / {
# 限制每个IP同时只能有10个连接
limit_conn perip 10;
# 当超过限制时返回的状态码(默认503)
limit_conn_status 429;
# 可选:限制日志级别
limit_conn_log_level warn;
}
}
}
虽然主要限制请求速率,但也可以间接控制连接数:
http {
limit_req_zone $binary_remote_addr zone=perip_req:10m rate=10r/s;
server {
location / {
# 限制每个IP每秒10个请求
limit_req zone=perip_req burst=20 nodelay;
# 超过限制时返回的状态码
limit_req_status 429;
}
}
}
http {
# 限制worker进程的总连接数
worker_connections 1024;
# 限制单个server的总连接数
server {
listen 80;
server_name example.com;
# 限制该server的总连接数为1000
max_connections 1000;
}
}
http {
limit_conn_zone $binary_remote_addr zone=download:10m;
server {
location /download/ {
# 限制/download/路径下每个IP只能有1个连接
limit_conn download 1;
# 限制下载速度为50KB/s
limit_rate 50k;
}
}
}
http {
# 定义共享内存区域
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_req_zone $binary_remote_addr zone=perip_req:10m rate=5r/s;
server {
listen 80;
server_name example.com;
# 全局限制
limit_conn perip 20;
limit_req zone=perip_req burst=10 nodelay;
location /api/ {
# API接口更严格的限制
limit_conn perip 5;
limit_req zone=perip_req burst=5;
}
location /static/ {
# 静态资源不限制连接数但限制带宽
limit_rate_after 1m;
limit_rate 100k;
}
}
}
limit_conn_zone
需要在 http 上下文中定义$server_name
或 $host
作为限制键这些方法可以单独使用,也可以组合使用,根据实际业务需求和安全要求进行配置。