我的 nginx.conf 中对主机和 IP 都有全局速率限制。然而,有一个特定位置我想忽略这些限制,就像这样。
limit_req_zone $binary_remote_addr zone=limitip:10m rate=10r/s;
limit_req_zone $host zone=limithost:10m rate=10r/s;
server {
limit_req zone=limitip burst=5 nodelay;
limit_req zone=limithost burst=5 nodelay;
location /whitelisted_location {
/* ignore the server limits */
}
}
创建两个具有很高价值的新区域并在该位置内使用它们的最佳方法是吗?
@agentshowers,您可能可以在此主题中找到如何做到这一点的想法。
实际上,我们这样做的方式如下:
# Defining which limit zone to use (per URL)
map $request_uri $pb_limit_req_zone {
"~^/files(/.*)?" "files";
"~^/secret/health-check$" "healthchecks";
default "common";
}
# Define the key per zone name
map $pb_limit_req_zone $limit_req_key_files {
default "";
"files" $binary_remote_addr;
}
map $pb_limit_req_zone $limit_req_key_common {
default "";
"common" $binary_remote_addr;
}
map $pb_limit_req_zone $limit_req_key_healthchecks {
default "";
"healthchecks" $binary_remote_addr;
}
# Defining the zones
limit_req_zone $limit_req_key_files zone=pb-frontend-files:20m rate=10r/s;
limit_req_zone $limit_req_key_common zone=pb-frontend-common:20m rate=25r/s;
limit_req_zone $limit_req_key_healthchecks zone=pb-frontend-healthchecks:20m rate=100r/s;
...
...
server {
...
location / {
# Rate Limit settings
limit_req_dry_run off;
limit_req zone=pb-frontend-files burst=1 delay=10;
limit_req zone=pb-frontend-common delay=10;
limit_req zone=pb-frontend-healthchecks burst=50 delay=10;
limit_req_status 429;
try_files $uri $uri/ /index.php?$query_string;
}
...
...
# Pass all .php files to a php-fpm/php-fcgi server.
location ~ [^/]\.php(/|$) {
# Rate Limit settings
limit_req_dry_run off;
limit_req zone=pb-frontend-files burst=1 delay=10;
limit_req zone=pb-frontend-common delay=10;
limit_req zone=pb-frontend-healthchecks burst=50 delay=10;
limit_req_status 429;
...
...
}
}
关于@andrey的回答。如果您想避免多个位置块或正在使用 https://github.com/nginx-proxy/nginx-proxy 这会迫使您进入特定的配置结构,那么它可以更紧凑一点。
map $request_uri $my_limit_req_zone {
"~^/(css|js|fonts)" "";
"~^/pic" "media-${binary_remote_addr}";
default "${binary_remote_addr}";
}
limit_req_zone $my_limit_req_zone zone=mylimit.tld_sec:10m rate=1r/s;
limit_req_zone $my_limit_req_zone zone=mylimit.tld_min:10m rate=45r/m;
server {
location {
limit_req zone=mylimit.tld_sec burst=10 nodelay;
limit_req zone=mylimit.tld_min burst=10 nodelay;
// proxy_pass etc
}
}
最终的速率限制器的性能尚不清楚,可能比其他解决方案更差。