Ron*_*nin 6 nginx node.js kubernetes
考虑以下 nginx 配置文件:
server {
listen 443;
ssl on;
ssl_certificate /etc/tls/cert.pem;
ssl_certificate_key /etc/tls/key.pem;
location / {
proxy_pass http://api.default.svc.cluster.local;
}
}
Run Code Online (Sandbox Code Playgroud)
443 上的所有传入 TCP 请求都应重定向到我运行的服务器api.default.svc.cluster.local:80(顺便说一句,这是一个 REST-Api 节点)。这工作正常,我可以curl https://<nginx-IP>/nginx 并获得正确的响应,如预期的那样。
现在,我想将位置从 更改为/,/api这样我就可以触发 acurl https://<nginx-IP>/api以获得与以前相同的响应。
1. 尝试
所以我将配置中的位置行更改为:
location /api {
不幸的是,这不起作用,相反,我收到一个错误Cannot GET /api,这是一个节点错误,所以显然它被路由到 api,但有些东西仍然很臭。
2. 尝试
URI 中的尾部斜杠似乎是必需的,因此我将其添加到该位置:
location /api/ {
现在有些事情发生了变化。我不会得到与以前相同的错误,而是得到“301 永久移动”。如何修复我的 nginx 配置文件?
有关环境的附加信息
我正在使用 kubernetes 部署来部署 nginx 反向代理(包括)。引入的配置。然后我使用 kubernetes 服务公开 nginx。另外,我尝试使用 kubernetes ingress 来处理这种情况,使用相同的路由,但是,ingress 服务会响应一条default backend - 404消息。
正如问题中提到的,URI 中的尾部斜杠很重要。我在该位置修复了此问题,但是,我没有将其添加到使用 传递的 URI 中proxy_pass。
至于 nginx 代理,我使用以下配置让它工作:
server {
listen 443;
ssl on;
ssl_certificate /etc/tls/cert.pem;
ssl_certificate_key /etc/tls/key.pem;
location /api/ {
proxy_pass http://api.default.svc.cluster.local/;
}
}
Run Code Online (Sandbox Code Playgroud)
关于入口解决方案,我无法通过将缺少的尾部斜杠添加到路径来使其工作。该服务是由于其名称而指定的,因此不能添加尾部斜杠(即,这会导致错误)。