2017-10-06 47 views
0

私は、アプリケーションを区別するために異なるパスを使用して、同じホスト/ポート上で複数のWebアプリケーションをリバースプロキシとして使用しようとしています。例えば ​​-異なるコンテキストパスを持つNginxリバースプロキシ

proxy_set_header Host $http_host; 
proxy_set_header Upgrade $http_upgrade; 
proxy_set_header Connection $proxy_connection; 
proxy_set_header X-Real-IP $remote_addr; 
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; 
proxy_set_header X-Forwarded-Ssl $proxy_x_forwarded_ssl; 
proxy_set_header X-Forwarded-Port $proxy_x_forwarded_port; 

upstream app1 { 
    server 192.168.0.1:8080; 
} 
upstream app2 { 
    server 192.168.0.2:8080; 
} 

server { 
    server_name my-application-server; 
    listen 80; 

    location /app1/ { 
     proxy_pass http://app1/; 
    } 
    location /app2/ { 
     proxy_pass http://app2/; 
    } 

} 

これは正しく私のアプリの上に個々のページへの要求をプロキシ:

私のnginxの設定ファイルは、以下のようになります。 http://my-application-server/app1/context/loginなどがありますが、アプリのハイパーリンクは壊れています(app1)。彼らはhttp://my-application-server/app1/context/login-successではなくhttp://my-application-server/context/login-successに私を誘導します。

proxy_redirectrewriteのさまざまな値を追加しようとしましたが、これらのリンクを正しく表示することはできません。

私のアプリはTomcatで実行されているJava Webアプリケーションであり、違いがあれば可能です。私はwebappのコンテキストパスを変更することができる他のソリューションを見てきましたが、nginxは、nginxパスを知るように設定する必要なしに、リクエストを透過的にプロキシする必要があります。

答えて

1

まず最初に、ルートドメインからバックエンドを追加してベースURLを追加したドメインにプロキシするような方法はありません。

http://xyz/abcからhttp://defを代理する場合は、100%保証されているものがあります。アプリケーション固有の変更が必要

バックエンドAPIが現在のURLにアクセスするurlを返さないものであれば、proxy_passについて心配する必要はありません。しかし、あなたがhtmlを持っているなら、あなたのやり方をすべて修正する必要があります。

は、すべてのsub_filterはCSS、JavaScriptとHTML内のURLを修正するために行われたように、私は大洪水のバックエンド用

How to proxy calls to specific URL to deluge using NGINX?

を作成し、簡単な設定を参照してください。そして私はそれを実行し、問題を見つけて修正を実装しなければなりませんでした。以下はあなたの参照のための設定です

location ~* /deluge/(.*) { 
    sub_filter_once off; 
    sub_filter_types text/css; 
    sub_filter '"base": "/"' '"base": "/deluge/"'; 
    sub_filter '<head>' '<head>\n<base href="/deluge/">'; 
    sub_filter 'src="/' 'src="./'; 
    sub_filter 'href="/' 'href="./'; 
    sub_filter 'url("/' 'url("./'; 
    sub_filter 'url(\'/' 'url(\'./'; 

    set $deluge_host 192.168.33.100; 
    set $deluge_port 32770; 
    proxy_pass http://$deluge_host:$deluge_port/$1; 
    proxy_cookie_domain $deluge_host $host; 
    proxy_cookie_path//deluge/; 
    proxy_redirect http://$deluge_host:$deluge_port/ /deluge/; 
} 

あなたのアプリに基づいて上記をカスタマイズすることができます。しかし、以下はあなたが必要とするものです

location /app1/ { 
    sub_filter_once off; 
    sub_filter '<head>' '<head>\n<base href="/app1/">'; 
    sub_filter 'src="/' 'src="./'; 
    sub_filter 'href="/' 'href="./'; 
} 
+0

あなたの答えをありがとうございます - それは簡単な解決策はありませんが、あなたの答えは私のアプリケーションのルールを理解するのに十分なことを私に与える。 – olambert

関連する問題