nginxをリバースプロキシとして使用しようとしています。 1つのサーバーは再生サーバーです。サーバーをプロキシしようとすると、400ホストが許可されていないエラーが発生します。
流れ
----------(services1)
|----(services2)
client ----(https)---> nginx ---(http)---|-------(services3)
|----(services4)
---------(services5)
(つまり、クライアントはSSLを介してnginxと通信し、nginxはhttpを介して必要なすべてのバックエンドのリバースプロキシとして機能します。)
これをテストするために仮想スカラープレイバックエンドを使用しようとしています。
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の代わりにlocalhostから。リクエストを送信する方法がわからない~からローカルホスト到着その後、バックエンドサービスは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