要实现的目的:
- 根据url将请求划分为不同的instances,proxy到不同的upstream 后端
- 使用_app_server 直接将请求proxy到指定的节点
大致配置结构如下:
$ cat rickon.conf
include rickon.upstream;
server {
...
include rickon.locations;
}
$ cat rickon.proxy
set $appname rickon;
set $instance default;
if ($uri ~ ^/_web/(foo|bar)/$) {
set $instance _admin;
}
...
$ cat rickon.locations
location / {
include rickon.proxy;
proxy_pass http://nodes_rickon;
if ( $arg__app_server = "nain5" ) {
proxy_pass http://nain5:7300;
}
if ( $arg__app_server = "nain4" ) {
proxy_pass http://nain4:7300;
}
}
这是原始配置,不带instance支持,可以正常proxy,_app_server 也可以工作
尝试1:
加上instance支持
$ cat rickon.locations
location / {
include rickon.proxy;
proxy_pass http://nodes_rickon-${instance};
if ( $arg__app_server = "nain5" ) {
proxy_pass http://nain5:7300;
}
if ( $arg__app_server = "nain4" ) {
proxy_pass http://nain4:7300;
}
}
nodes_rickon, nodes_rickon-default, nodes_rickon-_admin都在rickon.upstream中有定义。
该配置正常的请求可以工作。但是?_app_server=nain5不工作,请求有时候也会被分配到nain4上
尝试2:
使用set变量的方式,使整个location指令只有一个proxy_pass
location / {
include rickon.proxy;
set $upstream nodes_rickon-${instance};
if ( $arg__app_server = "nain5" ) {
set $upstream "nain5:7300";
}
if ( $arg__app_server = "nain4" ) {
set $upstream "nain4:7300";
}
proxy_pass http://$upstream;
}
正常的请求可以proxy,但是?_app_server=nain5,就会报如下错误:
2014/02/18 18:23:25 [error] 10389#0: *2157808548 no resolver defined to resolve nain5, client: 192.168.32.6 ...
貌似proxy_pass 没有把 http://nain5:7300 解析为host地址。
看到这篇帖子 https://www.ruby-forum.com/topic/1084244 ,outer scope 的 proxy_pass 不会被执行,但是上面的报错是谁抛出的呢?
对if和proxy_pass之间的关系不是很理解,请各位不吝赐教,多谢多谢。