所以,这是我的情况。我有一个网站,它有一些来自单独的上游应用程序的自定义逻辑。我现在有这个工作没有问题,虽然我的直接解决方案有点冗长。我将很快添加更多这些自定义位置,并添加以大写和低位访问这些位置的功能。我的解决方案可行,但位置列表很快就会变得笨拙,我想重新考虑我的解决方案。
所以,我们假设我的上游被称为“myupstream”,并且已在文件中定义。我的自定义位置将分别为一,二,三和四。 (实际位置名称因自身保护而改变)。
所以这些网址:
http://mysite/one http://mysite/two http://mysite/three http://mysite/four
在我的nginx.conf中:
location /one {
log_request_speed_filter on;
log_request_speed_filter_timeout 1000;
proxy_pass http://myupstream/one;
proxy_set_header Host $http_host;
}
location /two {
log_request_speed_filter on;
log_request_speed_filter_timeout 1000;
proxy_pass http://myupstream/two;
proxy_set_header Host $http_host;
}
…
etc.
除了位置名称外,所有位置都相同。
现在,这些地点的数量现在很少,但可能会增加到几十个。然后,添加以大写和小写访问位置的功能。所以:
http://mysite/one http://mysite/ONE http://mysite/two http://mysite/TWO 等...
如果我有20个位置,使用我当前的策略,我将在我的nginx.conf中创建40个不同的位置块。所以,我一直在寻找一种更有活力的方式。有点像:
location /(one|two|three) {
log_request_speed_filter on;
log_request_speed_filter_timeout 1000;
proxy_pass http://myupstream/$1;
proxy_set_header Host $http_host;
}
当然,我希望它只适用于特定的条目,因此一个广泛的开放规则是行不通的。另外,我也想检测大写,但是当调用上游时,它需要是小写的。例如:
location /ONE {
log_request_speed_filter on;
log_request_speed_filter_timeout 1000;
proxy_pass http://myupstream/one;
proxy_set_header Host $http_host;
}
问题1:
在nginx中有更好的方法吗?怎么样?
问题2:
哪种方式更有资源/流程效率?
提前谢谢..
答案 0 :(得分:2)
使用不区分大小写的location匹配:
location ~* /(one|two|three) {
log_request_speed_filter on;
log_request_speed_filter_timeout 1000;
proxy_pass http://myupstream/$1;
proxy_set_header Host $http_host;
}
还有另一种方法 - 使用模板:
<强> /etc/nginx/host.tmpl
强>
log_request_speed_filter on;
log_request_speed_filter_timeout 1000;
proxy_pass http://myupstream/$host_loc;
proxy_set_header Host $http_host;
<强> /etc/nginx/vhost.d/somehost.conf
强>
location /one {
set $host_loc "one";
include host.impl;
}
注意,Nginx不支持位置URI中的变量。
我建议您对不同的配置进行基准测试,以便选择最有效的配置。
修改的
如果您想将/FOUR
次请求传递给http://myupstream/four
以及
/FoUr
请求http://myupstream/four
,然后您应该使用。{
模块,例如Perl module,因为Nginx目前没有用于小写URI版本的内置变量,或者用于将位置URI转换为小写的内置函数。
<强> /etc/nginx/nginx.conf
强>
http {
perl_set $uri_lc 'sub { return lc shift->uri; }';
}
在子程序中,我们:
shift
; shift->uri
; lc
function并返回结果结果分配给$uri_lc
Nginx变量。
<强> /etc/nginx/vhost.d/somehost.conf
强>
location ~* ^/(one|two|three)$ {
log_request_speed_filter on;
log_request_speed_filter_timeout 1000;
proxy_pass http://myupstream$uri_lc;
proxy_set_header Host $http_host;
}
标记^
(开始)和$
(结束)很重要。