nginx在容器中通过proxy转发如何实现动态url

先上一下现在有问题的配置文件吧: 

location ^~ /api/ {
    #resolver kube-dns.kube-system.svc.cluster.local valid=5s; #don't work
    resolver 10.244.64.10;
    set $loadurl http://gateway-service.default.svc.cluster.local:55558/;
    if ($http_username != "" ) {
        set $loadurl http://gateway-service.$http_username.svc.cluster.local:55558/;
    }
    proxy_pass $loadurl;
    proxy_set_header   Host             $proxy_host;
    proxy_set_header   X-Real-IP        $remote_addr;
    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    proxy_cookie_path / /;  
}

nginx是启动在k8s的Pod中的,想要的实现的功能:

通过在request的header中添加"username":"test",nginx根据header中的username值test请求转发到对应test命名空间的gateway网关中。

现在问题:

1、resolver 只能用kube-dns的service的clusterIp,无法使用servicename,这也不是什么大问题。

2、主要问题,现在nginx转发时,从日志来看可以将请求转发到指定网关,但是请求的url貌似没有过滤掉一级路径 /api/。

也就是说,proxy_pass使用变量时,默认把变量最后的 “/”给去掉了,

resolver 10.244.64.10;
set $loadurl http://gateway-service.default.svc.cluster.local:55558/;
#使用变量会出现404
proxy_pass $loadurl; 

...

#直接写url没有问题
proxy_pass http://gateway-service.default.svc.cluster.local:55558/;

这样导致到达网关的请求是带着 /api/的,网关找不到路由的,最终返回了404。

现在找不到有效的解决办法,求大神指教!

 

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 以帮助更多的人 ^-^