你能在多个nginx配置文件中定义服务器的位置吗?

我在同一台主机上运行了多个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;
  }
}
有没有一种方法可以这样组织配置文件?
2个回答

我相信,你可以使用这个配置:
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

你可以通过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
7看起来位置指令不允许在服务器块之外。至少对我来说,nginx报告“此处不允许使用"location"指令”。 - Alexander Amelkin
1嗯...我觉得没有简单的方法可以在每个应用程序中正确地完成这个任务,而不需要多个文件:一个在服务器块内工作,一个在外部工作。我想为了灵活性和清晰度,可以使用通配符:include /etc/nginx/above_server.d/*include /etc/nginx/in_server.d/* - jeteon
2这个答案是错误的。 - Amir Hossein Baghernezad