与nginx玩了大约一个小时,试图build立大规模的dynamic虚拟主机。 如果你曾经在apache做过,你明白我的意思。
目标是在办公室为less数人提供dynamic子域名(超过50个)
你将需要一些脚本knowladge放在一起,我会使用PHP,但如果你是在bash脚本使用。 我会这样做:
首先创建一些文件夹( /usr/local/etc/nginx/domain.com/ )。
在主要的nginx.conf中添加命令: include /usr/local/etc/nginx/domain.com/*.conf;
这个文件夹中的每个文件应该是不同的虚拟主机名称subdomain.conf。
您不需要重新启动nginx服务器来执行配置,您只需要重新加载它: /usr/local/etc/rc.d/nginx reload
或者你只能创建一个conf文件,所有的虚拟主机都应该被设置。 这可能是更好的,所以Nginx不需要加载50个文件,但只有一个….
如果你有脚本问题,然后问问题…
也许这样做会让你想到你想要的地方:
server { root /sites/$http_host; server_name $http_host; ... }
我喜欢这个,因为我可以从字面上创建网站,只需创建一个以域名命名的新目录,并将DNS指向服务器IP。
基于user2001260的答案,后来由partlov编辑,这是我的结果。
请记住,这是针对位于本地虚拟机上的开发服务器,在每个域的末尾使用.dev
前缀。 如果你想删除它,或者使用别的东西, server_name
指令中的\.dev
部分可以被编辑或者完全删除。
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
,因为它会为每个请求增加额外的处理开销,但在开发环境中使用应该没有问题,这是该配置的优势所在。 在生产环境中,我建议不要使用大规模虚拟主机配置并单独配置每个站点,以获得更多的控制权和更好的安全性。
另一个选择是包含几个级别,以便目录可以按照您认为合适的方式进行分类。 例如:
include sites-enabled/*.conf; include sites-enabled/*/*.conf; include sites-enabled/*/*/*.conf; include sites-enabled/*/*/*/*.conf;
server_name ~^(?<vhost>[^.]*)\.domain\.com$; set $rootdir "/var/www/whatever/$vhost"; root $rootdir;
只要你对脚本很熟悉,把一些脚本放在一起可以很快地在nginx中设置虚拟主机并不难。 这个 slicehost文章通过设置几个虚拟主机,并以一种很容易编写脚本的方式实现,并保持独立的配置。 唯一的缺点是不得不重新启动服务器,但这是配置更改所期望的。
更新:如果你不想做任何保持自己的配置,那么你唯一的2个选项(反正是安全的)将是找到一个程序,让你的用户管理自己的nginx配置块会让他们创建他们想要的所有子域名),或者自己创建一个面向用户的管理控制台。
自己这样做不会太难,特别是如果你已经有脚本来完成设置的工作。 基于Web的界面可以调用脚本来完成实际的工作,这样所有的Web界面都必须处理的是管理谁可以访问什么东西。