NGINX:我可以使用 proxy_pass 指令映射上游服务器吗?

NGINX:我可以使用 proxy_pass 指令映射上游服务器吗?

我有一台 NGINX 服务器,充当一组后端 IIS 服务器的反向代理。我想根据指定的 URI 将每个传入的 HTTPS 请求传递到某个后端(上游)服务器,同时在地址栏中保留相同的 URL(以使用户看不到后端服务器名称或地址)

例如
地址栏请求如下所示:
https://test.blahblah.com/url_a
实际上转到 -->
https://upstreamserver_a/url_a
但在地址栏中仍然如下所示:
https://test.blahblah.com/url_a

以下是我目前的 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;
            }
     }

当然,一旦我可以让一台服务器运行起来,我就会添加多台上游服务器,例如upstreamserver_b、upstreamserver_c 等。
我不需要 SSL 部分的帮助,只需要映射和/或变量引用。
我已经通过替换此行证明了 SSL 是有效的:
proxy_pass http://$upstream_host$uri;
使用
proxy_pass http://upstreamserver_a;
which works。也就是说,它会重定向到upstreamserver_a,同时将 URL 隐藏在 URL“test.blahblah.com”下。

任何帮助都将不胜感激!
我找到了很多例子,答案非常接近我的需求,但我太笨了,无法将它们塑造成我特定的需求!

答案1

您需要用正则表达式描述您的 URI 模式,并在您的位置使用它来捕获您可以在重写或 proxy_pass 目标中使用的部分。例如:

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

希望能帮助到你

答案2

根据你到底想要什么,有以下几个指令可以考虑:

例如,如果你基本上只是想让 nginx 将所有内容代理到不完全了解其互联网名称的各种上游服务器,并在内部和外部名称之间建立映射,那么类似这样的操作应该可以做到:

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 请注意,使用$request_uri在此背景下(而不仅仅是$uri,因为否则你会落后$args),或者,如果你rewrite也使用指令,那么$uri$is_args$args也是一个不错的选择(请注意,两者并不等同)。

相关内容