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.