关于ngx_http_limit_conn_module、ngx_http_limit_req_module 模块,echo(需要安装第三方模块 ngx_http_echo_module),map(默认安装了ngx_http_map_module),geo(默认安装了ngx_http_geo_module)指令请查看官方文档,这里不再赘述。
有四种情况:
- 不过CDN限速配置
- 过CDN限速配置
- 不用白名单的不过CDN
- 不用白名单的过CDN
首先说明一个问题: geo里面的IP可以是单个的,也可以是一个网段的,只要符合CIDR标准就行。 map里面的IP必须是当个,因为这里把他看着一个变量。 过CDN的白名单IP只需要客户端IP就行,CND不需要,客户端IP得一行一行写 不过CDN的白名单IP可以写一个网段 关键点limited为空时不走限速。有值的,这里white_ip为1,走限速。
测试方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| 可以通过echo模块查看到(这两个都是没有走CDN的): 虚拟主机里echo的配置如下 location /echo { default_type text/plain; echo http_x_forwarded_for: $http_x_forwarded_for; echo remote_addr: $remote_addr; echo firstAddr: $firstAddr; echo clientRealIp: $clientRealIp; echo white_ip: $white_ip; }
这个要限速,没有加入白名单 http://123.11.11.11/echo http_x_forwarded_for: remote_addr: 59.12.13.14 firstAddr: clientRealIp: 59.12.13.14 white_ip: 1 limited: 59.12.13.14
这个不限速,加入了白名单 http://123.11.11.11/echo http_x_forwarded_for: remote_addr: 114.11.183.6 firstAddr: clientRealIp: 114.11.183.6 white_ip: 0 limited:
|
具体配置
- 不过CDN限速配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| nginx.conf里面的配置 geo $white_ip { default 1; 127.0.0.1 0; 59.12.13.14 0; 61.11.12.0/24 0; ...... }
map $white_ip $limited { 1 $binary_remote_addr; 0 ""; }
limit_conn_zone $limited zone=addr:10m; limit_req_zone $limited zone=one:10m rate=50r/s; limit_req_log_level info; limit_conn_log_level info;
具体域名vhosts配置文件里面的应用 location / { limit_req zone=one burst=5 nodelay; limit_conn addr 100; proxy_pass http://my_test_com; }
|
- 过CDN限速配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| nginx.conf里面的配置 map $http_x_forwarded_for $clientRealIpnormal { "" $remote_addr; ~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr; }
map $http_http_cdn_src_ip $clientRealIp{ "" $clientRealIpnormal; default $http_http_cdn_src_ip; }
map $clientRealIp $white_ip { default 1; 127.0.0.1 0; 59.12.13.14 0; ......
}
map $white_ip $limited { 1 $clientRealIp; 0 ""; }
limit_conn_zone $limited zone=addr:10m; limit_req_zone $limited zone=one:10m rate=30r/s; limit_req_zone $limited zone=two:10m rate=20r/s; limit_req_log_level info; limit_conn_log_level info;
具体域名vhosts配置文件里面的应用 location / { limit_req zone=two burst=1 nodelay; proxy_pass http://mynew_test_com; }
|
- 不用白名单的不过CDN
1 2 3 4 5 6 7 8 9 10 11 12
| nginx.conf里面的配置 limit_conn_zone $binary_remote_addr zone=addr:10m; limit_req_zone $binary_remote_addr zone=one:10m rate=50r/s; limit_req_log_level info; limit_conn_log_level info;
具体域名vhosts配置文件里面的应用 location / { limit_req zone=one burst=5 nodelay; limit_conn addr 100; proxy_pass http://my_test_com; }
|
- 不用白名单的过CDN
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| nginx.conf里面的配置 map $http_x_forwarded_for $clientRealIp { "" $remote_addr; ~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr; }
limit_conn_zone $clientRealIp_addr zone=addr:10m; limit_req_zone $clientRealIp_addr zone=one:10m rate=50r/s; limit_req_log_level info; limit_conn_log_level info;
具体域名vhosts配置文件里面的应用 location / { limit_req zone=one burst=5 nodelay; limit_conn addr 100; proxy_pass http://my_test_com; }
|