如何在nginx中使用url pathname作为上游哈希

时间:2015-08-13 17:04:13

标签: nginx

我有一个配置的nginx服务器使用queryparam作为上游哈希。网址如下所示

http://www.my-server.com/xyz/WXYZ?abc=123

配置如下

upstream test {
    hash $arg_abc;
    ....
}

是否有可能使用WXYZ部分URL作为上游哈希?

WXYZ是动态值,xyz始终相同,并且会在那里。

这就是我试过的,

location ~ ^/xyz/(.).*$ {
   hash $1
}

3 个答案:

答案 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作为哈希。

或者,如果您仍想按照自己的方式进行操作,可以尝试在locationlocation ~ ^/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>