web-dev-qa-db-ja.com

NGINXリバースプロキシがリソースを読み込まない

いくつかの内部Webサービスの前にリバースプロキシを配置しようとしています。

Nginxはセットアップされ、リクエストに応えるために適切に機能しています。 1つのみを提供する場合location /私のconfファイルでは、proxy_passターゲットが正常にロードされます。つまり、

location / {
  proxy_pass https://internal.ip:port/;
 }

https:// public_proxy_address / にアクセスすると、その内部リソースが完全に読み込まれます。

しかし、私は複数の内部アプリケーションを持っているので、nginxを介してそれらすべてをプロキシしたいと思います。したがって、私のテストでは、confを次のように変更しました。

location /app1 {
  proxy_pass https://internal.ip:port/;
}

これを実行すると、メイン/デフォルトの内部アプリインデックスページが表示されますが、ソースを表示すると、リンクスタイルシート、js、またはその他のリソースが書き換えられていないことがわかります。したがって、ページのコンテンツ全体がロードに失敗します。 Apacheでは、おそらくproxyhtmlurlmap ^/resource/ /app1/resource R。私はnginxでこれを達成する方法を見つけることができません。

私もこれを試しましたが、役に立ちませんでした:

location /app1 {
  rewrite /resource(.*?) /app1/resource$1 break;
  proxy_pass https://internal.ip:port/;
 }

NginxがリクエストされたリソースのURLにターゲットの場所(app1)を適切に付加してロードできるようにするにはどうすればよいですか?

2
PenguinCoder

クレジットが足りないので、コメントはできませんので、別のエントリーで返答します。

OPが同意しない理由はわかりませんが、Martin Fjordvalが問題を正しく識別し、正しいことを提案していると思います。以下のように彼のスニペットを少し変更することをお勧めします。

                location /app1/ {
                    proxy_set_header Host $http_Host/app1;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Scheme $scheme;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header X-Forwarded-Proto $scheme;
                    proxy_redirect    off;
                    add_header Pragma "no-cache";
                    add_header Cache-Control "no-cache";

                    proxy_pass http://internal.ip:port/;
                    sub_filter 'action="/'  'action="/app1/';
                    sub_filter 'href="/'  'href="/app1/';
                    sub_filter 'src="/'  'src="/app1/';
                    sub_filter_once off;
            }

したがって、「/」で始まるすべての相対URLにリダイレクトが必要であると確信している場合、上記はすべてに「/ app1 /」を追加し、参照時に「location/app1 /」ブロックにキャッチされます。次に、ページのソースを表示して、書き換えが行われていることを確認できます。

また、おそらく「proxy_set_header」シャバンの全体または少なくとも一部、特に「proxy_set_header Host $ http_Host/app1」ビットが必要です。

3
abdus_salam

私があなたの問題を正しく理解している場合、問題はアプリケーションがルートuriでホストされていると考えているようです/が実際にホストされている間/app1と言われていません。 Nginxは通常、期待どおりのバックエンドの応答を変更しませんが、それは可能です。

最初に、アプリにルートURIを定義できる構成オプションがあるかどうかを確認します。設定がある場合、それは断然最も簡単な解決策です。

何も見つからない場合は、 substitution module を使用して、HTMLのURLを置き換えることができます。これを機能させるには、バックエンドでGZIPエンコーディングを無効にする必要があることに注意してください。これにより、nginxは圧縮されていないHTMLを見ることができます。

サブフィルターがどのように見えるかの例

location /app1 {
    sub_filter '<a href="/resource/' '<a href="/app1/resource/';
    sub_filter_once off;

    proxy_pass https://internal.ip:port/;
}
1

私はサブドメインベースのプロキシを使用することになりました。基本は次のようになります。

server {
   listen 443 ssl;
   ssl on;
   ssl_cert <cert>;
   ssl_key <key>;

   server_name appname1.public.com;

   location / {
     proxy_pass https://internalapp1.ip:port
    }
}

server {
   listen 443 ssl;
   ssl on;
   ssl_cert <cert>;
   ssl_key <key>;

   server_name appname2.public.com;

   location / {
     proxy_pass https://internalapp2.ip:port
    }
}

これにより、URLやリソースを直接書き換える必要がなくなります。

1
PenguinCoder

ページのURLおよびページが使用するすべてのリソースではなく、場所に単一の絶対URLを指定しました。そのURLで始まる正規表現を指定する必要があります。このようなものはうまくいくかもしれません(私はそれをテストしていません)

location ~ /app1(/.*) {
  proxy_pass https://internal.ip:port/;
}
0
Tim