nginx设定泛域名,二级域名及二级目录
我有这样一个需求,我需要利用N个二级域名来建立N个站点。出于简化日后对二级域名管理的难度,以及nginx的性能,我选择了在DNS端,设定一条泛解析的A记录。然后由nginx来将相应的二级域名解析到二级目录中。当相应的域名没有相应的二级目录对应时,就返回404错误。
同时,在apache端(我的配置是前端跑nginx,处理动态交给apache的形式),也进行相应的二级域名转发,这样,从nginx接收过来php,也能立马处理。
这里说下主机端这边的配置,如果有纰漏的,还请看到的人,帮忙指出,我不想让自己的主机因为我的设置,有朝一日变成肉鸡,呵呵。
server {
server_name *.test.com; //泛解析
index index.html index.htm index.php;
if ( $host ~* (\w+)\.\w+\.\w+ ) { //获取二级域名
set $subdomain /$1;
}
root /srv/www/test$subdomain; //设定二级域名的root目录
...... //剩余部分省略
}我看过一些网络上的文章,一般对指定root目录的时候,一般都是放在location / {} 不过在我这,我没法这么设定,另外这样设定还有一些局限性,在我的配置里头,还有对一些文件后缀做expires设定,以及反盗链的设定。这部分设定同样也是通过location来进行的。例如我的这部分配置文件为:
location ~ \.(gif|jpg|jpeg|png|bmp|ico|swf|js|css)$ {
expires 7d;
valid_referers none blocked *.test.com;
if ($invalid_referer) {
rewrite ^/ http://$server_name;
#return 500;
}
}所以当匹配到css文件之类时,对于这部分内容,会由于它缺少正确的root设置而导致相应的CSS文件找不到。当然会出现这样的错误,也同我的配置有关系,我是将上面这段,直接写成一个文件,然后在各个虚拟机中使用include来调用的,因此这就需要保证这个文件通用性。否则可以通过在上面这段location中,再次增加一个root,也可以解决,呵呵,我个人还是喜欢简介,高效性的配置。
接下来是后端的apache的接收部分,经过我验证,保证能运行。这里有段小插曲,这段rewrite还是从国外的网站找到的,不知道是不是我的搜索水平有问题,我发现中文的技术文章,大家写的都是一样的,多统一呀,呵呵。但在我这,还是没能成功跑起来。
<VirtualHost 10.241.116.8> //用这个IP,而不是127.0.0.1,是由于我在两台服务商都架设了apache来跑php
DocumentRoot /srv/www/test
ServerAlias *.test.com //这里设定泛解析,我发现设定了这条之后,是可以不再设定ServerName的,所以我就也给省了。
RewriteEngine on
RewriteCond %{HTTP_HOST} ^([^.]+)\.qdun\.net$ [NC] //这里是获取二级域名头,我还是给加上了nc,将其转化成小写的终归不会有错误(2012年2月27日纠正:nc为忽略大小写,而非转换成小写)
RewriteCond /srv/www/test/%1 -d //判断二级域名的相应目录时候是否存在
RewriteRule ^(.*) /%1/$1 [L] //当两者条件都成功之后,才进行重定向
</VirtualHost>PS:写完收工,希望这个月备案能下来,已经由于某某原因被拖了一个月,真是烧钱哪。还有人生大事上也能有点进展,我对2012还是很敬畏的。