9

我想以这样一种方式配置Nginx,以便我需要最少的努力来添加新站点。

我通过以下方式看到这一点:创建新站点时,我将其放在 下的子文件夹中,在nginx/var/www配置文件中添加新位置,该文​​件仅包含所需站点类型的配置模板。它看起来像这样:

server 
{
  listen 80;
  server_name localhost;
  root /var/www;        

  location /site1
  {
    include drupal.conf;
  }

  location /site2
  {
    include wordpress.conf;
  }
}

但是,不幸的是,这在我的情况下不起作用。问题在于嵌套位置。我在包含的模板之一中有以下几行:

...

location  /core/ 
{
  deny all;
}

location / 
{
  try_files $uri $uri/ @rewrite;
}

....

Nginx给我以下错误:

位置“/core/”在...中的位置“/site1”之外

位置“/”在...中的位置“/site1”之外

所以我需要为每个站点指定完整路径(如/site1/core/),但是我将无法将其提取为一个可重复使用的部分。

server_name以前,作为替代方案,我使用不同的( site1.locahost, ...)配置了多个服务器指令site2.localhost并编辑了/etc/hosts文件。在这种情况下,只要所有内容都在域的根目录下,我就不需要嵌套位置。但是,正如我所说,我正在寻找一种尽可能简化工作流程的方法,在我看来,编辑/etc/hosts就像是我想避免的额外操作。

所以问题是如何最好地处理这种情况?您如何在本地组织不同站点上的工作?

4

2 回答 2

6

在家里工作中,我结合使用 Bind9 和 Nginx 来解决这个问题。它确实需要一些设置,但是一旦设置好,您就不需要再次触摸您的 nginx 配置文件。我在底部添加了一些限制。

设置

设置 DNS 服务器 (Bind9, dnsmasq)

1) 设置本地 DNS 服务器,并创建一个名为 DEV 的主机 2) 在 DEV 中创建一个 A 名称条目

* A 127.0.0.1

并重新启动您的 DNS 服务器。3) 确保您可以挖掘*.dev 并验证您是否获得了 127.0.0.1。

设置 Nginx

1)在您的 nginx.conf 或存储 conf.d 内容的任何地方,创建一个看起来或多或少像这样的 vHost 条目:您可以根据需要对其进行调整。

server {
    listen   80;
    server_name *.dev;
    access_log  /var/log/nginx/access.log;
    error_log   /var/log/nginx/error.log;

    if ($host ~* ^(.*).dev$) {
        set $site $1;
    }

    if (!-d /var/www/$site/) {
        return 404;
    }

     location ~ index.php$ {
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_pass   backend;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/$site/$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_param  QUERY_STRING     $query_string;
        fastcgi_param  REQUEST_METHOD   $request_method;
        fastcgi_param  CONTENT_TYPE     $content_type;
        fastcgi_param  CONTENT_LENGTH   $content_length;
        fastcgi_intercept_errors        on;
        fastcgi_ignore_client_abort     off;
        fastcgi_connect_timeout 60;
        fastcgi_send_timeout 180;
        fastcgi_read_timeout 180;
        fastcgi_buffer_size 128k;
        fastcgi_buffers 4 256k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 256k;
    }

    location ~ / {
            try_files $uri $uri/ /index.php?$args;
    }
}

2)重启nginx服务。

3) 利润


设置完成后,要创建一个新站点,您所要做的就是在/var/www/中创建一个新文件夹。

mkdir -p /var/www/sitename/

该站点及其下面的 PHP 可以通过 sitename.dev 访问。

如前所述,这有一些限制。站点名称必须全部小写,并且不包含空格或特殊字符(包括句点)。其次,它实际上只适用于通过 index.php 引导的站点。

如果您有完全不同的站点结构,您可以修改一些内容以提供更强大的设置。例如,您可以写出您的配置,使其看起来像这样。

server {
    listen   80;
    server_name *.*.dev;

    [...]

    if ($host ~* ^(.*).(.*).dev$) {
        set $site $1;
        set $folder $2;
    }

    if (!-d /var/www/$folder/$site/) {
        return 404;
    }

    [...]
        fastcgi_param  SCRIPT_FILENAME  /var/www/$folder/$site/$fastcgi_script_name;
    [...]

}

并假设您更新您的 dns 服务器以响应. .dev,那么您可以将我们的目录编写如下,只是为了给您一个想法。

/var/www/wordpress/site1
/var/www/wordpress/site2
/var/www/wordpress/site3

/var/www/zend/site1
/var/www/zend/site2
/var/www/zend/site3

就像我之前说的,我在家里和 15 个人一起工作时使用这个设置。我们的工作设置有点复杂(共享服务器,每个人都有自己的主文件夹),但在那里工作得很好。我个人更喜欢处理子域而不是本地主机路径。

希望这可以帮助!

于 2013-07-16T00:50:16.310 回答
0

使用类似aliasnginx 提供的功能怎么样?

http://wiki.nginx.org/HttpCoreModule#alias

如果这对您的工作流程不起作用,是否符号链接到 /core 目录可以防止该错误?

于 2013-07-15T22:00:15.813 回答