NGINX: posso usar um mapeamento de servidores upstream com a diretiva proxy_pass?

1

Eu tenho um servidor NGINX que atua como proxy reverso para um monte de servidores IIS back-end. Eu gostaria de passar cada solicitação HTTPS de entrada para um determinado servidor back-end (upstream), dependendo do URI especificado, ENQUANTO manter o mesmo URL na barra de endereços (para manter o nome do servidor backend ou o endereço invisível para os usuários)

Por exemplo,
solicitação de barra de endereço se parece com:
https://test.blahblah.com/url_a
na verdade vai para - >
https://upstreamserver_a/url_a
mas na barra de endereços ainda se parece com:
https://test.blahblah.com/url_a

Aqui está o meu nginx.conf até agora:

    ## 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;
            }
     }

É claro que, quando eu conseguir um servidor funcionando, adicionarei vários servidores upstream, por exemplo, upstreamserver_b, upstreamserver_c, etc.
Não preciso de ajuda com a parte SSL, apenas o mapeamento e / ou referência variável.
provei que o SSL funciona substituindo esta linha:
proxy_pass http://$upstream_host$uri;
com proxy_pass http://upstreamserver_a;
que funciona. AKA, Ele redireciona para upstreamserver_a, enquanto mantém a URL disfarçada sob o url 'test.blahblah.com'.

Qualquer ajuda seria muito apreciada!
Eu encontrei muitos exemplos com respostas que são muito parecidas com o que eu preciso, mas eu fui muito estúpido para moldá-las à minha necessidade particular!

    
por user202985 19.12.2013 / 00:41

2 respostas

1

você precisa descrever seu padrão de URI na expressão regular e usá-lo em seu local para capturar as partes dele que você pode usar no destino reescrito ou proxy_pass. por exemplo:

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.
}

espero que ajude

    
por 19.12.2013 / 11:53
0

Dependendo do que exatamente você deseja, há algumas diretivas que vêm à mente:

Por exemplo, se você quer apenas ter tudo o que o nginx proxy possui em seus servidores upstream que não estão cientes de seus nomes de internet, e ter um mapeamento entre nomes internos e externos, algo como isto deve ser feito:

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;
    }
}

P.S. Observe que é importante usar $request_uri neste contexto (e não apenas $uri , porque senão você estará deixando $args para trás), ou, alternativamente, se você estiver usando rewrite diretivas, então $uri$is_args$args é também é uma boa opção (note que os dois não são equivalentes).

    
por 05.11.2017 / 01:27