基于主机名的动态Nginx域根路径?


11

我正在尝试使用基本的master / catch-all vhost配置来设置我的开发nginx / PHP服务器,以便可以根据需要创建无限的___.framework.loc

server {
        listen 80;
        index index.html index.htm index.php;

        # Test 1
        server_name ~^(.+)\.frameworks\.loc$;
        set $file_path $1;
        root    /var/www/frameworks/$file_path/public;

        include /etc/nginx/php.conf;
}

但是,对于此设置,nginx会返回404错误。我知道nginx和PHP可以正常工作并具有权限,因为localhost我使用的配置工作正常。

server {
        listen 80 default;
        server_name localhost;
        root /var/www/localhost;
        index index.html index.htm index.php;

        include /etc/nginx/php.conf;
}

我应该检查什么才能发现问题?这是它们都正在加载的php.conf的副本。

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

location ~ \.php$ {

        try_files $uri =404;

        include fastcgi_params;
        fastcgi_index index.php;

        # Keep these parameters for compatibility with old PHP scripts using them.
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        # Some default config
        fastcgi_connect_timeout        20;
        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;
        fastcgi_intercept_errors    on;
        fastcgi_ignore_client_abort off;
        fastcgi_pass 127.0.0.1:9000;

}

Answers:



13

Nginx config不是程序,而是声明。当您使用这样的配置时:

server {
        server_name ~^(.+)\.frameworks\.loc$;
        ...
        set $file_path $1;
        root    /var/www/frameworks/$file_path/public;
}

无法确保您的set指令将在之前执行root

但是map我喜欢使用伪指令。它依赖于map之前评估过的事实location

http {
  map $http_host $rootpath {
    ~^(.?<mypath>+)\.frameworks\.loc$  $mypath;
    default                            /      ;
  }
  ....
  root /var/www/frameworks/$rootpath
}

这看起来很有趣,我计划现在再玩地图。我也不知道配置文件不是以线性方式处理的。
Xeoncross

这有什么意义$mypath?它没有在任何地方使用。
kodeart '16

@kodeart $mypath是正则表达式的结果组~^(.?<mypath>+)\.frameworks\.loc$$rootpath也是整个地图技巧的结果。
Fabio Montefuscolo

4

除了出色的DukeLion答案外,我还需要更改线路

~^(.?<mypath>+)\.frameworks\.loc$ $mypath;

~^(?P<mypath>.+)\.frameworks\.loc$ $mypath;

在我的/etc/nginx/nginx.conf文件中的建议在这里

新增中

root /var/www/frameworks/$rootpath

之后/etc/nginx/sites-available/default工作正常。


0

也许您也可以研究lighttpd。它完全支持您在此处的要求。名为mod_evhost

启用evhost

将以下几行添加到您的lighttpd.conf中。如果您使用的是Debian / Ubuntu基本发行版,只需进行软链接或从复制/etc/lighttpd/conf-available/10-evhost.conf/etc/lighttpd/conf-enabled/

    #http://redmine.lighttpd.net/wiki/1/Docs:ModEVhost
    server.modules + =(“ mod_evhost”)
    evhost.path-pattern =“ / home / www /%_”

%_evhost.path-patten中的(通配符)表示使用完整域名(例如www.example.com)。对www.example.com的请求将自动定向到document-root /home/www/www.example.com/

添加其他站点就像在/home/www具有完整域名的目录下创建另一个目录一样容易。无需更改Lighttpd配置文件。

还有其他通配符,可用于构建目录结构。他们如下

    %% =>%号
    %0 =>域名+ TLD
    %1 => tld
    %2 =>没有tld的域名
    %3 =>子域1名称
    %4 =>子域2名称
    %_ =>完整域名

详细信息在这里

PS:如果您使用的是debian / ubuntu平台,启用PHP也很容易。只需启用10-fastcgi.conf和即可15-fastcgi-php.conf


0

NGINX使用PCRE正则表达式库。
从NGINX v0.8.25开始,server_name伪指令允许命名捕获

正则表达式中的命名捕获创建变量(0.8.25),以后可以在其他指令中使用。使用命名括号时,NGINX在服务器名称评估期间自动为每个命名括号设置一个变量(我猜)。

我使用以下代码段“围栏”开发人员环境。«用户»指的是他们的用户名和«proj»,即他们从事的项目:

# ...
server_name ~^(?<user>[^.]+)\.(?<proj>[^.]+).dev.local-server.com;
root /home/$user/www/$proj;
# ...

请注意,nginx配置是声明性的,因此,与运行时计算的值和变量相比,静态声明可能总是更快。正则表达式评估的成本相对较高,我想它必须与重载(生产)环境中的简约一起使用。

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.