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

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

问题是,无论如何,这总是会出现错误的网关错误。我已经尝试了一些变体和移动的东西,有和没有通配符 server_name,用 $host 而不是 $http_host 但到目前为止我无法让它工作。我什至以正确的方式解决这个问题吗?我真的不想在我的配置中有将近 20 个单独的虚拟服务器条目。

nginx 文档中没有很多关于使用这样的 map 的帮助,网上也没有很多帮助,除了一篇非常老的帖子在这里简要提到了类似的内容:https://serverfault.com/questions/342309/how-to-write-a-dry-modular-nginx-conf-reverse-proxy-with-named-locations

最佳答案

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

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

关于nginx - 使用 nginx map 指令动态设置代理上游,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50121492/

相关文章:

php - 对css,js和静态文件的更改未反射(reflect)在nginx docker容器上

nginx 将所有 www 域重定向到非 www 域

Nginx - 如何创建将与 auth_request 模块一起使用的自定义请求

nginx - [::] 在我的 nginx 配置文件中是什么意思

apache - 为什么在 sites-available 下更改默认文件也会更改 nginx 中 sites-enabled 下的默认文件?

docker - 如何在本地网络(无域)中将我的 docker 与 SSL 连接?

linux - Nginx 上游作为 url

node.js - 如何配置 nginx docker 容器以识别不同端口中的本地主机应用程序?

Nginx 如何按位置路由到反向代理

用于响应内容操作的 Kubernetes Ingress Gateway