我想以这样的方式配置 Nginx ,以便我只需要花费很少的精力来添加新网站。
我通过以下方式看到这一点:创建新网站时,我将其放在/var/www
下的子文件夹中,在 nginx 配置文件中添加新位置,该文件只包含所需网站类型的配置模板。它看起来像这样:
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 给了我以下错误:
location“/ core /”位于...... / / p>之外的位置“/ site1”
位置“/”位于“/ site1”的外部位置...
所以我需要为每个网站指定完整路径(例如/site1/core/
),但之后我将无法将其作为一个可重用的部分提取。
以前,作为替代方案,我使用不同的server_name
(site1.locahost
,site2.localhost
...)和已编辑的/etc/hosts
文件配置了多个服务器指令。在这种情况下,只要所有内容都在域的根目录下,我就不需要嵌套位置。但是,正如我所说,我正在寻找一种尽可能简化工作流程的方法,编辑/etc/hosts
在我看来就像我想避免的额外行动。
所以问题是如何最好地处理这种情况?你如何在当地组织不同网站的工作?
答案 0 :(得分:6)
在家里和在工作中我使用Bind9和Nginx的组合来解决这个问题。它确实需要一些设置,但一旦它启动你就不需要再次触摸你的nginx配置文件。我在底部添加了一些限制。
1)设置本地DNS服务器,并创建一个名为DEV的主机 2)在DEV中为
创建一个A名称条目* A 127.0.0.1
然后重新启动DNS服务器。 3)确保您挖掘 * .dev并确认您返回127.0.0.1。
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访问。
如前所述,这有一些限制。 sitename必须全部为小写,并且不包含空格或特殊字符(包括句点)。其次,它实际上只适用于通过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人一起使用这个设置。我们的工作设置稍微复杂一点(共享服务器,每个人都有自己的主文件夹),但它在那里工作得很好。我个人更喜欢在子域而不是localhost路径上工作。
希望这有帮助!
答案 1 :(得分:0)
使用nginx提供的alias
函数怎么样?
http://wiki.nginx.org/HttpCoreModule#alias
如果这对您的工作流程不起作用,那么符号链接到/ core目录是否会阻止该错误?