URIs de recursos da API do Spring estão errados no ambiente do Docker

1

Eu tenho um problema com minha API de inicialização do Spring, que eu uso em combinação com o Docker e o Nginx como um proxy reverso.

No momento, estou configurando um site junto com um serviço Web REST. O servidor da web e o serviço da Web REST (Spring Boot) estão sendo executados em dois contêineres Docker diferentes. A fim de fornecer HTTPS (criptografia) eu uso o NGINX como um proxy reverso (que também está sendo executado como um Docker-Container).

Agora estou usando a configuração a seguir no meu nginx.conf para ativar o acesso externo à minha API do Spring.

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;
    }
}

Enquanto isso funciona bem, estou encontrando o problema que a API URIs Spring cria para as entidades criadas da seguinte forma: http://spring-backend/{entity}/{id} .

Isso aparentemente não pode ser acessado de outro computador que esteja consumindo o site e está associado ao serviço da web. Em vez disso, precisaria que as entradas fossem https://{the-url-of-the-webserive}:7332/{entity}/{id} .

No entanto, não tenho certeza se é possível obter essa resolução a partir da resolução de nomes usada pelo NGINX (como deve substituir server-backend com spring:8081 ) e a do Docker (deve substituir pelo menos a spring parte com o endereço real).

    
por Marco N. 22.02.2017 / 22:27

1 resposta

0

Na verdade, isso pode ser resolvido adicionando X-Forward-* cabeçalhos à location parte de server .

Isso deve ser o seguinte:

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;
}

Esse snippet de código foi retirado de plone.lucidsolutions.co.nz , onde você também pode encontrar mais informações sobre esta solução.

    
por 23.02.2017 / 01:07