拒绝非指定ip,使用的ip访问
# 拒绝非指定ip,使用ip或<不在其他server_name范围内的域名>访问
server {
listen 80 default_server;
listen [::]:80 default_server;
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
http2 on;
# 证书文件随便配置个即可,如果不配置ssl证书字段会报[emerg]
ssl_certificate cert/y.z-crt.pem;
ssl_certificate_key cert/y.z-key.pem;
server_name "";
if ($time_iso8601 ~ "^(\d{4})-(\d{2})") {
set $year $1;
set $month $2;
}
access_log logs/access-$year$month-Other.log main;
#return 301 http://y.z;
location / {
allow 1.1.1.1;
allow 2.2.2.2;
# 其他ip访问提示403
deny all;
root html;
index index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
限制单个IP的并发连接数和时间段内请求处理数
1、结合业务,谨慎使用,避免限制配置上线后,业务反而出问题,或者只使用其中一个限制方式。
2、限速操作时,需要 limit_rate 和 limit_conn 模块联合起来使用才能达到限速的效果。
限制单个IP并发连接数
在http区域:
- 定义一个zone的名称与大小,用于存储会话的状态。key=$binary_remote_addr是 获取客户端ip地址的变量,为 IPv4 时占用 4B,为 IPv6 时占用 16B。
- 1MB 的内存空间可以存储 3.2W个 32B 或 1.6W个 64B 的变量计数状态,而变量计数状态在 32 位系统平台占用 32B 或 64B,在 64 位系统平台占用 64B。
limit_conn_zone key zone=name:size;
在http、server、location区域:
limit_conn zone number; # 一个会话的最大并发连接数
limit_conn_status code; # 可选,一个会话并发请求超过最大并发连接数,返回code,默认为503
limit_conn_log_level error; # 可选,默认为error,其他可选值info/notice/warn
示例
limit_conn_zone $binary_remote_addr zone=conn_addr:2m;
limit_conn conn_addr 2;
limit_conn_status 503;
限制单个IP某段时间内的请求处理数
在http区域:
- rate=1r/s 表示允许相同标识的客户端每秒1次,即每秒只处理一个请求;比如 30r/m 为每2秒才处理一个请求。
limit_req_zone key zone=name:size rate= number r/s;
在http、server、location:
- burst=5 为设置一个大小为5的缓冲区,当有大量请求过来时,超过访问频次限制 rate=1r/s 的请求可以先放到这个缓冲区内等待,但是这个缓冲区只有5个位置,超过这个缓冲区的请求直接报503并返回。
- nodelay:在瞬间提供处理(rate+burst)个请求的能力,请求超时(rat+burst)的时候直接返回503,永远不存在请求需要等待的情况。如果没有设置,则所有请求会依次等待排队;
limit_req zone=name [burst=number] [nodelay | delay=number];
limit_req_status code; # 可选,返回code,默认为503
limit_req_log_level error; # 可选,默认为error,其他可选值info/notice/warn
示例
limit_req_zone $binary_remote_addr zone=req_addr:2m rate=1r/s;
limit_req zone=req_addr burst=3 nodelay;
limit_req_status 503;
使用过的示例
# 开启限制单个IP最大并发连接数N,超过错误429;N在server中配置。
limit_conn_zone $binary_remote_addr zone=conn_addr:2m;
limit_conn_status 429;
# 开启限制单个IP每秒处理N次请求,超过错误504,区分上面的503;引用和缓存数在server中配置。
limit_req_zone $binary_remote_addr zone=defaul_req_addr:2m rate=2r/s;
limit_req_zone $binary_remote_addr zone=www_req_addr:2m rate=30r/s;
limit_req_zone $binary_remote_addr zone=rp_req_addr:2m rate=50r/s;
limit_req_status 504;
limit_conn conn_addr 1;
limit_req zone=defaul_req_addr;
limit_conn conn_addr 5;
limit_req zone=rp_req_addr;
limit_conn conn_addr 3;
limit_req zone=www_req_addr;
断点续传
Nginx 默认支持断点续传功能,无需额外配置。但如果你需要确保该功能正常工作,可以检查以下配置项:
# 确保支持 Range 请求,如果不支持断点续传,可以设置为 none。可配置区域 http/server/location
add_header Accept-Ranges bytes;
对于反向代理的断点续传,需要http_slice_module,可通过 nginx -V 查看是否支持。
# http 配置
proxy_cache_path /tmp/nginx/cache levels=1:2 keys_zone=cache:100m;
# location 配置
location / {
slice 1m;
proxy_cache cache;
proxy_cache_key $uri$is_args$args$slice_range;
proxy_set_header Range $slice_range;
proxy_cache_valid 200 206 1h;
#proxy_set_header Range $http_range;
proxy_pass http://127.0.0.1:8080;
}
发表回复