Назад | Перейти на главную страницу

Неправильные URI ресурсов Spring API в среде Docker

У меня проблема с моим Spring Boot API, который я использую в сочетании с Docker и Nginx в качестве обратного прокси.

В настоящий момент я создаю веб-сайт вместе с веб-сервисом REST. Веб-сервер и веб-сервис REST (Spring Boot) работают в двух разных контейнерах Docker. Чтобы обеспечить HTTPS (шифрование), я использую NGINX в качестве обратного прокси (который также работает как Docker-Container).

Теперь я использую следующую настройку в своем 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}.

Очевидно, к нему нельзя получить доступ с другого компьютера, использующего веб-сайт и связанный с ним веб-сервис. Вместо этого мне нужно, чтобы записи были https://{the-url-of-the-webserive}:7332/{entity}/{id}.

Однако я не уверен, можно ли получить это разрешение из разрешения имен, которое использует NGINX (поскольку оно должно заменить server-backend с участием spring:8081) и Docker (должен заменить как минимум spring расстаются с фактическим адресом).

На самом деле это можно решить, добавив 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 где вы также можете найти дополнительную информацию об этом решении.