nginx 限速限流配置示例
并发连接限制 : limit_conn_module
请求频率限制 : limit_req_module
限制用户和服务器之间传输的字节数,最常用的场景可能就是下载/上传限速: limit_rate
limit_req_zone
语法:limit_req_zone key zone=name:size rate=rate;
只能在http块中使用
此指令用于声明请求限制zone,zone可以保存各种key的状态,name是zone的唯一标识,size代表zone的内存大小,rate指定速率限制。
参数详解:
1.key,
若客户的请求匹配了key,则进入zone。可以是文本、变量,通常为Nginx变量。
如$binary_remote_addr(客户的ip),$uri(不带参数的请求地址),$request_uri(带参数的请求地址),$server_name(服务器名称)。
支持组合使用,使用空格隔开。
2.zone
使用zone=test,指定此zone的名字为test。
3.size
在zone=name后面紧跟:size,指定此zone的内存大小。如zone=name:10m,代表name的共享内存大小为10m。通常情况下,1m可以保存16000个状态。
4.rate
使用rate=1r/s,限制平均1秒不超过1个请求。使用rate=1r/m,限制平均1分钟不超过1个请求。
http { log_format main '$remote_addr - $remote_user [$time_local] "$request"' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" ' 'ups_resp_time: $upstream_response_time' 'request_time: $request_time'; server_tokens off; fastcgi_intercept_errors on; server_names_hash_bucket_size 24; client_header_buffer_size 8k; large_client_header_buffers 4 32k; include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; tcp_nodelay on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; client_body_buffer_size 128k; client_max_body_size 10m; proxy_connect_timeout 30; proxy_read_timeout 30; proxy_send_timeout 30; proxy_buffer_size 16k; proxy_buffers 4 64k; proxy_busy_buffers_size 128k; proxy_temp_file_write_size 128k; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 4; gzip_vary on; vhost_traffic_status_zone; vhost_traffic_status_filter_by_host on; limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m; limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; limit_traffic_rate_zone rate $remote_addr 32m; server { listen 80; server_name localhost; charset utf-8; add_header X-Frame-Options "DENY"; add_header X-XSS-Protection "1;mode=block"; add_header X-Content-Type-Options "nosniff"; if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})") { set $year $1; set $month $2; set $day $3; set $hour $4; set $minutes $5; set $seconds $6; } access_log logs/$year-$month-$day-$hour-access.log main; location / { limit_conn perip 50; limit_conn perserver 100; limit_req zone=one burst=5 nodelay; limit_rate_after 500k; ## 当请求的流量超500KB后进行限速 limit_rate 50k; ## 限速 50KB/s limit_traffic_rate rate 100k; root html; index index.html index.htm; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }

浙公网安备 33010602011771号