有时需要通过 Nginx 设置一些连接访问的限制,并且设置限制白名单,对客户端特定 IP 地址不做过滤。
要求
- ⭕设置 ip 白名单,需用到 nginx geo 与 nginx map
- ⭕nginx 默认加载了 ngx-http-geo-module 和 ngx-http-map-module 相关内容;
- ⭕ngx-http-geo-module 可以用来创建变量,变量值依赖于客户端 ip 地址;
- ⭕ngx-http-map-module 可以基于其他变量及变量值进行变量创建,其允许分类,或者映射多个变量到不同值并存储在一个变量中;
Nginx geo 格式说明
Syntax ( 语法格式 ): geo [$address] $variable { ... } Default ( 默认 ): - Content ( 配置段位 ): http Nginx map 格式说明 Syntax ( 语法格式 ): map String $variable { ... } Default ( 默认 ):- Content ( 配置段位 ): http
开启nginx连接限制
#对指定请求路径不设置限制,如对请求路径为api目录下的请求不做限制,则可写为 server{ location /app { proxy_pass http://192.168.1.111:8095/app; limit_conn conn 50; limit_rate 500k; limit_req zone=foo burst=5 nodelay; } location /app/api { proxy_pass http://192.168.1.111:8095/app/api } } # 因nginx会优先进行精准匹配,所以以上写法即接触了对api目录下属路径的限制
白名单配置示例
http{ # ... 其他配置内容 ################################## ## /etc/nginx/http.d/map.conf #定义白名单ip列表变量 geo $whiteiplist { default 1; 10.250.250.0/24 0; 127.0.0.1 0; } #使用map指令映射将白名单列表中客户端请求ip为空串 map $whiteiplist $limit{ 1 $binary_remote_addr ; 0 ""; } ################################## ## /etc/nginx/http.d/limit.conf ## 配置前端代理,获取客户端真实IP real_ip_header X-Forwarded-For; set_real_ip_from 139.219.193.17; #set_real_ip_from 0.0.0.0/0; #real_ip_recursive on; # $limit defined in /etc/nginx/http.d/map limit_conn_zone $limit zone=conn:30m; limit_conn_status 444; limit_conn_log_level info; limit_req_zone $limit zone=perip:30m rate=5r/s; limit_req_status 444; limit_req_log_level info; ################################## server{ location /app { ## 单IP同时连接数限制 limit_conn conn 5; ## 单IP单位时间内请求数限制 limit_req zone=perip burst=5 nodelay; ##每个请求最大传输速率 limit_rate 500k; proxy_pass http://192.168.1.111:8095/app; } } }
白名单配置可用于对合作客户,搜索引擎等请求过滤限制
特殊情况处理
#如果想仅限制指定的请求,如:只限制Post请求,则: http{ # 其他请求.. #请求地址map映射 map $request_method $limit { default ""; POST $binary_remote_addr; } #限制定义 limit_req_zone $limit zone=perip:20m rate=10r/s; server{ ... #与普通限制一致 limit_req zone=perip burst=5 nodelay; } } #在此基础上,想进行指定方法的白名单限制处理,则: http{ #... #定义白名单列表 map $whiteiplist $limitips{ 1 $binary_remote_addr; 0 ""; } #基于白名单列表,定义指定方法请求限制 map $request_method $limit { default ""; # POST $binary_remote_addr; POST $limitips; } #限制定义 limit_req_zone $limit zone=perip:20m rate=10r/s; #在server中进行引用 server{ #... 与普通限制相同 limit_req zone=perip burst=5 nodelay; } }
以上就是通过 Nginx 设置连接限制以及对限制规则设置白名单的范例。