nginx的TCP代理限速
使用nginx的四层网络代理达到限制连接数以及限制带宽;使用以下模块
ngx_http_geo_module
ngx_stream_proxy_module
ngx_http_limit_conn_module
点击查看代码
stream {
log_format tcp-proxy '$remote_addr - [$time_local] ' #自定义代理日志格式 tcp-proxy
'$protocol $status $bytes_sent $bytes_received '
'$session_time "$upstream_addr" '
'"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time" '
'$remote_addr $remote_port $server_addr $server_port';
error_log /var/log/nginx/proxy_error.log;
access_log /var/log/nginx/proxy_access.log tcp-proxy; #指定tcp-proxy日志格式输出日志
limit_conn_zone $binary_remote_addr zone=addr:10m; #binary_remote_addr 是nginx获取客户端IP地址
limit_conn_log_level error; #定义限制连接日志
geo $binary_remote_addr $slow { # $slow非nginx自带的变量,需要根据ngx_http_geo_module模块自带的geo指令来定义$slow变量
default 1; # $binary_remote_addr是nginx自带变量,geo指令拿到这个变量对应的IP地址去和下面default或者 192.168.1.2匹配,如果满足$binary_remote_addr = 192.168.1.2,则把$slow变量设置为1,否则使用default的默认值为1。再拿$slow的值去以下map函数里匹配得到$rate,最后再使用到proxy_upload_rate中应用$rate来达到限制速度的要求
192.168.1.2 0; # 如果满足$binary_remote_addr = 192.168.1.2 则设置$slow为 0
}
map $slow $rate { #根据$slow的值来设置$rate的值,如果$slow的值为1 则$rate的变量值为500k
1 500k;
2 2k;
}
server {
listen 8888;
proxy_pass 172.20.16.233:22;
limit_conn addr 1;
proxy_upload_rate $rate; # 限制上传速度
proxy_download_rate $rate; #限制下载速度
}
}
参考文献
https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_upload_rate
https://www.cnblogs.com/ltzhang/p/13544562.html