nginx proxy reverso: host não permitido erro

1

Estou tentando usar o nginx como um proxy reverso. Um servidor é um servidor de jogo. Quando tento fazer proxy no servidor, recebo um erro de 400 Host Not Allowed.

fluxo

                                         ----------(services1)
                                         |----(services2)
client ----(https)---> nginx ---(http)---|-------(services3)
                                         |----(services4)
                                         ---------(services5)

(ou seja, o cliente fala com nginx via ssl e, em seguida, o nginx atua como um proxy reverso para qualquer backend necessário em http).

Estou tentando testar isso com um back-end scala play.

Eu tenho um nginx.conf que parece:

http {
    ...

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_http_version 1.1;

    upstream play-backend {
        server 127.0.0.1:9000;
    }

    include sites-enabled/*.conf;
}

Agora, eu tenho um default.conf (dentro de sites habilitados) que redirecionam o tráfego HTTP sobre ssl:

server {
    listen 80 default_server;
    list [::]:80 default_server;

    return 301 https://$host$request_uri;
    ...
}

Então, dentro do meu default-ssl.conf (dentro de sites habilitados), eu tenho minha lógica de proxy reverso:

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    ... certificate and other stuff ...

    location /foo {
        proxy_pass http://play-backend;
    }
}

Eu sou capaz de desviar com sucesso o tráfego de SSL, mas não sei por que não posso usar proxy para nenhum dos meus serviços de back-end. Tenho a sensação de que organizei tudo errado e, de alguma forma, estou tentando usar o https para me comunicar com o servidor do jogo.

Posso confirmar que o servidor de reprodução está funcionando, pressionando diretamente localhost:9000/

EDIT: Especificamente, o problema é que o nginx faz um pedido para o serviço de back-end de myexampledomain.com em vez de localhost. Não tenho certeza de como enviar a solicitação de localhost para o serviço de back-end e, em seguida, retorná-lo ao cliente a partir do domínio em ssl.

    
por clo_jur 11.06.2017 / 21:18

1 resposta

0

Você provavelmente precisará configurar o Filtro de Host Permitido no seu application.conf. Você deve usar o pode usar "." para permitir qualquer host, ou você poderia usar "myexampledomain.com".

   play.filters.hosts {
     # Allow requests to myexampledomain.com.
     allowed = ["myexampledomain.com"]
   }

link

    
por 24.08.2017 / 00:26