4

nginx を使用して、ファイアウォールの背後にある可能性のある Web アプリへのリバース プロキシを作成しています。私の最初の概念実証では、次のロケーション ブロックを使用して動作を確認しました。

    location / {
            proxy_pass https://localhost:2222;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
    }

を使用して、Web アプリでリバース トンネルを開きssh -f -N -T -R2222:localhost:443 user@nginx-ipます。これは私が好きなように正確に機能します。nginx-ipブラウザにmy と入力すると、Web アプリから https トラフィックが取得されますがnginx-ip、 などによって難読化されています。

数千のポート (上記の場合の 2222 ではなく) を介して、潜在的に数千のリバース トンネルを許可したいと考えています。nginx を読んで、正規表現を使用して、ポート番号を含む URI を動的に使用し、その特定のポートに proxy_pass することを考えました。

つまり、I'd like https://nginx-ip/2222/toproxy_pass https://localhost:2222;と I'd like https://nginx-ip/1111/to proxy_pass https://localhost:1111;.

私はかなりの数のバリエーションを試しましたが、私が推論できる限り、これがうまくいくはずだと考えました:

    location ~* ^/(\d+) {
            proxy_pass https://localhost:$1;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
    }

そうではありません。ブラウザに 502 Bad Gateway が表示され、エラー ログに次のように表示されます。

2016/05/31 21:02:36 [エラー] 6188#0: *3584 localhost を解決するためのリゾルバーが定義されていません, クライアント: {my-client-ip}, サーバー: localhost, リクエスト: "GET /2222/ HTTP/1.1 "、ホスト: "{nginx-ip}"

127.0.0.1代わりに使用するlocalhostと404が返されます。Webページには次のように書かれています

見つかりません 要求された URL /2222/ がこのサーバーで見つかりませんでした。

私が試みていることはnginx構成で可能ですか?

繰り返しますが、nginx Web サーバーを介して多数 (数千) の固有のリバース トンネルを開始できるようにしたいと考えています。私の最初の考えは、プロキシしたい他のWebアプリに基づいてnginxサーバーの発信ポートを変更し、nginxサーバーへのリクエストをURIのポートによって別のポートに割り当てることでした(正規表現経由で抽出) .

4

2 に答える 2

1

これは、ポートを指定する数字を削除するためのURL 書き換えルールと、ディレクティブの使用可能な変数として抽出するための名前付きキャプチャを組み合わせて実行できるはずです。requested_portproxy_pass

    location ~* ^/(?<requested_port>\d+) {
            rewrite /(\d+)(.*) /$1  break;
            proxy_pass https://localhost:$requested_port;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
    }
于 2016-05-31T22:06:47.343 に答える