NGINX: Kann ich mit der Proxy_pass-Direktive eine Zuordnung von Upstream-Servern verwenden?

NGINX: Kann ich mit der Proxy_pass-Direktive eine Zuordnung von Upstream-Servern verwenden?

Ich habe einen NGINX-Server, der als Reverse-Proxy für eine Reihe von Backend-IIS-Servern fungiert. Ich möchte jede eingehende HTTPS-Anforderung an einen bestimmten Backend-Server (Upstream-Server) weiterleiten, abhängig von der angegebenen URI, WÄHREND die gleiche URL in der Adressleiste erhalten bleibt (um den Backend-Servernamen oder die Adresse für Benutzer unsichtbar zu halten).

Beispielsweise
sieht die Adressleistenanforderung so aus:
https://test.blahblah.com/url_a
geht eigentlich an -->,
https://upstreamserver_a/url_a
sieht in der Adressleiste aber dennoch so aus:
https://test.blahblah.com/url_a

Hier ist meine bisherige nginx.conf:

    ## Upstreamserver_A backend for test.blahblah.com
    upstream upstreamserver_a {
            server 10.10.1.12:80; #upstreamserver_a.blahblah.com
    }

    map_hash_bucket_size 128;
    map_hash_max_size 2048;


    # URI to Server Map
    map $1 $upstream_host {
            default         whatever;
            url_a       upstreamserver_a;
    }


    ## OUR HTTP SERVER AT PORT 80
    server  {
            listen      80;
            server_name test.blahblah.com;
            index       index.html;
            root        /usr/share/nginx/html;

            ## redirect http to https ##
            proxy_redirect http:// https://;
    }


    server  {
            listen      443 ssl;
            server_name test.blahblah.com;
            #root        /usr/share/nginx/html;
        ### ssl config - customize as per your setup ###
            ssl_certificate      ssl/blahblah.com/blahblah.pem;
            ssl_certificate_key  ssl/blahblah.com/blahblah.key;
            ssl_protocols        SSLv3 TLSv1 TLSv1.1 TLSv1.2;
            ssl_ciphers RC4:HIGH:!aNULL:!MD5;
            ssl_prefer_server_ciphers on;
            keepalive_timeout    70;
            ssl_session_cache    shared:SSL:10m;
           ssl_session_timeout  10m;


        ## PROXY backend
            location ~ ^/(.*)$ {
                    rewrite ^/([^/]+)$ https://test.blahblah.com/webapps        /Application.html?firm=$1#login break;

                    proxy_pass http://$upstream_host$uri;
            }
     }

Sobald ich einen Server zum Laufen bekomme, werde ich natürlich mehrere Upstream-Server hinzufügen, z. B. Upstreamserver_b, Upstreamserver_c usw.
Ich brauche keine Hilfe beim SSL-Teil, nur bei der Zuordnung und/oder Variablenreferenz.
Ich habe bewiesen, dass SSL funktioniert, indem ich diese Zeile ersetzt habe:
proxy_pass http://$upstream_host$uri;
durch
proxy_pass http://upstreamserver_a;
was funktioniert. Das heißt, es leitet zu Upstreamserver_a weiter, während die URL unter der URL „test.blahblah.com“ verborgen bleibt.

Für jede Hilfe wäre ich sehr dankbar!
Ich habe viele Beispiele mit Antworten gefunden, die meinen Anforderungen sehr nahe kommen, aber ich war zu dumm, sie an meine speziellen Anforderungen anzupassen!

Antwort1

Sie müssen Ihr URI-Muster in regulären Ausdrücken beschreiben und es an Ihrem Standort verwenden, um die Teile davon zu erfassen, die Sie im Rewrite- oder Proxy_Pass-Ziel verwenden können. Beispiel:

location ~ ^/url_(.).*$ {
  #this will capture your /url_a or /url_b URI's 
  #and will store the "a" or "b" into $1 variable
  #which you can use to proxy the request to a specific server
  proxy_pass http://$1.$upstreams$uri;
  #the above will result in a.<upstreams>/url_a for your example.
  #don't forget the resolver configuration for domain names.
}

ich hoffe es hilft

Antwort2

Je nachdem, was genau Sie möchten, fallen mir einige Anweisungen ein:

Wenn Sie beispielsweise grundsätzlich nur möchten, dass Nginx alles per Proxy an Ihre verschiedenen Upstream-Server weiterleitet, die ihre Internetnamen nicht genau kennen, und eine Zuordnung zwischen internen und externen Namen haben, sollte etwas wie das Folgende ausreichen:

map $host $host_upstream_mapped {
    hostnames;

    test.example.su  test_iis.internal:8070;
    example.com  bleeding_edge.internal:9999;

    default  localhost:8080;
}
server {
    listen [::]:80;
    location / {
        proxy_pass http://$host_upstream_mapped$request_uri;
    }
}

PS Beachten Sie, dass es wichtig ist, zu verwenden$request_uriin diesem Zusammenhang (und nicht nur$uri, weil Sie sonst etwas zurücklassen ), oder alternativ, wenn Sie auch Anweisungen $argsverwenden , ist then auch eine gute Option (beachten Sie, dass die beiden nicht gleichwertig sind).rewrite$uri$is_args$args

verwandte Informationen