如何在Nginx配置的上游块中公开服务器端口?

时间:2017-01-10 01:53:47

标签: nginx reverse-proxy

我们在SOA模式下松散地有一些同质的应用程序。由于同质性,我们已经能够在Nginx中定义一些简洁的模式,通过一种配置代理我们所有的SOA应用程序。遵循Nginx配置绝对是与DNSmasq一起工作的绝对奇迹来解决anything.yourdomain.devel,例如。 a.stackoverflow.develb.stackoverflow.devel域并通过地图通过指定端口将其路由到项目文件夹下的相应应用服务器。

 worker_processes  2;

    events {
      worker_connections  1024;
    }

    http {

          map $host $static_content_root {
            hostnames;
            default /path/to/project/folder;
            # For typical standalone apps living in your project directory
            # *.myapp.local.devel -> /path/to/project/myapp/public
            ~^([^\.]+\.)*(?<app>[^\.]+)\.devel$ /path/to/project/folder/$app/public; #rails pattern
          }

          map $app $devel_proxy_port1 {
            default 3000;
            domain1 3000;         
            domain2 4000;

          }

          map $app $devel_proxy_port2 {
            default 3001;
            domain1 3001;
            domain2 4001;
          }

          server {
            listen 127.0.0.1;
            server_name  ~^([^\.]+\.)*(?<app>[^\.]+)\.[^\.]+.devel$;


            location / {
              root  $static_content_root; # Using the map we defined earlier
              try_files $uri $uri/index.html @dynamic;
            }

            location @dynamic {
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forward-Proto http;
                proxy_set_header X-Nginx-Proxy true;
                proxy_redirect off;
                proxy_pass http://127.0.0.1:$devel_proxy_port1;
            }
          }
        }

现在,为了模拟 Nginx 负载均衡器后面的多个服务器。我想到了以下代理配置,它指向上游而不是直接指向一个服务器:端口对。

proxy_pass http://backend;

upstream backend {
   server http://127.0.0.1:$devel_proxy_port1;
   server http://127.0.0.1:$devel_proxy_port2;
}

我认为上面会有效,但它始终会发出以下错误,暗示上游上下文中 map 块的变量不可用。

[emerg] 69478#0: invalid host in upstream "http://127.0.0.1:$devel_proxy_port1" in /usr/local/etc/nginx/nginx.conf:57
  

这是预期的行为吗?

1 个答案:

答案 0 :(得分:0)

是的,变量不能在上游使用。您可以使用不同的名称(upstream backendupstream backend_domain等)创建一些上游块,通过map解析上游名称并将此变量放到proxy_pass

upstream backend {
 server http://127.0.0.1:3000;
 server http://127.0.0.1:3001;
}

upstream backend_domain1 {
 server http://127.0.0.1:3002;
 server http://127.0.0.1:3003;
}

upstream backend_domain2 {
 server http://127.0.0.1:3004;
 server http://127.0.0.1:3005;
}

...

upstream backend_domain30 {
 server http://127.0.0.1:3060;
 server http://127.0.0.1:3061;
}

map $app $devel_proxy {
 default backend;
 domain1 backend_domain1;
 domain2 backend_domain2;
 ...
 domain30 backend_domain30;
}

...
proxy_pass $devel_proxy;
...

在某些情况下,您可以使用map $app内的proxy_pass来跳过proxy_pass backend_$app;阻止,但需要对$app值进行额外检查。此外,map允许将不同的“域”映射到相同的应用程序。