Docker 环境中的 Spring API 资源 URI 错误

Docker 环境中的 Spring API 资源 URI 错误

我的 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-backendspring:8081解析度spring

答案1

其实,可以通过在的部分添加X-Forward-*标题来解决。locationserver

它应该如下所示:

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您还可以在此处找到有关此解决方案的更多信息。

相关内容