ist*_*pin 2 nginx google-cloud-platform nginx-reverse-proxy google-cloud-run
我在 GCP Cloud Run 中设置了一个以 nginx 为前端的 Web 应用程序,效果非常好。我正在尝试使用 nginx 将请求代理到另一个 GCP Cloud Run 服务的特定路由。例如,我希望请求能够https://my-cloud-run-frontend.app.run解析到https://my-cloud-run-frontend.run.app,但是我希望请求能够 https://my-cloud-run-frontend.run.run/api/*被代理https://my-cloud-run-backend.run.app。
这两个云运行服务都使用 IAM Auth。
当我在本地 docker 容器中运行服务时,代理效果很好。同样,如果我frontend在 Cloud Run 设置中从应用程序中删除 IAM 身份验证,一切似乎都会正常。
但是,启用 IAM 身份验证后,请求会https://my-cloud-run-frontend.run.app成功,但请求会https://my-cloud-run-frontend.run.app/api/因未经授权而失败(具体来说,错误是从frontend云运行应用程序引发的)。
https://my-cloud-run-backend.run.app我已经确认,通过使用相同的身份验证令牌并直接向 和发出请求https://my-cloud-run-frontend.run.app,身份验证可以正常工作,并且工作正常。
做了一些研究,我发现我可能需要设置一个Host标头,所以我尝试将标头设置Host为我的目的地(https://my-cloud-run-backend.run.app网址)。这会导致调用返回https://my-cloud-run-frontend.run.app/api400 错误。
我的nginx.conf.template文件:
server {
access_log /dev/stdout;
listen 8080;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
proxy_set_header Authorization $http_authorization;
proxy_pass_header Authorization;
proxy_pass_request_headers on;
}
location /api/ {
proxy_pass https://my-cloud-run-backend.run.app/;
proxy_set_header Authorization $http_authorization;
proxy_pass_header Authorization;
proxy_set_header Host https://my-cloud-run-backend.run.app;
proxy_pass_request_headers on;
rewrite ^/api(.*)$ $1 break;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
Run Code Online (Sandbox Code Playgroud)
您无需在后端进行身份验证即可实现您的用例。事实上,您可以部署未经身份验证的 API Cloud Run,但将入口设置为仅限内部
然后,在反向代理 Cloud Run 上,您必须添加无服务器 VPC 连接器并将出口设置为所有
该设计仅接受反向代理上经过身份验证和授权的请求,并使 API 后端只能由反向代理(或 VPC 中的其他内部资源)访问。
这种设计可行,但需要权衡一些:
| 归档时间: |
|
| 查看次数: |
4042 次 |
| 最近记录: |