我正在尝试使用 nginx 作为反向代理。一台服务器是播放服务器。当我尝试代理服务器时,收到 400 Host Not allowed 错误。
流动
----------(services1)
|----(services2)
client ----(https)---> nginx ---(http)---|-------(services3)
|----(services4)
---------(services5)
(即客户端通过 ssl 与 nginx 对话,然后 nginx 充当通过 http 需要的任何后端的反向代理)。
我正在尝试使用虚拟 scala 播放后端来测试这一点。
我有一个nginx.conf
看起来像:
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;
}
现在,我有一个default.conf
(在启用站点内的)通过 ssl 重定向 http 流量:
server {
listen 80 default_server;
list [::]:80 default_server;
return 301 https://$host$request_uri;
...
}
然后,在我的内部default-ssl.conf
(启用站点内部),我有我的反向代理逻辑:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
... certificate and other stuff ...
location /foo {
proxy_pass http://play-backend;
}
}
我能够通过 ssl 成功转移流量,但我不确定为什么我无法代理到任何后端服务。我有一种感觉,我组织的一切都是错误的,并且它以某种方式尝试使用 https 与播放服务器进行通信。
我可以通过直接点击确认播放服务器正在运行localhost:9000/
编辑:具体来说,问题是 nginx 向后端服务发出请求从myexampledomain.com 而不是来自本地主机。我不知道如何发送请求从本地主机到后端服务,然后通过 ssl 从域返回给客户端。
答案1
您可能需要在 application.conf 上设置允许的主机过滤器。您应该使用可以使用“。”允许任何主机,或者您可以使用“myexampledomain.com”。
play.filters.hosts {
# Allow requests to myexampledomain.com.
allowed = ["myexampledomain.com"]
}
https://www.playframework.com/documentation/2.6.x/AllowedHostsFilter