使用nginx map指令动态设置代理上游

时间:2018-05-01 18:06:21

标签: nginx nginx-location nginx-reverse-proxy

我正在尝试让我的Nginx更加干燥,因为它充当了近20台服务器的反向代理。这是我正在尝试做的,所有主机名和内容都被更改/示例:

map $http_host $backend {
    baz.mydomain.com       hostname1:8080;
    foo.mydomain.com       192.168.1.10:8081;
    bar.mydomain.com       hostname2:1234;
    ham.mydomain.com       hostname2:5678;
}

server {
    listen                      443 ssl http2;
    server_name                 .mydomain.com;

    ssl_certificate             /usr/share/nginx/certs/mydomain.com.pem;
    ssl_certificate_key         /usr/share/nginx/certs/mydomain.com.key;

    location / {
        proxy_redirect          http:// https://;
        proxy_pass              http://$backend;
    }
}

问题在于无论如何,这总会给出错误的网关错误。我已经尝试了一些变化并使用$ host而不是$ http_host移动带有和不带通配符server_name的东西,但到目前为止,我无法使其工作。我是否正确地走这条路?我真的不希望在我的配置中有近20个单独的虚拟服务器条目。

关于使用这样的地图的nginx文档中没有很多帮助,除了一篇在这里简要提到类似内容的旧帖子之外,并没有太多帮助:https://serverfault.com/questions/342309/how-to-write-a-dry-modular-nginx-conf-reverse-proxy-with-named-locations

1 个答案:

答案 0 :(得分:2)

我明白了。问题是它不喜欢在列表中有主机名。所有这些地址都是动态分配的,因此需要主机名。这可以通过上游指令解决,如下所示:

upstream bazhost {server hostname1:8080;}
upstream foohost {server 192.168.1.10:8081;}
upstream barhost {server hostname2:1234;}
upstream hamhost {server hostname2:5678;}

map $http_host $backend {
    baz.mydomain.com       bazhost;
    foo.mydomain.com       foohost;
    bar.mydomain.com       barhost;
    ham.mydomain.com       hamhost;
}

server {
    listen                      443 ssl http2;
    server_name                 .mydomain.com;

    ssl_certificate             /usr/share/nginx/certs/mydomain.com.pem;
    ssl_certificate_key         /usr/share/nginx/certs/mydomain.com.key;

    location / {
        proxy_redirect          http:// https://;
        proxy_pass              http://$backend;
    }
}