12

假设我为这样的域设置了 nginx 配置:

server {

  root /path/to/one;
  server_name one.example.org;

  location ~ \.php$ {
    try_files       $uri =404;
    fastcgi_pass    127.0.0.1:9000;
    fastcgi_index   index.php;
    fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include         fastcgi_params;
  }

}

现在,如果我想添加另一个具有不同内容的域,有没有办法可以重复使用前一个域中的等效语句,或者我是否必须为我想要支持的每个新域复制所有内容?

server {

  root /path/to/two; # different
  server_name two.example.org; # different

  location ~ \.php$ {
    try_files       $uri =404;
    fastcgi_pass    127.0.0.1:9000;
    fastcgi_index   index.php;
    fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include         fastcgi_params;
  }

}

我尝试将location指令移到server闭包之外,但显然事情不会那样工作,因为在重新启动 nginx 时出现错误“此处不允许位置指令”。

4

2 回答 2

22

这是使用 nginx Map 模块的一个很好的例子。http://wiki.nginx.org/HttpMapModule

以下是我尝试过的。它适用于我的开发箱。笔记

  1. map 指令只能放在 http 块中。
  2. 声明 map 指令的性能损失可以忽略不计(见上面的链接)
  3. 您可以自由拥有不同的根文件夹或端口号等。

    map $subdomain $root_folder {
      one  /path/to/one;
      two  /path/to/two;
    }
    
    map $subdomain $port_number {
      one 9000;
      two 9100;
    }
    
    server {
      listen  80;
      server_name  ~^(?P<subdomain>.+?)\.mydomain\.com$;
      root  $root_folder;
    
       location ~ \.php$ {
        try_files       $uri =404;
        fastcgi_pass    127.0.0.1:$port_number;
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include         fastcgi_params;
      }
    }
    
于 2013-03-29T20:57:17.577 回答
14

你可以做:

 server_name one.example.org two.example.org;

如果除了域名之外两者完全相同

如果您只有类似的位置块,您可以将这些位置移动到单独的文件中,然后执行

include /etc/nginx/your-filename; 

在每个服务器块中轻松使用它

于 2013-03-29T19:16:21.753 回答