不少做个人网站或者小型项目的朋友都会遇到同一个问题:手上有两三个域名,分别对应不同的站点,但服务器预算有限,只能买一台。其实nginx在设计之初就考虑到了这种场景,通过虚拟主机(Virtual Host)机制,一台服务器、一个IP、一个80端口,就能同时承载多个互不干扰的网站。这篇文章就来把配置方法、背后的原理以及这样做的利弊一次性讲清楚。

一、nginx虚拟主机的工作原理
要理解虚拟主机,先要明白nginx是如何区分不同请求的。所有请求到达服务器时,nginx首先拿到的是HTTP请求头中的Host字段,也就是浏览器地址栏里输入的域名。nginx会遍历所有已加载的server块,根据server_name指令去匹配这个Host值,匹配成功的server块就会负责处理这次请求。
这意味着,虽然多个站点共用同一个80端口,但在nginx看来它们是完全独立的虚拟主机,各自拥有自己的根目录、日志文件、错误页面,甚至可以各自使用不同的PHP版本或后端代理。如果没有任何一个server_name匹配成功,请求会落到默认server上,也就是配置中第一个出现的server块,或者显式标记了default_server的那个。
除了基于域名的虚拟主机,nginx还支持基于IP和基于端口的方式。基于IP需要服务器有多个IP地址,在云服务器普遍按IP收费的今天成本较高;基于端口则要求用户访问时带端口号,体验很差。所以在实际生产环境中,基于域名的虚拟主机几乎是唯一的主流选择。
二、具体配置步骤与示例
1. 规划目录结构
建议为每个站点建立独立的目录,方便备份和迁移。例如在/var/www下分别为两个站点创建目录,并放入各自的首页文件。同时提前把两个域名的A记录都解析到这台服务器的公网IP上,这是配置能生效的前提。
2. 编写配置文件
推荐的做法是为每个站点单独写一个配置文件,放在/etc/nginx/conf.d/目录下,nginx主配置文件中已经有include /etc/nginx/conf.d/*.conf;这行,会自动加载该目录下所有配置。下面是两个站点的完整示例:
# /etc/nginx/conf.d/site-a.conf
server {
listen 80;
server_name www.aaa.com aaa.com;
root /var/www/site-a;
index index.html index.htm;
access_log /var/log/nginx/site-a.access.log;
error_log /var/log/nginx/site-a.error.log;
}
# /etc/nginx/conf.d/site-b.conf
server {
listen 80;
server_name www.bbb.com bbb.com;
root /var/www/site-b;
index index.html index.htm;
access_log /var/log/nginx/site-b.access.log;
error_log /var/log/nginx/site-b.error.log;
}配置完成后执行nginx -t检查语法,确认没问题再执行nginx -s reload平滑重载。此时在浏览器分别访问两个域名,看到的会是两个完全不同的站点。
3. 使用通配符与正则匹配
server_name的写法很灵活。可以写多个域名用空格分隔,也可以用通配符,例如*.aaa.com能匹配所有子域名。还支持以波浪线开头的正则表达式,比如~^(www\.)?aaa\.com$,适合更复杂的匹配需求。需要注意优先级顺序:精确匹配优先于开头的通配符,再其次是结尾的通配符,最后才是正则匹配。理解这个优先级在排查“为什么访问到了错误站点”时非常关键。
4. 配合反向代理托管动态站点
如果站点不是静态页面,而是跑在本地某个端口上的应用(比如Node.js监听3000端口),可以用proxy_pass把请求转发过去:
server {
listen 80;
server_name app.aaa.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}这样一台服务器上可以同时挂静态站点、博客系统、API服务,互不干扰。后续要上HTTPS的话,为每个server块分别申请证书并配置443监听即可,配合certbot工具可以自动完成证书申请和续期。
三、多域名共用一台服务器的优缺点分析
优点
最直接的好处是省钱。一台2核4G的云服务器一年几百到上千元,如果每个站点单独买一台,成本会成倍增长。对于流量不大的个人站点、企业官网、测试环境来说,合并部署能把资源利用率拉满。
其次是运维便利。所有站点集中在一处,系统更新、安全加固、备份策略只需要做一遍,监控报警也是统一接入。配置文件按站点拆分后,新增或下线站点只需增删一个文件,改动范围清晰可控。
缺点
风险集中是最大的问题。一旦服务器宕机、磁盘损坏或者遭遇攻击,所有站点同时不可用,业务之间没有隔离。任何一个站点被入侵,攻击者都可能顺着系统横向影响到其他站点,这在对安全性要求高的场景下是硬伤。
资源争抢也不容忽视。如果某个站点出现慢查询、内存泄漏或者突发流量,会挤占其他站点的CPU和内存。可以通过对PHP-FPM等后端进程做进程池隔离、用cgroup限制资源来缓解,但配置复杂度会明显上升。
另外还有运维细节上的坑:日志文件变多后需要配置logrotate避免磁盘打满;server_name优先级匹配不当会导致请求落到错误站点;证书续期脚本要覆盖到所有域名。这些都会让排障变得比单站点复杂。
四、什么情况下适合,如何选择方案
如果是个人博客、作品集、小型企业官网这类访问量低、安全要求不高的场景,一台服务器配多个域名是非常划算的方案,建议选择2核4G以上的配置,并按站点拆分nginx配置文件。
如果其中有站点涉及用户数据、支付或者生产业务,就建议至少把核心业务独立出去,可以用容器做进程级隔离,或者直接分机器部署。介于两者之间的,可以考虑在一台机器上用Docker跑多个容器,每个容器映射不同端口,nginx只做统一的入口网关,这样既省了服务器,又获得了不错的隔离性。
最后提一个容易忽略的点:国内服务器绑定多个域名时,每个域名都需要完成ICP备案,未备案的域名解析到国内服务器会被阻断访问。如果使用境外服务器则无此要求,但访问速度会受影响。把这些因素都考虑进去,再决定怎么部署,才是比较稳妥的做法。
nginx虚拟主机配置多域名绑定服务器配置修改时间:2026-09-09 06:28:34