微信优化

weixinyouhua

Nginx配置多站点怎么做?Nginx多站点配置详细教程

2026-09-14 08:21:28

一台云服务器要跑多个网站,核心就是利用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

Nginx配置多站点怎么做?Nginx多站点配置详细教程

放一个简单的首页文件,方便测试:

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配置多站点怎么做?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

Nginx配置多站点怎么做?Nginx多站点配置详细教程

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会把请求精准路由到对应站点。
但如果某个站点程序存在安全漏洞,服务器本身可能被入侵,从而影响其他站点。
生产环境建议对不同站点做进程隔离或容器隔离,至少保证目录权限分离。

相关文章

2024年,SaaS软件行业碰到获客难、增长慢等问题吗?

我们努力让每一次邂逅总能超越期待