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

问题描述 投票:0回答:3

我正在尝试让我的 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;
    }
}

问题是,无论如何,这总是会给出一个错误的网关错误。我尝试了一些变体并移动了一些东西,有或没有通配符 server_name,用 $host 而不是 $http_host 但到目前为止我无法让它工作。我是否以正确的方式处理这件事?我真的不希望我的配置中有近 20 个独立的虚拟服务器条目。

nginx 文档中关于使用这样的映射的帮助并不多,网上也没有太多帮助,除了一篇非常旧的帖子,在这里简要提到了类似的内容:https://serverfault.com/questions/342309 /如何写-dry-modular-nginx-conf-reverse-proxy-with-named-locations

nginx nginx-location nginx-reverse-proxy
3个回答
16
投票

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

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

1
投票

我弄清楚了细节。
基本上,如果我们动态设置

proxy_pass
目标,就没有 DNS 解析。

这行不通:

map $http_host $backend {
    default localhost:8080;
}

proxy_pass http://$backend;

但是,这项工作:

map $http_host $backend {
    default 127.0.0.1:8080;
}

proxy_pass http://$backend;

0
投票

您可以安装侦听 127.0.0.53 的 systemd 解析器(或者也可以安装侦听 127.0.0.1 的 dnsmasq),并在顶部添加以下指令以使 nginx 使用您的 /etc/hosts 文件

resolver 127.0.0.53 # use systemd resolver

© www.soinside.com 2019 - 2024. All rights reserved.