尝试使用nginx大约一个小时试图设置大规模动态虚拟主机。 如果你曾经用apache做过,你就知道我的意思了。
目标是为办公室中的少数人(超过50个)提供动态子域名
答案 0 :(得分:59)
也许这样做可以让你到达目的地:
server {
root /sites/$http_host;
server_name $http_host;
...
}
我喜欢这个,因为我可以随意创建网站,只需创建以域命名的新目录,并将DNS指向服务器ip。
答案 1 :(得分:14)
你需要一些脚本知识把它放在一起,我会使用php,但如果你擅长bash脚本使用它。我会这样做:
首先创建一个文件夹( /usr/local/etc/nginx/domain.com / )。
在主要的nginx.conf中添加命令: include /usr/local/etc/nginx/domain.com / * .conf;
此文件夹中的每个文件都应该是不同的vhost名称subdomain.conf。
您无需重新启动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
中的正则表达式捕获变量subdomain
和domain
。 subdomain
部分是可选的,可以为空。我已将其设置为默认情况下,如果您有子域名,请说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界面都必须处理的是管理谁可以访问哪些内容。