2017-03-02 60 views
0

我有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 3与相同的应用程序的端口8888的服务器,如:

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/文件夹我只能打开URL http://10.0.0.1/

但是当我打开http://10.0.0.1/app1我得到的,因为default.conf的错误404它试图找到这两配置文件app1在/ www中,甚至不会尝试检查app1.conf的平衡规则。 因此,它似乎只能用于default.conf配置文件。 如何解决它?

+0

我想说的原因是你用了相同的两个服务器块监听端口。它与两个配置文件/目录无关。 – unNamed

+0

感谢您的建议。但似乎我不能在服务器块外使用位置指令,并且如果我在app1.conf中更改端口号 - nginx开始侦听那个不符合我的条件的端口 - 我需要打开URL“http://10.0 .0.1/app1“ –

回答

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; 
        } 
    } 
    
+0

感谢您的回答。 我检查了这个变体,但我肯定需要将所有上游配置保存在单独的文件中 - 这样我可以通过重命名此文件来禁用此配置。 但似乎这是不可能的,所以我会去与包含指令。 –

0

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

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; 
} 

编辑在默认情况下,include的路径。 CONF。

编辑:
其实我在这里犯了一个错误。 nginx的指令是分层的。在文档中,您可以找到哪些地方可以使用哪个块。 server块需要位于http块中。 location块可以在serverlocation块中。
根据您所在的块,您可以使用include在该特定上下文中导入块。
因此,在server块中使用include可以包含应用程序特定的location块,但不包括server块。这是因为server块只能驻留在http块中。
我希望这有助于澄清你的情况。

EDIT2:
从您的评论我刚才看到的是,在重写正则表达式也许是错误的。

app1.conf

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

重写将从原始url/app1/some/more /中删除/ app1 /。如果你不想要切断任何东西,你应该删除它。 – unNamed

+0

谢谢,我刚刚检查过这个。当我有app1.conf与 位置/ app1/{0}改写^/app1 ^// $ 1 break; proxy_pass http:// app1; } 我不能nginx的重新启动时,收到错误: /etc/init.d/nginx重启 [....]重新启动的nginx(经由systemctl):nginx.serviceJob用于nginx.service失败,因为控制处理退出并显示错误代码。有关详细信息,请参阅“systemctl status nginx.service”和“journalctl -xe”。 失败! 和error.log中: 2017年3月3日15:29:05 [EMERG] 21787#0 “位置” 指令,在这里不允许使用在/etc/nginx/app1.conf:1 –

+0

UPD: 我已经解决了这个问题 - 需要将app1.conf重命名为app1(不带.conf) –