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

0vvn1miw  于 2024-01-06  发布在  Nginx
关注(0)|答案(3)|浏览(238)

我试图让我的Nginx更干一点,因为它作为近20台服务器的反向代理。这是我试图做的,所有的主机名和东西都改变了/示例:

  1. map $http_host $backend {
  2. baz.mydomain.com hostname1:8080;
  3. foo.mydomain.com 192.168.1.10:8081;
  4. bar.mydomain.com hostname2:1234;
  5. ham.mydomain.com hostname2:5678;
  6. }
  7. server {
  8. listen 443 ssl http2;
  9. server_name .mydomain.com;
  10. ssl_certificate /usr/share/nginx/certs/mydomain.com.pem;
  11. ssl_certificate_key /usr/share/nginx/certs/mydomain.com.key;
  12. location / {
  13. proxy_redirect http:// https://;
  14. proxy_pass http://$backend;
  15. }
  16. }

字符串
问题是,无论如何,这将总是给予一个坏的网关错误。我已经尝试了一些变化和移动的东西,有和没有虚拟服务器的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

ufj5ltwl

ufj5ltwl1#

我把它弄清楚了。问题是它不喜欢列表中有主机名。需要主机名,因为所有这些地址都是动态分配的。这是用上游指令解决的,如下所示:

  1. upstream bazhost {server hostname1:8080;}
  2. upstream foohost {server 192.168.1.10:8081;}
  3. upstream barhost {server hostname2:1234;}
  4. upstream hamhost {server hostname2:5678;}
  5. map $http_host $backend {
  6. baz.mydomain.com bazhost;
  7. foo.mydomain.com foohost;
  8. bar.mydomain.com barhost;
  9. ham.mydomain.com hamhost;
  10. }
  11. server {
  12. listen 443 ssl http2;
  13. server_name .mydomain.com;
  14. ssl_certificate /usr/share/nginx/certs/mydomain.com.pem;
  15. ssl_certificate_key /usr/share/nginx/certs/mydomain.com.key;
  16. location / {
  17. proxy_redirect http:// https://;
  18. proxy_pass http://$backend;
  19. }
  20. }

字符串

展开查看全部
jljoyd4f

jljoyd4f2#

我弄清楚了细节。
基本上,如果我们动态设置proxy_pass目标,则没有DNS解析。
这行不通:

  1. map $http_host $backend {
  2. default localhost:8080;
  3. }
  4. proxy_pass http://$backend;

字符串
但是,这项工作:

  1. map $http_host $backend {
  2. default 127.0.0.1:8080;
  3. }
  4. proxy_pass http://$backend;

展开查看全部
vu8f3i0k

vu8f3i0k3#

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

相关问题