nginx配置子域名对应的document_root
有如下需求:
我有一个域名 huangfeiqiao.com,我想在上面搭几个web应用,分别是foo、bar、baz。
一种办法就是在nginx的document root目录中建立foo、bar、baz目录,访问方式就是huangfeiqiao.com/foo、huangfeiqiao.com/bar等等。但这样有几个缺点——
- 某些web应用可能本身就不支持非根目录的方式访问,导致不可用
- 因为各个应用可能需要进行location的特殊配置,而这些应用不在根路径的时候,location配置可能有所不同,更加复杂
- 不够酷
需要让foo、bar、baz都拥有自己的子域名(foo.huangfeiqiao.com、bar.huangfeiqiao.com等等),可以这么做:
- 在域名服务商那里,加一个CNAME记录,把需要配置的子域名指向根域对应的主机名即可。
- 然后这么写nginx配置:
server {
listen 80;
listen 443 ssl;
server_name huangfeiqiao.com;
# blah blah...
# 设置子域名目录
set $doc "";
if ($host ~ ^(\w+)\.huangfeiqiao\.com$) {
set $doc $1;
}
# www的话就是根目录
if ($host = "www.huangfeiqiao.com") {
set $doc "";
}
# 设置此时域名对应的root
root /path/to/www/$doc;
index index.html index.htm index.php;
# 日志配置
access_log logs/$host.access.log main;
error_log logs/error.log;
}
搞定。
这样做的好处就是,之后要加个子域名,只要在www目录中新建一个子目录,取子域名作为目录名,然后在域名服务商新增一条字域名的CNAME记录就搞定了,非常方便。