一台云服务器要跑多个网站,核心就是利用nginx的虚拟主机功能,通过不同域名、端口或IP把请求分流到对应站点目录。
下面按实际部署顺序,把nginx配置多站点的原理、步骤、常见坑和证书部署一次说清。
一台云服务器用nginx配置多个网站的核心原理
nginx本身是一个高性能反向代理和静态资源服务器,想让一台机器同时承载多个独立网站,靠的是server块,每个server块代表一个虚拟主机,nginx根据请求中的Host头、端口号或目标IP,把流量交给对应的站点配置。
nginx虚拟主机配置对比:域名、端口、IP三种方式
多数情况下,用基于域名的虚拟主机最省资源,一个IP加一个80端口,就能挂几十个站点,nginx读取HTTP请求里的Host字段,匹配不同server_name。
| 方式 | 资源占用 | 配置难度 | 适用场景 |
|---|---|---|---|
| 基于域名 | 最低,共享IP和端口 | 低 | 生产环境主流方案 |
| 基于端口 | 较高,需开放额外端口 | 中 | 测试环境或临时站点 |
| 基于IP | 最高,需多个公网IP | 高 | 特殊隔离需求,很少用 |
行业共识认为,生产环境优先选择基于域名的nginx虚拟主机配置,既能节省服务器成本,也方便后续扩展HTTPS。
nginx多域名站点配置的适用场景
常见的场景是:一台2核4G的云服务器,同时跑企业官网、个人博客、小程序API,三个域名都解析到同一台服务器的公网IP,nginx根据域名分发到不同目录。
国内服务器(如北京地域)部署多域名站点时,域名必须完成ICP备案,否则80端口访问可能被机房拦截。
nginx配置多个网站的完整实操步骤
下面以Ubuntu 22.04系统、nginx 1.24版本为例,演示从零配置两个域名站点。
准备环境与目录结构
先安装nginx:
sudo apt update sudo apt install nginx -y
创建两个站点的根目录:
sudo mkdir -p /var/www/site1.com/html sudo mkdir -p /var/www/site2.com/html

放一个简单的首页文件,方便测试:
echo "site1 running" | sudo tee /var/www/site1.com/html/index.html echo "site2 running" | sudo tee /var/www/site2.com/html/index.html
把目录归属给当前用户或www-data:
sudo chown -R www-data:www-data /var/www/site1.com/html sudo chown -R www-data:www-data /var/www/site2.com/html
创建nginx站点配置文件
nginx的主配置通常在/etc/nginx/nginx.conf,里面会引入sites-enabled目录下的子配置。
Debian系系统推荐使用sites-available和sites-enabled两个目录管理虚拟主机。
创建第一个站点配置:
sudo vim /etc/nginx/sites-available/site1.com
server {
listen 80;
server_name site1.com www.site1.com;
root /var/www/site1.com/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
第二个站点配置类似:
sudo vim /etc/nginx/sites-available/site2.com
server {
listen 80;
server_name site2.com www.site2.com;
root /var/www/site2.com/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
启用站点并测试
默认站点配置可以先删掉或忽略,通过软链接启用新配置:
sudo rm -f /etc/nginx/sites-enabled/default sudo ln -s /etc/nginx/sites-available/site1.com /etc/nginx/sites-enabled/ sudo ln -s /etc/nginx/sites-available/site2.com /etc/nginx/sites-enabled/
每次修改后先做语法检查:
sudo nginx -t
看到syntax is ok和test is successful后,平滑重载:
sudo systemctl reload nginx
本地测试时,可以修改/etc/hosts文件,把域名手动指向服务器IP:
168.1.100 site1.com www.site1.com
192.168.1.100 site2.com www.site2.com
浏览器分别访问http://site1.com和http://site2.com,看到不同首页即配置成功。
nginx多站点配置中容易踩的坑

即使配置流程正确,实际部署仍可能遇到问题。
配置文件权限与软链接路径
软链接必须使用绝对路径创建,否则nginx会报错。
正确的做法是:
sudo ln -s /etc/nginx/sites-available/site1.com /etc/nginx/sites-enabled/
如果用了相对路径,重启后链接会失效。
站点根目录的权限要给足,避免出现403 Forbidden,通常www-data用户需要对站点目录有读和执行权限。
防火墙与云安全组放行端口
多数云服务器在系统之外还有一层安全组,只开放80和443端口时,基于端口的虚拟主机就无法直接访问。
如果配置了非标准端口(如8080、8888),需要在安全组和系统防火墙同时放行。
检查系统防火墙:
sudo ufw status sudo ufw allow 80/tcp sudo ufw allow 443/tcp
云厂商控制台的安全组规则也要手动添加入方向规则。
server_name匹配优先级
nginx的server_name支持精确匹配、通配符匹配和正则匹配。
当多个server块的server_name都能匹配请求域名时,精确匹配优先于通配符,通配符优先于正则。
生产环境建议把默认站点放在第一个server块中,或者单独配置default_server,避免未知域名落到错误站点。
nginx多站点配置如何部署SSL证书
现在HTTPS基本是必选项,nginx多站点配置ssl证书有两种常见方式:每个域名独立证书,或者使用多域名SAN证书。
独立证书与多域名证书的配置对比
| 类型 | 费用 | 维护成本 | 适用场景 |
|---|---|---|---|
| 独立证书 | 免费可选(Let’s Encrypt) | 每个域名单独续期 | 域名数量少 |
| 多域名SAN证书 | 部分免费、部分付费 | 一次部署多域名 | 域名数量多,希望统一管理 |
业内专家指出,小规模站点用Let’s Encrypt独立证书足够,管理也不复杂。
以Certbot为例,安装后执行:
sudo apt install certbot python3-certbot-nginx -y sudo certbot --nginx -d site1.com -d www.site1.com sudo certbot --nginx -d site2.com -d www.site2.com

Certbot会自动修改nginx配置,把80端口跳转到443,并配置证书路径。
证书文件通常位于/etc/letsencrypt/live/目录,nginx配置中会加入:
listen 443 ssl; ssl_certificate /etc/letsencrypt/live/site1.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/site1.com/privkey.pem;
多个站点共用证书的注意点
如果使用SAN证书,配置时每个server块都要指向同一份证书文件。
同时要保证server_name与证书中的SAN列表完全匹配,否则浏览器会报证书错误。
部署后可用openssl s_client -connect site1.com:443 -servername site1.com检查证书链是否完整。
nginx配置多站点的核心就一句话:每个域名写一个server块,靠server_name分流。
按上面的步骤走通一次,后续增加新站点只是复制配置、改域名和根目录、再做软链接和重载而已,排查问题时优先看nginx -t的输出和/var/log/nginx/error.log,基本能覆盖大部分故障。
Q&A
nginx配置多个网站时泛域名怎么设置?
在server_name中使用通配符即可。
配置server_name .example.com;会匹配所有以.example.com结尾的二级域名。
如果需要同时匹配根域名和泛域名,写作:
server_name example.com .example.com;
注意通配符匹配优先级低于精确匹配,且不能跨级匹配,.example.com不会匹配a.b.example.com。
nginx多站点配置二级域名需要备案吗?
国内服务器所有解析到公网IP的域名,无论主域名还是二级域名,都需要完成ICP备案。
据工信部规定,未备案域名不允许提供HTTP/HTTPS服务,机房通常会在80端口直接拦截。
如果只是本地测试或使用香港、海外地域服务器,则不受此限制。
一台云服务器部署多个网站nginx会互相影响吗?
正常情况下不会,每个站点的server块和根目录相互独立,nginx会把请求精准路由到对应站点。
但如果某个站点程序存在安全漏洞,服务器本身可能被入侵,从而影响其他站点。
生产环境建议对不同站点做进程隔离或容器隔离,至少保证目录权限分离。
