如何在nginx中设置大规模动态虚拟主机?

时间:2011-11-20 03:22:02

标签: dynamic nginx virtualhost

尝试使用nginx大约一个小时试图设置大规模动态虚拟主机。 如果你曾经用apache做过,你就知道我的意思了。

目标是为办公室中的少数人(超过50个)提供动态子域名

7 个答案:

答案 0 :(得分:59)

也许这样做可以让你到达目的地:

server {

    root /sites/$http_host;

    server_name $http_host;

    ...

}

我喜欢这个,因为我可以随意创建网站,只需创建以域命名的新目录,并将DNS指向服务器ip。

答案 1 :(得分:14)

你需要一些脚本知识把它放在一起,我会使用php,但如果你擅长bash脚本使用它。我会这样做:

  1. 首先创建一个文件夹( /usr/local/etc/nginx/domain.com / )。

  2. 在主要的nginx.conf中添加命令: include /usr/local/etc/nginx/domain.com / * .conf;

  3. 此文件夹中的每个文件都应该是不同的vhost名称subdomain.conf。

  4. 您无需重新启动nginx服务器以便配置执行操作,您只需要重新加载它: /usr/local/etc/rc.d/nginx reload

    或者您只能制作一个conf文件,其中应设置所有vhost。这可能更好,以便nginx不需要加载50个文件,但只需要一个....

    如果您遇到脚本问题,请询问有关该问题的问题......

答案 2 :(得分:4)

基于user2001260的回答,后来由partlov编辑,这是我的结果。

请记住,这是针对位于本地虚拟机上的开发服务器,其中.dev前缀用于每个域的末尾。如果您要删除它或使用其他内容,\.dev指令中的server_name部分可以进行编辑或完全删除。

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    # Match any server name with the format [subdomain.[.subdomain...]].domain.tld.dev
    server_name ~^(?<subdomain>([\w-]+\.)*)?(?<domain>[\w-]+\.[\w-]+)\.dev$;

    # Map by default to (projects_root_path)/(domain.tld)/www;
    set $rootdir "/var/www/$domain/www";

    # Check if a (projects_root_path)/(subdomain.)(domain.tld)/www directory exists
    if (-f "/var/www/$subdomain.$domain/www"){
        # in which case, set that directory as the root
        set $rootdir "/var/www/$subdomain.$domain/www";
    } 

    root $rootdir;

    index index.php index.html index.htm index.nginx-debian.html;

    # Front-controller pattern as recommended by the nginx docs
    location / {
        try_files $uri $uri/ /index.php;
    }

    # Standard php-fpm based on the default config below this point
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }

}

server_name中的正则表达式捕获变量subdomaindomainsubdomain部分是可选的,可以为空。我已将其设置为默认情况下,如果您有子域名,请说admin.mysite.com,将根设置为与mysite.com相同的根。这样,相同的前端控制器(在我的情况下为index.php)可以基于子域进行路由。但是如果你想在一个子域中保留一个完全不同的应用程序,你可以拥有一个admin.mysite.com目录,它将使用该目录来调用admin.mysite.com

小心:在当前的nginx版本中不鼓励使用if,因为它会为每个请求增加额外的处理开销,但它应该可以在开发环境中使用,这个配置有什么好处。在生产环境中,我建议不要使用大规模虚拟主机配置并单独配置每个站点,以获得更好的控制和更好的安全性。

答案 3 :(得分:1)

server_name ~^(?<vhost>[^.]*)\.domain\.com$;
set $rootdir "/var/www/whatever/$vhost";
root $rootdir;

答案 4 :(得分:0)

另一个选择是包含几个级别,以便可以根据需要对目录进行分类。例如:

include sites-enabled/*.conf;
include sites-enabled/*/*.conf;
include sites-enabled/*/*/*.conf;
include sites-enabled/*/*/*/*.conf;

答案 5 :(得分:0)

正如@Samuurai在这里建议的是一个简短的版本Angular 5与nginx构建集成:

server {
    server_name ~^(?<branch>.*)\.staging\.yourdomain\.com$;
    access_log /var/log/nginx/branch-access.log;
    error_log /var/log/nginx/branch-error.log;
    index index.html;
    try_files $uri$args $uri$args/ $uri $uri/ /index.html =404;
    root /usr/share/nginx/html/www/theft/$branch/dist;
}

答案 6 :(得分:-1)

只要您熟悉脚本,就可以将一些脚本放在一起,以便在nginx中快速设置vhost。 This slicehost文章介绍了如何设置几个虚拟主机,并以易于编写脚本的方式完成,并使配置保持独立。唯一的缺点是必须重新启动服务器,但这可以通过配置更改来实现。


更新:如果你不想自己做任何配置维护,那么你唯一的两个选择(无论如何都是安全的)将是找到一个程序,让你的用户管理他们自己的nginx块config(这将让他们创建他们想要的所有子域),或者自己创建这样一个面向用户的管理控制台。

自己做这件事并不会太难,特别是如果你已经有脚本来完成设置工作。基于Web的界面可以调用脚本来完成实际工作,这样所有Web界面都必须处理的是管理谁可以访问哪些内容。