nginx:上游有多个服务器指令?


15

我正在尝试打包2个使用nginx作为代理的应用程序,并将每个配置文件传递到中/etc/nginx/conf.d/

在一个文件(combined.conf)中执行此操作效果很好:

    upstream backend1 {
      http://localhost:8989;
    }

    upstream backend2 {
      http://localhost:8990;
    }

    server {
      location /backend1/ {
        proxy_pass  http://backend1;
      }
      location /backend2/ {
        proxy_pass  http://backend2;
      }

但是,当拆分为2个文件时,重定向之一会系统失败:

  • backend1.conf

    upstream backend1 {
      http://localhost:8989;
    }
    
    server {
      location /backend1/ {
        proxy_pass  http://backend1;
      }
    
  • backend2.conf

    upstream backend2 {
      http://localhost:8990;
    }
    
    server {
      location /backend2/ {
        proxy_pass  http://backend2;
      }
    

所以我的问题是:一个http节点可以有2个不同的server孩子吗?

Nginx 文档对此一无所获。

其他人似乎已经通过这种架构成功了:(

Nginx版本是1.1.19-1ubuntu0.1。

感谢您的任何建议!


更精确地说,当我用2档接近它是默认的站点有404答案
oDDsKooL

Answers:


8

经过如此隆隆的测试之后,我想出了一种使之工作并能够为每个应用程序分发一个配置文件的方法。

这是在每个应用程序的一个公共文件和一对上游/位置文件中调度的:

  • /etc/nginx/conf.d/common-proxies.conf

    include /upstreams/*.conf;
    
    server {
    include /locations/*.conf
    }
    
  • /etc/nginx/locations/backend1.conf

    location /backend1/ {
      upstream http://backend1;
    }
    
  • /etc/nginx/locations/backend2.conf

    location /backend2/ {
      upstream http://backend2;
    }
    
  • /etc/nginx/upstreams/backend1.conf

    upstream backend1 {
      http://localhost:8989;
    }
    
  • /etc/nginx/upstreams/backend2.conf

    upstream backend2 {
      http://localhost:8990;
    }
    

1
这是错字吗?上游应具有“服务器localhost:8990”,而不是“ localhost:8990 ;”。看到这里:nginx.org/en/docs/http/ngx_http_upstream_module.html
mbdev

从您链接的文档看来,块中的每个命令都以半列结尾。例如upstream backend { server 127.0.0.1:8080 max_fails=3 fail_timeout=30s; }。此外,这也适用于;:)
oDDsKooL,2014年

我的意思是地址之前缺少关键字“服务器”。忽略分号部分。
mbdev

1

一个http块可以有许多服务器子级。但是,nginx选择一个服务器块来处理请求。因此,该请求永远不会“看到” backend2位置,因为它与第一个服务器块相匹配。


您的意思是,可能是我的location指令吸收了要用于backend2的请求?
oddsKooL

还是server当nginx寻找适当server的转发请求时,是否需要一种区分两个块的方法?
oddsKooL

两个位置块都应在同一服务器块内。
chrskly
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.