我有一个应用程序可以对我的产品数据库进行全文搜索。某些搜索会向用户推荐,并且比其他搜索更常见。
由于全文搜索成本高昂,我使用 Nginx 来缓存搜索结果。我希望我的用户能够随意执行建议的常见搜索,因为这些搜索大多数时候都应该被缓存。但是,我想严格限制未缓存/不常见的搜索。
是否可以根据 Nginx 是否缓存资源来应用不同的速率限制?
答案1
我设法通过创建两个单独的 nginx 实例来禁用缓存资源的速率限制。第一个实例用于缓存请求,第二个用于限制请求速率。我被迫这样做是因为最近出现了问题https://search.maven.org。
缓存实例配置部分:
http {
proxy_cache_path /data/nginx/cache keys_zone=mavencache:100m max_size=100m inactive=144h;
server {
proxy_cache mavencache;
location / {
proxy_cache_valid 200 144h;
proxy_pass http://IP_ADDRESS_OF_THE_HOST_WITH_THE_RATE_LIMITING_INSTANCE:8080;
}
}
}
如果两个实例都在同一台服务器上,则 IP_ADDRESS_OF_THE_HOST_WITH_THE_RATE_LIMITING_INSTANCE 可以是 localhost。
限速实例部分配置如下:
http {
limit_req_zone global zone=maven:100m rate=1r/s;
server {
location / {
limit_req zone=maven burst=1000;
proxy_pass https://search.maven.org:443;
}
listen 8080;
listen [::]:8080;
}
}
现在,如果我创建一个未缓存的请求,缓存实例将调用速率限制实例,该实例将对该请求进行速率限制https://search.maven.org:443。如果我创建相同的请求,我将快速从缓存实例中获取它,而不受速率限制。
例子:
$ export MAVEN_CENTRAL_URL=http://192.168.122.176/solrsearch/select
$ time trivy i --clear-cache; time trivy i -s "MEDIUM,HIGH,CRITICAL" --debug logstash:7.0.0
real 2m5,127s
user 0m10,140s
sys 0m0,588s
$ time trivy i --clear-cache; time trivy i -s "MEDIUM,HIGH,CRITICAL" --debug logstash:7.0.0
real 0m7,938s
user 0m8,991s
sys 0m0,611s