如何解决根据 Nginx 中的请求头动态 proxy_pass
这是我的 nginx.conf
的一部分:
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_namespace != "" ) {
set $loadurl http://gateway-service.$http_namespace.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 在 Kubernetes 上运行。
我正在尝试根据标头中的 proxy_pass
配置 namespace
。
比如:
当我请求带有标头 http://localhost/api/auth/login
的 namespace:test
时,
我想要 proxy_pass
是 http://gateway-service.test.svc.cluster.local:55558/auth/login
。
或者header命名空间为空,那么proxy_pass
就是http://gateway-service.default.svc.cluster.local:55558/auth/login
但现在我总是收到 404,我很困惑!
所以我尝试了下面的测试,
在 ```proxy_pass`` 中使用变量不起作用,我也得到了 404:
location ^~ /api/ {
resolver 10.244.64.10;
set $loadurl http://gateway-service.default.svc.cluster.local:55558/;
proxy_pass $loadurl;
}
当我在 proxy_pass
中写入 URI 时,Nginx 可以将请求代理到默认命名空间,并且我得到了正确的响应:
location ^~ /api/ {
proxy_pass http://gateway-service.default.svc.cluster.local:55558/;
}
我在这里呆了将近三天。您有什么建议吗?
解决方法
@RichardSmith 评论对我有帮助!我应该使用 rewrite
。
下面的配置对我来说很好。
location ^~ /api/ {
resolver kube-dns.kube-system.svc.cluster.local; #It working
if ($http_namespace != "" ) {
rewrite ^/api(.*)$ $1 break;
proxy_pass http://gateway-service.$http_namespace.svc.cluster.local:55558;
break;
}
proxy_pass http://gateway-service.default.svc.cluster.local:55558/;
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 / /;
}
还有 resolver kube-dns.kube-system.svc.cluster.local;
也在 kubernetes 中工作!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。