动态设置upstream header

129 views
Skip to first unread message

汪志鹏

unread,
Jul 19, 2019, 5:33:18 AM7/19/19
to openresty
Hi, 各位好:

   我们有个需求是通过openretry(入口必须是IP)转发流量到后端的X组服务上。后端每组服务必须通过域名访问,每组服务IP是相同的。


upstream大概如下:

upstream app {
    server www.a.com; # ip 1.1.1.1
    server www.b.com; # ip 1.1.1.1
    server www.c.com; # ip 1.1.1.2
    server www.d.com; # ip 1.1.1.2
.....
}

有没有什么方法可以获取到upstream选定server后对应的域名, 然后set header Host

我们本身也进行了很多测试,  set header Host必须在content_generated_by?之前进行。但是在之前又获取不到当前的ngx.var.upstream_addr以及current_upstream_name、upstream.get_primary_peers等信息

DeJiang Zhu

unread,
Jul 19, 2019, 12:17:22 PM7/19/19
to open...@googlegroups.com
有一个思路,你可以参考下

1. proxy_set_header Host $my_host;
2. 在 rewrite_by_lua 里计算下,得到本次上游的地址,同时设置 $my_host
3. 在 balancer_by_lua 里 set_current_peer 指定上游地址(这一步也不是必须,不过,如果不这么改,就可能你有两个选取上游的逻辑了)

汪志鹏 <yannan...@gmail.com> 于2019年7月19日周五 下午5:33写道:
--
--
邮件来自列表“openresty”,专用于技术讨论!
订阅: 请发空白邮件到 openresty...@googlegroups.com
发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 openresty+...@googlegroups.com
归档: http://groups.google.com/group/openresty
官网: http://openresty.org/
仓库: https://github.com/agentzh/ngx_openresty
教程: http://openresty.org/download/agentzh-nginx-tutorials-zhcn.html
---
您收到此邮件是因为您订阅了Google网上论坛上的“openresty”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到openresty+...@googlegroups.com
要在网络上查看此讨论,请访问https://groups.google.com/d/msgid/openresty/1b12b497-c486-462e-b8a1-bf5f7dcbb612%40googlegroups.com

汪志鹏

unread,
Jul 19, 2019, 11:23:56 PM7/19/19
to openresty
如果在rewrite只能获取到原始的upstream列表(是包含域名的), 获取不到primary_peers。而且第三个步骤也是必须的。因为上游有多个IP,所以必须把peer设置为对应的ip地址。目前我们是临时在本地起多个server(每个后端一个,监听127以及不同端口,这样的话各自设置各自的host) 然后把入口的upstream改成这些server。

上面说的这只是一个临时的方案,不知还有没有别的"优雅"的解决方案。

在 2019年7月20日星期六 UTC+8上午12:17:22,doujiang写道:
有一个思路,你可以参考下

1. proxy_set_header Host $my_host;
2. 在 rewrite_by_lua 里计算下,得到本次上游的地址,同时设置 $my_host
3. 在 balancer_by_lua 里 set_current_peer 指定上游地址(这一步也不是必须,不过,如果不这么改,就可能你有两个选取上游的逻辑了)

汪志鹏 <yannan...@gmail.com> 于2019年7月19日周五 下午5:33写道:
Hi, 各位好:

   我们有个需求是通过openretry(入口必须是IP)转发流量到后端的X组服务上。后端每组服务必须通过域名访问,每组服务IP是相同的。


upstream大概如下:

upstream app {
    server www.a.com; # ip 1.1.1.1
    server www.b.com; # ip 1.1.1.1
    server www.c.com; # ip 1.1.1.2
    server www.d.com; # ip 1.1.1.2
.....
}

有没有什么方法可以获取到upstream选定server后对应的域名, 然后set header Host

我们本身也进行了很多测试,  set header Host必须在content_generated_by?之前进行。但是在之前又获取不到当前的ngx.var.upstream_addr以及current_upstream_name、upstream.get_primary_peers等信息

--
--
邮件来自列表“openresty”,专用于技术讨论!
订阅: 请发空白邮件到 open...@googlegroups.com
发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 open...@googlegroups.com

归档: http://groups.google.com/group/openresty
官网: http://openresty.org/
仓库: https://github.com/agentzh/ngx_openresty
教程: http://openresty.org/download/agentzh-nginx-tutorials-zhcn.html
---
您收到此邮件是因为您订阅了Google网上论坛上的“openresty”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到openresty+unsubscribe@googlegroups.com
要在网络上查看此讨论,请访问https://groups.google.com/d/msgid/openresty/1b12b497-c486-462e-b8a1-bf5f7dcbb612%40googlegroups.com

DeJiang Zhu

unread,
Jul 19, 2019, 11:47:49 PM7/19/19
to open...@googlegroups.com
关键的一个点:
你是否可以控制,一个请求如何选择哪一个上游,如果这个逻辑可以用 Lua 来完成,就可以了
如果不能,那是不好搞了

汪志鹏 <yannan...@gmail.com> 于2019年7月20日周六 上午11:24写道:
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到openresty+...@googlegroups.com
要在网络上查看此讨论,请访问https://groups.google.com/d/msgid/openresty/1b12b497-c486-462e-b8a1-bf5f7dcbb612%40googlegroups.com

--
--
邮件来自列表“openresty”,专用于技术讨论!
订阅: 请发空白邮件到 openresty...@googlegroups.com
发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 openresty+...@googlegroups.com

归档: http://groups.google.com/group/openresty
官网: http://openresty.org/
仓库: https://github.com/agentzh/ngx_openresty
教程: http://openresty.org/download/agentzh-nginx-tutorials-zhcn.html
---
您收到此邮件是因为您订阅了Google网上论坛上的“openresty”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到openresty+...@googlegroups.com
要在网络上查看此讨论,请访问https://groups.google.com/d/msgid/openresty/accc0613-c35f-43fd-aa03-9d2ade1777b0%40googlegroups.com
Reply all
Reply to author
Forward
0 new messages