ab -k -c 1000 -n 10000 site.com/
并行运行 1000 个请求,直到总共完成 10 000 个请求。
这也太残忍了吧客户端和服务器很可能都没有经过调整,无法在几秒钟内处理数千个连接。
调整nginx配置并进行温和测试ab -k -c 5 -n 500 site.com/
limit_req_zone $http_cf_connecting_ip zone=ip:10m rate=3r/s;
limit_req zone=ip;
limit_conn_status 429;
limit_req_status 429;
429 请求过多
这配置 nginx 返回标准状态代码429 请求过多 https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429当请求由于速率限制而被拒绝时。
nginx 返回一个503
默认错误(错误的默认值)意味着应用程序失败,但它并没有失败,而是受到速率限制。适当配置状态代码以区分服务器错误和速率限制非常重要。
Cloudflare 和客户端 IP
当在cloudflare后面时,nginx不会看到客户端的IP,而是看到cloudflare服务器的IP。人们可能会认为它打破了 IP 的速率限制,但实际上并没有,只是一点点。
使用 ab 进行本地测试时,您的测试计算机仅解析少数 cloudflare 服务器,并且ab
可能只使用第一个IP。因此,不存在大量客户端 IP,速率限制应该可以正常工作。
生产时,会有不同的客户端通过不同的cloudflare服务器访问。尽管如此,一个地理区域内并没有那么多的 cloudflare 服务器和客户端很可能会解析到相同的 cloudflare 服务器。因此,将会有一堆不同的 IP 在某种程度上打破了速率限制,但可能不会那么多。
> nslookup mycloudflaresite.com
Name: mycloudflaresite.com
Addresses: 104.28.14.125
104.28.15.125
2606:4700:3037::681c:e7d
2606:4700:3036::681c:f7d
Cloudflare 将原始客户端 IP 放入CF-Connecting-IP
header.它也可以在X-Forwarded-For
标头或X-Real-Ip
or True-Client-IP
取决于设置和要求。看https://support.cloudflare.com/hc/en-us/articles/200170986-How-does-Cloudflare-handle-HTTP-Request-headers- https://support.cloudflare.com/hc/en-us/articles/200170986-How-does-Cloudflare-handle-HTTP-Request-headers-
因此,上述配置使用客户端 IP 进行速率限制CF-Connecting-IP
标头。 nginx 变量$binary_remote_addr
将是 cloudflare 服务器 IP。
不使用X-Forwarded-For
达到速率限制
The X-Forwarded-For
header 可以由客户端控制。它不应该用于速率限制,因为它很容易规避。
具有 IP 的客户端的示例100.11.22.33
:
- 根据请求,无需
X-Forwarded-For
header => Cloudflare 集X-Forwarded-For: 100.11.22.33
and CF-Connecting-IP: 100.11.22.33
根据要求。
- 根据要求
X-Forwarded-For: dummyvalue
标头已设置 => CloudFlare 设置X-Forwarded-For: dummyvalue,100.11.22.33
and CF-Connecting-IP: 100.11.22.33
根据要求。
正如您所看到的,客户端为每个请求放置一个随机值并完全规避基于该值的任何速率限制是微不足道的X-Forwaded-For
标头。