现在网站一般都采用user-waf→源站的访问模式,或者采用user→cdn-源站的模式,$remote_addr将获取到的IP是waf或者cdn的IP而不是真实的用户IP。$http_x_forwarded_for才是用户的真实IP地址。哪么相关的策略都应该针对$http_x_forwarded_for展开。
一、未使用WAF、CDN的情况下
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
## 用户的 IP 地址 $binary_remote_addr 作为 Key,每个 IP 地址最多有 50 个并发连接 ## 你想开 几千个连接 刷死我? 超过 50 个连接,直接返回 503 错误给你,根本不处理你的请求了 limit_conn_zone $binary_remote_addr zone=TotalConnLimitZone:10m ; limit_conn TotalConnLimitZone 50; limit_conn_log_level notice; ## 用户的 IP 地址 $binary_remote_addr 作为 Key,每个 IP 地址每秒处理 10 个请求 ## 你想用程序每秒几百次的刷我,没戏,再快了就不处理了,直接返回 503 错误给你 limit_req_zone $binary_remote_addr zone=ConnLimitZone:10m rate=10r/s; limit_req_log_level notice; ## 具体服务器配置 server { listen 80; location ~ \.php$ { ## 最多 5 个排队, 由于每秒处理 10 个请求 + 5个排队,你一秒最多发送 15 个请求过来,再多就直接返回 503 错误给你了 limit_req zone=ConnLimitZone burst=5 nodelay; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; } } |
二、使用WAF、CDN的情况下
0 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 |
## 这里取得原始用户的IP地址 map $http_x_forwarded_for $clientRealIp { "" $remote_addr; ~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr; } ## 针对原始用户 IP 地址做限制 limit_conn_zone $clientRealIp zone=TotalConnLimitZone:20m ; limit_conn TotalConnLimitZone 50; limit_conn_log_level notice; ## 针对原始用户 IP 地址做限制 limit_req_zone $clientRealIp zone=ConnLimitZone:20m rate=10r/s; #limit_req zone=ConnLimitZone burst=10 nodelay; #如果开启此条规则,burst=10的限制将会在nginx全局生效 limit_req_log_level notice; ## 具体Server:如下在监听php部分新增限制规则即可 server { listen 80; location ~ \.php$ { ## 最多 5 个排队, 由于每秒处理 10 个请求 + 5个排队,你一秒最多发送 15 个请求过来,再多就直接返回 503 错误给你了 limit_req zone=ConnLimitZone burst=5 nodelay; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; } } |
三、其他方法
四、备注说明
01234567 配置内容:rate=5r/s; burst=1 nodelay; #表示1秒最多允许6个并发压测结果:Time taken for tests: 3.174 secondsComplete requests: 10000Failed requests: 9983测试计算:3.174 * 5 + 1 = 16.87 ≈ 17 【10000 - 9983 = 17】
SourceByrd's Weblog-https://note.t4x.org/environment/nginx-waf-restrict-concurrent-access/
01234567 配置内容:rate=25r/s; burst=100 nodelay;压测结果:Time taken for tests: 3.232 secondsComplete requests: 10000Failed requests: 9819测试计算:3.232 * 25 + 100 = 180.8 ≈ 181 【10000 - 9819 = 181 】
参考文档:
1:http://www.bzfshop.net/article/176.html
2:https://zhangge.net/4879.html
3:https://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_limit_conn_module.html
4:https://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_limit_req_module.html
5:http://www.ttlsa.com/nginx/nginx-limited-connection-number-ngx_http_limit_conn_module-module/
6:http://www.ttlsa.com/nginx/nginx-limiting-the-number-of-requests-ngx_http_limit_req_module-module/SourceByrd's Weblog-https://note.t4x.org/environment/nginx-waf-restrict-concurrent-access/
SourceByrd's Weblog-https://note.t4x.org/environment/nginx-waf-restrict-concurrent-access/