使用 nginx 映射指令动态设置上游代理
Using nginx map directive to dynamically set proxy upstream
我想让我的 Nginx 更干一点,因为它充当了将近 20 台服务器的反向代理。这是我正在尝试做的,所有主机名和内容都是 changed/examples:
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 文档中没有很多关于像这样使用地图的帮助,除了一个非常古老的 post 在这里简要提到了类似的内容外,网上也没有很多帮助: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;
}
}
我想出了细节。
基本上,如果我们动态设置 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;
我想让我的 Nginx 更干一点,因为它充当了将近 20 台服务器的反向代理。这是我正在尝试做的,所有主机名和内容都是 changed/examples:
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 文档中没有很多关于像这样使用地图的帮助,除了一个非常古老的 post 在这里简要提到了类似的内容外,网上也没有很多帮助: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;
}
}
我想出了细节。
基本上,如果我们动态设置 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;