nginx多域名绑定后,实现不同域名访问不同目录的核心方法是通过配置server_name匹配规则,并在对应的server块中设置root或alias指令指向各自的站点目录。这就像给服务器装上了分拣系统,每个域名一来,nginx就能准确把它引到属于自己的“房间”,下面直接拆解配置步骤与避坑方案。
nginx多域名绑定不同目录配置方法:先理解匹配优先级
不少人在配置时遇到过这种情况:明明写了两个server块,结果所有域名都指向了第一个目录,这通常不是写错了,而是没有理解nginx的server_name匹配顺序,行业共识认为,nginx在接收到请求后,会按以下顺序寻找处理请求的server块:
- 精确匹配server_name,例如
server_name example.com;。 - 以开头的通配符匹配,例如
server_name .example.com;。 - 以结尾的通配符匹配,例如
server_name www.example.;。 - 正则表达式匹配,例如
server_name ~^wwwd+.example.net$;。 - 如果以上都没匹配到,则使用默认server或第一个加载的server。
结论很明确:如果你有两个域名A和B,都用了listen 80;且没有设置默认标记,而域名A的server块恰好被第一个加载,那么所有未匹配到的域名都会落到A上,解决方式是给默认的server块加上default_server参数。
实操:nginx多域名绑定不同目录配置步骤
假设服务器上有两个网站,域名分别是www.a-site.com和www.b-site.com,对应的目录是/var/www/a-site和/var/www/b-site,下面按步骤操作。
第一步:创建站点目录与测试文件
为了验证效果,先建立两个简单的首页文件。
mkdir -p /var/www/a-site mkdir -p /var/www/b-site echo "<h1>This is A Site</h1>" > /var/www/a-site/index.html echo "<h1>This is B Site</h1>" > /var/www/b-site/index.html
第二步:编辑nginx站点配置文件
nginx的配置通常位于/etc/nginx/conf.d/或/etc/nginx/sites-available/,这里创建一个独立的配置文件,比如/etc/nginx/conf.d/multi-site.conf,写入以下内容:
# A站点配置
server {
listen 80;
server_name www.a-site.com a-site.com;
root /var/www/a-site;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
access_log /var/log/nginx/a-site.access.log;
error_log /var/log/nginx/a-site.error.log;
}
# B站点配置
server {
listen 80;
server_na
me www.b-site.com b-site.com;
root /var/www/b-site;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
access_log /var/log/nginx/b-site.access.log;
error_log /var/log/nginx/b-site.error.log;
}
# 默认拒绝或重定向未匹配的域名
server {
listen 80 default_server;
server_name _;
return 444;
}
第三步的检查操作要先执行,先确认配置语法没问题:
nginx -t
看到nginx: configuration file /etc/nginx/nginx.conf test is successful后,重载配置:
nginx -s reload
第三步:验证不同域名访问不同目录效果
在本地电脑上改hosts文件,或者直接通过域名解析访问,用curl命令测试最直观:
curl http://www.a-site.com curl http://www.b-site.com
你会发现前者输出“This is A Site”,后者输出“This is B Site”,这就是最基础的nginx多域名绑定不同目录配置方法。
nginx一个服务器多个网站怎么配置:从实际场景拆解
上面是纯静态站点的场景,现实中,你大概率会遇到PHP站点或反向代理场景,这里重点分析两种高频需求。
不同域名对应不同PHP站点
这种情况下,root指令不变,但需要让nginx把PHP请求交给PHP-FPM处理,这里有个常见误区:把root写在location里和写在server里效果有区别。
推荐写法:将root放在server层,location只负责匹配URI。
server {
listen 80;
server_name www.a-site.com;
root /var/www/a-site;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ .php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
为什么强调SCRIPT_FILENAME?因为如果缺少这个参数,PHP-FPM无法确定要执行的文件路径,会直接报“File not found”错误,相当一部分新手在配置多站点时踩过这个坑。
不同域名访问不同目录但共用同一个端口
有些人会问:“我只有一个80端口,是不是只能配置一个网站?”答案是否定的。nginx正是通过server_name来区分虚拟主机,而不依赖端口,这就是nginx多域名绑定的核心价值。
在同一个80端口上,你可以挂几十个域名,只要每个域名的server块独立、root目录独立、日志文件独立即可。
nginx server_name 多个域名配置技巧与隐藏陷阱
除了上面两种场景,多个域名还可能指向同一个目录,或者需要把某个域名的请求转发到不同的后端端口,这里列出几种常见配置技巧。
| 需求场景 | 配置方式 | 适用情况 |
|---|---|---|
| 多域名指向同一目录 | 在一条server_name后空格分隔多个域名 | 主站与备用域名、不同后缀域名 |
| 不同域名指向不同目录 | 每个域名独立server块 | 多租户SaaS、多站点部署 |
| 域名与IP同时访问不同内容 | 用default_server区分IP直接访问 | 禁止IP访问或展示默认页 |
| 同域名不同路径反代 | location + proxy_pass组合 | 单域名下按路径分发给多台内部服务 |
server_name中的下划线
如果你的域名包含下划线(虽然不推荐),在写正则匹配时需要格外小心,普通字符串匹配没问题,但如果用正则,下划线需要转义。
location中root与alias的区别
场景解析:假设域名是www.a-site.com,你想让www.a-site.com/static/访问/var/www/shared/static/目录,而不是/var/www/a-site/static/。
这时候用alias:
location /static/ {
alias /var/www/shared/static/;
}
如果写成root /var/www/shared/static/;,nginx实际访问的是/var/www/shared/static/static/,路径拼接出错了。
配置文件里的字符编码
不少用户在Windows下编辑配置文件,默认使用GBK编码,传到Linux服务器后nginx直接报错。务必用UTF-8无BOM格式保存,BOM头会让nginx第一个server_name解析异常。
多域名下配置SSL证书与80端口跳443
现在的网站基本都上HTTPS,nginx多域名绑定不同目录后,如何让每个域名自动跳转到自己的443端口目录?答案很简单:每个server块独立做跳转。
# 强制HTTP跳转HTTPS
server {
listen 80;
server_name www.a-site.com a-site.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name www.a-site.com a-site.com;
ssl_certificate /etc/nginx/ssl/a-site/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/a-site/privkey.pem;
root /var/www/a-site;
# ... 其他配置
}
优化策略:对于多站点的服务器,不要把ssl证书配置写在nginx.conf主文件里,每个网站独立配置文件,单独引用证书路径,维护时不用动全局文件,也不容易改错导致全站崩溃。
nginx多域名配置不生效怎么排查
配置写完了,结果域名访问的还是旧页面或默认页,多数情况下是下面几个原因:
- 浏览器缓存了301跳转,特别是设置了
return 301后,你改成别的配置,浏览器还记着旧跳转,用隐身模式或curl测试。 - 看access.log和error.log,nginx每个站点可以独立指定日志路径,直接看对应日志更快定位。
- 检查配置文件加载顺序。
/etc/nginx/nginx.conf里的include指令加载顺序决定了谁先谁后,如果你在sites-enabled里有旧配置,同样会影响。
推荐排查命令:
nginx -T
这个命令会打印所有加载的配置,你可以快速确认哪个server块生效,以及有没有语法被覆盖。
近期问答:一个服务器多个网站怎么配置才不冲突
两个域名都指向同一个IP,但服务器上还有Apache,怎么让nginx处理80端口?
要让nginx接管80,需要确认Apache没有占用80,如果你使用宝塔面板或类似面板,可在面板中把Apache端口改为80之外的端口,或者直接卸载Apache只用nginx,配置nginx多域名后,确保只有nginx监听80。
我用了多个域名,但有个域名的子路径需要访问另一个目录,怎么处理?
使用location精确匹配即可。
server {
server_name www.a-site.com;
location /special/ {
alias /var/www/other-project/;
}
}
这样www.a-site.com/special/会访问/var/www/other-project/,其他路径仍访问默认目录。
为什么我加了一个server_name _;之后,所有没绑定的域名都访问了默认页面?
server_name _;是一个约定俗成的写法,它不代表任何真实域名,而是用于捕获所有未匹配的请求,当它被标记为default_server后,任何没有对应server_name的域名请求都会进入这个块,如果你不想展示默认页面,可以像上文那样直接return 444或重定向到一个主域名。
nginx多域名绑定后的目录分流,核心就藏在这三件套里:server_name的匹配规则、root/alias的路径指向、default_server的兜底策略,搞懂这三件事,一个服务器挂几十个站点都不会乱,配置时先用nginx -t自检语法,再用curl验证响应,基本一次就能搞定多域名访问不同目录的需求。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/613208.html





