我有一个配置的nginx服务器使用queryparam作为上游哈希。网址如下所示
http://www.my-server.com/xyz/WXYZ?abc=123
配置如下
upstream test {
hash $arg_abc;
....
}
是否有可能使用WXYZ
部分URL作为上游哈希?
WXYZ
是动态值,xyz
始终相同,并且会在那里。
这就是我试过的,
location ~ ^/xyz/(.).*$ {
hash $1
}
答案 0 :(得分:6)
The deployment guide明确表示可能:
通用哈希方法:发送请求的服务器是 从用户定义的键确定,该键可以是文本,变量或 他们的组合。例如,密钥可以是源IP和端口, 或URI:
upstream backend {
hash $request_uri consistent;
server backend1.example.com;
server backend2.example.com;
}
哈希键是 $ request_uri ,可以用 $ arg_your_key 替换,但不确定是否适用于上游块,但它应该作为proxy_pass值工作:
location /xyz {
proxy_pass http://localhost/$uri$is_args$args;
}
不确定要求,但如果您需要根据参数 $ arg_abc 使用某个后端,则需要地图功能,例如here:
map $arg_abc $backend_server {
default 'serverdefault.domain.com:80';
123 'server1.domain.com:80';
234 'server2.domain.com:80';
345 'server3.domain.com:80';
}
server {
location / {
proxy_pass http://$backend_server;
}
}
答案 1 :(得分:2)
是的,根据hash
的文档,您只能在upstream
上下文中使用它,因此您尝试的内容确实无效。
但是,如果其他部分保持不变,为什么你只需要使用URI中的某个路径而不是整个路径?我认为这个想法是整个字符串应该进一步散列,所以,即使你的所有URL都开始相同,哈希函数仍然应该均匀地分配所有内容。因此,您很可能只使用$request_uri
或$uri
作为哈希。
或者,如果您仍想按照自己的方式进行操作,可以尝试在location
(location ~ ^/xyz/(?<varForHash>.).*$ {…
)中使用命名模式匹配,然后使用此类匹配中的变量({{1 }})你的$varForHash
(你甚至可以在你的例子中使用hash
,只是在正确的背景下 - $1
)。
答案 2 :(得分:1)
我有类似的任务,我解决了它。 我创建了upstream.conf并将其添加到nginx.conf中。 upstream.conf内容如下:
<amp-state id="product">
<script type="application/json">
{
"page": 0
}
</script>
</amp-state>
<amp-state id="productState"
[src]="'localhost/example/data?page=' + product.page"
src="localhost/example/data?page=0"></amp-state>
<div role="button" tabindex="0" on="tap:AMP.setState({product: {page: 1 }})">
<span>Page One</span>
</div>
<div role="button" tabindex="0" on="tap:AMP.setState({product: {page: 2 }})">
<span>Page Two</span>
</div>
<amp-list width="auto" height="1024" layout="fixed-height"
src="localhost/example/data" [src]="productState.items">
<template id="product-item-template">
<!-- A template -->
</template>
</amp-list>