nginx upstream config配置在单独的文件中

时间:2017-03-02 15:50:29

标签: nginx

我在10.0.0.1上的nginx上有简单的配置文件:

default.conf

server {
    listen       80;
    server_name  server.com;

    location / {
        root /www;
        index index.html;
    }

此外,我想将请求重定向到http://10.0.0.1/app1到端口8888上具有相同应用的3台服务器,例如:

http://10.0.0.1/app1 - > http://10.0.0.(2,3,4):8888/app1

所以我必须添加到我的default.conf这样的配置以进行平衡:

upstream app1 {
   server 10.0.0.2:8888;
   server 10.0.0.3:8888;
   server 10.0.0.4:8888;
}

server {
   listen 80;

   location /app1/ {
      rewrite ^/app1^/ /$1 break;
      proxy_pass http://app1;
   }
}

但是我希望将这个平衡配置保存在一个单独的文件中 - app1.conf。

如果我在/etc/nginx/conf.d/文件夹中有这两个配置文件,我只能打开网址http://10.0.0.1/

但是当我打开http://10.0.0.1/app1时,我得到错误404,因为default.conf它试图在/ www中找到app1,甚至没有尝试检查app1.conf以平衡规则。 所以似乎只能运行default.conf配置文件。 怎么解决它?

2 个答案:

答案 0 :(得分:1)

upsteam部分无论如何都需要在http块中,它位于你的nginx.conf / default.conf中。
对于您可能使用的位置块:

default.conf

http {
...
    upstream app1 {
       server 10.0.0.2:8888;
       server 10.0.0.3:8888;
       server 10.0.0.4:8888;
    }
...
server {
    listen       80;
    server_name  server.com;

    include /path/to/app1.conf;

    location / {
        root /www;
        index index.html;
    }
...
include /etc/nginx/conf.d/*;
...
}

app1.conf

location /app1/ {
  rewrite ^/app1^/ /$1 break;
  proxy_pass http://app1;
}

在default.conf中编辑include的路径。

修改
其实我在这里弄错了。 nginx的指令是分层的。在文档中,您可以找到可以使用哪个块的位置。 server块必须位于http块中。 location块可以位于serverlocation块中 根据您所在的块,可以使用include导入该特定上下文中的块 因此,使用include块中的server,您可以包含应用特定的location块,但不包括server块。这是因为server块只能驻留在http块中 我希望这有助于澄清你的情绪。

<强> EDIT2:
从你的评论我刚看到重写的正则表达式可能是错误的。

app1.conf

location /app1/ {
  rewrite ^/[^\/]+)(/.*) $1 break;
  proxy_pass http://app1;
}

答案 1 :(得分:0)

尝试以下方法:

  1. 创建文件/etc/nginx/upstream.conf

    server 10.0.0.2:8888;
    server 10.0.0.3:8888;
    server 10.0.0.4:8888;
    
  2. 将您的配置更改为:

    upstream app1 {
        include /etc/nginx/upstream.conf;
    }
    
    server {
        listen 80;
    
        location /app1/ {
        rewrite ^/app1^/ /$1 break;
        proxy_pass http://app1;
        } 
    }