3

URLに基​​づいてNginxでリバースプロキシを実行しようとしています。http://mydomain.example.com/client1/...にリダイレクトされたいですhttp://127.0.0.1:8193/...。私は多くの方法を試しましたが、どれもうまくいきませんでした。アプリケーションはリダイレクトを行うことができることに注意してください。これらは私の最後のソリューションの構成ファイルです:

デフォルト

server {
    listen                  80;
    server_name             mydomain.example.com;

    location / {
            set $instance none;
            if ($request_uri ~ ^/(.*)/$) {
                    set $instance $1;
            }

            set $no_cookie true;
            if ($http_cookie ~ "instance=([^;] +)(?:;|$)") {
                    set $instance $1;
                    set $no_cookie false;
            }

            if ($no_cookie = true) {
                    add_header Set-Cookie "instance=$instance;Domain=$host;Path=/";
                    rewrite ^ / break;
            }

            include instances.conf;
    }

インスタンス.conf

proxy_redirect                 off;
proxy_set_header               Host $host;
proxy_set_header               X-Real-IP $remote_addr;
proxy_set_header               X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_connect_timeout          90;
proxy_send_timeout             60;

# Installation of language packs, etc. can take a long time
proxy_read_timeout             10800;

if ($instance = client1) {
    proxy_pass http://127.0.0.1:8193;
}

if ($instance = client2) {
    proxy_pass http://127.0.0.1:8194
}

...

ブラウザが をリクエストするhttp://mydomain.example.com/client1/と、Nginx はinstance値で名前が付けられた Cookie を設定しclient1、トラフィックを適切なプロキシにリダイレクトする必要があります。後続のクエリでは、この Cookie を使用してリダイレクトを行う必要があります。私が抱えている問題は、$instance変数を に設定しないことclient1です。アプリケーションはプレフィックスを認識しないことを忘れないでください/client1

アイデアはありますか?より良い解決策を知っていますか?

4

3 に答える 3

1

Cookieを取得するために使用された正規表現が間違っていました。これをに変更しました

"instance=([^;][^ ]+)(?:;|$)"

そしてそれは今動作します。

編集:それは最終的にソリューションの一部にすぎません。ごめんなさい。まだ問題があります。以下の私のコメントを参照してください。

于 2012-06-19T23:40:37.207 に答える
0

あなたの問題とは関係ありませんが、「proxy_connect_timeout」

「このディレクティブは、アップストリーム サーバーへの接続のタイムアウトを割り当てます。このタイムアウトは 75 秒を超えることはできないことに注意する必要があります。」

于 2014-01-03T15:21:21.893 に答える
-1

Nginxのマップモジュールを参照してください

map $uri $proxy {
    /client1     http://127.0.0.1:8193/client1;
    /client2     http://127.0.0.1:8194/client2;
}

server {
    server_name my.domain.com;
    proxy_pass $proxy;
}

proxy_passURIの最後に/clientXを追加すると、URIのその部分がリクエストから削除されることに注意してください(これは私には合理的と思われますが、希望どおりではない場合があります)。

于 2012-06-24T06:22:02.803 に答える