![Docker 环境中的 Spring API 资源 URI 错误](https://linux22.com/image/699398/Docker%20%E7%8E%AF%E5%A2%83%E4%B8%AD%E7%9A%84%20Spring%20API%20%E8%B5%84%E6%BA%90%20URI%20%E9%94%99%E8%AF%AF.png)
我的 Spring Boot API 存在问题,我将其与 Docker 和 Nginx 结合使用作为反向代理。
目前,我正在建立一个网站以及一个 REST web 服务。Web 服务器和 REST web 服务 (Spring Boot) 在两个不同的 Docker 容器中运行。为了提供 HTTPS (加密),我使用 NGINX 作为反向代理 (也作为 Docker 容器运行)。
现在我使用以下设置来nginx.conf
启用对我的 Spring API 的外部访问。
upstream spring-backend {
server spring:8081;
}
# ... some other configuration stuff
server {
listen 7332;
ssl on;
# ... ssl-config
# all other traffic
location / {
# Specify the fields added/redefined to the request header passed to the proxied server.
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
# Timeout for reading a response from the proxied server.
proxy_read_timeout 3600; # keep open even without any transmission
proxy_pass http://spring-backend;
}
}
虽然这很有效,但我遇到了 Spring 为创建的实体创建的 API URI 的问题,如下所示:http://spring-backend/{entity}/{id}
。
显然,无法从使用该网站及其相关 Web 服务的另一台计算机访问它。相反,我需要将条目设置为https://{the-url-of-the-webserive}:7332/{entity}/{id}
。
但是我不确定是否可以从 NGINX 使用的名称解析(因为它应该用 替换)和 Docker 的名称解析(应该至少用实际地址替换部分)中获取server-backend
此spring:8081
解析度spring
。
答案1
其实,可以通过在的部分添加X-Forward-*
标题来解决。location
server
它应该如下所示:
location / {
# Specify the fields added/redefined to the request header passed to the proxied server.
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
#--------------------------------- SOLUTION -------------------------------------------
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host:443; #or $host:7332 in my case
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Port 443; #or 7332 in my case
proxy_set_header X-Forwarded-Proto https;
#------------------------------- SOLUTION-END -----------------------------------------
# Timeout for reading a response from the proxied server.
proxy_read_timeout 3600; # keep open even without any transmission
proxy_pass http://spring-backend;
}
该代码片段取自plone.lucidsolutions.co.nz您还可以在此处找到有关此解决方案的更多信息。