web-dev-qa-db-ja.com

ポートおよびURL情報を維持するURLに基​​づいてトラフィックを別のIPアドレスにリダイレクトします

QAバージョン、UATバージョン、およびDEVバージョンのwebappがあります。ユーザーは_http://uat.company.com:41002/webapp_、_http://qa.company.com:41002/webapp_、および_http://dev.company.com:41002/webapp_を介してこれらにアクセスする必要があります。また、ポート41001とポート8080にアクセスする必要のある別のWebアプリケーションもあります。

これらのURLは会社の外部で利用できる必要があり、アクセスできるパブリックIPアドレスは1つだけです。そのため、このようなDNSレコードは、1つのIPを指すために3つのアドレスすべてを必要とします。その単一のIPアドレスで、サーバーはnginxを実行します。バックグラウンドで、各URLが異なるサーバーを指す必要があります

_http://uat.company.com --> 123.123.123.1
http://qa.company.com  --> 123.123.123.2
http://dev.company.com --> 123.123.123.3
_

正しい用語がわからないのですが、残りのURIとポートもIPアドレスに引き継ぐ必要があります。つまり誰かが訪問した場合

_http://uat.company.com:41002/webapp/somepage`
_

それは彼らが訪問したページのように見えますが、実際には彼らは見ているでしょう

_http://123.123.123.1:41002/webapp/somepage
_

または彼らが訪問した場合

_http://qa.company.com:8080/static/home.html
_

彼らは本当に見ているだろう

_http://123.123.123.2:8080/static/home.html
_

ただし、ブラウザは_http://qa.company.com:8080/static/home.html_を引き続き表示します

私が試してみました

_server {

    server_name uat.company.com;

    listen 41001;
    listen 41002;
    listen 8080;

    location / {
            proxy_pass http://123.123.123.1:$server_port$uri;
            proxy_set_header Host $Host;
    }
_

}

ただし、これにより、次のログのある不正なゲートウェイ502ページが表示されます:2015/01/28 16:04:49 [crit] 30571#0: *1 connect() to 123.123.123.1:41002 failed (13: Permission denied) while connecting to upstream, client: 172.23.128.245, server: uat.company.com, request: "GET /webapp/ HTTP/1.1", upstream: "http://123.123.123.1:41002/webapp/", Host: "uat.company.com:41002"

これがもっと明確になれば幸いです。


更新 Xaviersの提案から、SELinuxが邪魔になっている可能性があるというので、私はそれを無効にしました。上記のnginx設定を使用すると、2番目のサーバーに接続しているように見えます。ただし、ポートはまだ引き継がれていません。呼んでいます

_uat.company.com:41002/webapp/
_

これは、サービスを直接呼び出す場合、リダイレクトされます

_uat.company.com:41002/webapp/spring/config/main
_

ただし、プロキシを介して何が起こっているかは、プロキシが戻ってくるか、または

_uat.company.com/webapp/spring/config/main
_

したがって、ページのロードに失敗します...

6
Mitch Kent

私は私のセットアップで何が問題であったかを確立しました。

1)SELinuxにより、アップストリームに接続できませんでした。これを無効にしました。後で適切に設定することを検討します

2)proxy_passは期待どおりに機能していましたが、必要な引数はhttp://123.123.123.1:$server_port/$uri$is_args$args;

3)proxy_set_header Host $Hostホスト名を正しく設定しましたが、ポート番号が含まれていました。私のニーズに合った正しい形式はproxy_set_header Host $Host:$server_port

これにはより良い解決策があるかもしれません、そして私はそれを機能させるためにそれを切り詰めたので私はまだ完全に機能する解決策を持っていません、しかし私の設定の作業セクションは:

server {
    listen 41002;
    server_name uat.comapny.com;

    location /webapp {
        proxy_pass http://123.123.123.1:41002/$uri$is_args$args;
        proxy_set_header Host $Host:$server_port;
    }
}

肉付けが済んだら、より一般的なバージョンを投稿します。助けてくれたすべての人に感謝します。

7
Mitch Kent

ポートを維持したい場合は、proxy_pass

server {

    server_name bob.something.com;

    listen 41001;
    listen 41002;
    listen 8080;

    location / {
            proxy_pass http://123.123.123.1:$server_port$uri;
            proxy_set_header Host $Host;
    }
}

これはnginxを介してリクエストをプロキシすることを理解する必要があります。

5
Alexey Ten