您可以在多个Nginx配置文件中定义服务器的位置吗?


14

我在同一主机上运行多个ruby应用程序:

~/app1
~/app2
~/app3

我想让nginx使用以下子目录代理这些应用程序:

   http://example.com/app1
   http://example.com/app2
   http://example.com/app3

我很好奇nginx是否支持我能够在多个文件中定义这些位置,以便我可以与应用程序一起保留每个配置,而不是为所有应用程序使用一个整体配置文件:

~/app1/nginx.conf
~/app2/nginx.conf
~/app3/nginx.conf

我在3个配置文件中的每个配置文件中使用单个location指令定义服务器的幼稚尝试导致conflicting server name "example.com" on [::]:80, ignored了如下配置:

upstream app1 { server 127.0.0.1:4567; }
server {
  listen      [::]:80;
  listen      80;
  servername  example.com
  location    /app1 {
     proxy_pass  http://app1;
     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-Forwarded-Proto $scheme;
     proxy_set_header X-Forwarded-For $remote_addr;
     proxy_set_header X-Forwarded-Port $server_port;
     proxy_set_header X-Request-Start $msec;
  }
}

有没有办法以这种方式组织配置?

Answers:


9

您可以通过include包含外部配置:

include /path/to/config1.conf;
include /path/to/config2.conf;
include /path/to/confdir/*.conf;

server {
    server_name example.com;
    listen      [::]:80;
    listen      80;
}

在单独的配置中,您可以使用任何有效的代码块:

upstream app1 {
    server 127.0.0.1:8080;
}

location /app1 {
    proxy_pass http://app1;
}

5
这真的有效吗?上游模块是否不需要在服务器模块块之外?
Curley 2014年

5
看起来在服务器块外部不允许使用位置指令。至少对我来说,nginx报告"location" directive is not allowed here
亚历山大·阿梅尔金

是的...我看不到一种简单的方法来正确地做到这一点,即每个应用程序中没有多个文件:一个可以在服务器块内工作,一个可以在服务器块外工作。我想可以灵活使用,include /etc/nginx/above_server.d/*并且可以使用通配符使它干净:以及include /etc/nginx/in_server.d/*
jeteon

1
这个答案是错误的
AmirHossein '17

11

我相信,您可以使用以下配置:

server {
    server_name example.com;
    listen      [::]:80;
    listen      80;

    include /path/to/applications/*/nginx.conf;
}

然后在每个应用程序的目录中配置重定向,如下所示:

location    /app1 {
    proxy_pass  http://app1;
    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-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Request-Start $msec;
}

2
不利的一面是您不能在server块中定义多个上游,但我认为此答案很好地满足了OP的用例。
jeteon
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.