
文章目录
-
- [一、一个 IP 部署多个网站的原理](#一、一个 IP 部署多个网站的原理)
-
- [1. 基于域名区分(最常见)](#1. 基于域名区分(最常见))
- [2. 基于端口区分](#2. 基于端口区分)
- [3. 基于 IP 区分(需要多网卡)](#3. 基于 IP 区分(需要多网卡))
- [二、Nginx 的虚拟主机配置结构](#二、Nginx 的虚拟主机配置结构)
- 三、完整的多站点部署示例
-
- 场景:你的服务器上部署三个网站
- 步骤
-
- [1. 创建三个配置文件](#1. 创建三个配置文件)
- [2. 启用所有站点](#2. 启用所有站点)
- [3. DNS 解析配置](#3. DNS 解析配置)
- 四、匹配优先级规则
- 五、使用端口区分的示例
- 六、实际验证
-
- [查看 Nginx 加载了哪些配置](#查看 Nginx 加载了哪些配置)
- 查看访问日志区分
- 七、实际限制
- 八、管理命令速查
- 总结
一个服务器/一个 IP 地址完全可以部署多个网站 。这是 Nginx 的核心能力之一,通过 虚拟主机 机制实现。
一、一个 IP 部署多个网站的原理
1. 基于域名区分(最常见)
多个网站共享同一个 IP 和端口(80/443),Nginx 根据请求头中的 Host 字段区分:
用户访问 http://a.com → Nginx 匹配 server_name a.com → 返回网站 A
用户访问 http://b.com → Nginx 匹配 server_name b.com → 返回网站 B
用户访问 http://c.com → Nginx 匹配 server_name c.com → 返回网站 C
2. 基于端口区分
不同网站用不同端口:
http://服务器IP:80 → 网站 A
http://服务器IP:8080 → 网站 B
http://服务器IP:3000 → 网站 C
3. 基于 IP 区分(需要多网卡)
http://192.168.1.10 → 网站 A
http://192.168.1.11 → 网站 B
二、Nginx 的虚拟主机配置结构
配置文件层次
/etc/nginx/
├── nginx.conf # 主配置文件
├── sites-available/ # 所有站点配置(仓库)
│ ├── site1.com
│ ├── site2.com
│ └── rentalhousing
└── sites-enabled/ # 启用的站点(开关)
├── site1.com -> ../sites-available/site1.com
├── site2.com -> ../sites-available/site2.com
└── rentalhousing -> ../sites-available/rentalhousing
单个站点配置文件示例
/etc/nginx/sites-available/rentalhousing
nginx
server {
listen 80;
server_name rental.yourdomain.com; # 域名1
root /opt/rentalhousing/apps/web/dist;
index index.html;
location /api/ {
proxy_pass http://127.0.0.1:3000;
}
}
/etc/nginx/sites-available/another-site
nginx
server {
listen 80;
server_name another.com www.another.com; # 域名2
root /var/www/another-site;
index index.html;
}
三、完整的多站点部署示例
场景:你的服务器上部署三个网站
| 网站 | 域名 | 用途 |
|---|---|---|
| 租房系统 | rent.yourdomain.com | 你的主项目 |
| 博客 | blog.yourdomain.com | 技术博客 |
| 个人主页 | yourdomain.com | 个人介绍 |
步骤
1. 创建三个配置文件
bash
# 租房系统
sudo nano /etc/nginx/sites-available/rentalhousing
nginx
server {
listen 80;
server_name rent.yourdomain.com;
root /opt/rentalhousing/apps/web/dist;
location /api/ {
proxy_pass http://127.0.0.1:3000;
}
}
bash
# 博客
sudo nano /etc/nginx/sites-available/blog
nginx
server {
listen 80;
server_name blog.yourdomain.com;
root /var/www/blog;
index index.html;
}
bash
# 个人主页
sudo nano /etc/nginx/sites-available/homepage
nginx
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
root /var/www/homepage;
index index.html;
}
2. 启用所有站点
bash
# 创建符号链接
sudo ln -s /etc/nginx/sites-available/rentalhousing /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/blog /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/homepage /etc/nginx/sites-enabled/
# 测试配置
sudo nginx -t
# 重载 Nginx
sudo systemctl reload nginx
3. DNS 解析配置
在域名服务商处添加 A 记录:
rent.yourdomain.com A → 你的服务器 IP
blog.yourdomain.com A → 你的服务器 IP
yourdomain.com A → 你的服务器 IP
四、匹配优先级规则
当一个请求到达时,Nginx 按以下顺序匹配:
nginx
# 1. 精确域名匹配
server_name rent.yourdomain.com; # 最高优先级
# 2. 通配符开头
server_name *.yourdomain.com; # 匹配 sub.yourdomain.com
# 3. 通配符结尾
server_name rent.*; # 匹配 rent.anything
# 4. 正则表达式
server_name ~^(www\.)?(.+)$; # 最低优先级
默认站点(兜底配置)
nginx
server {
listen 80 default_server; # 默认站点
server_name _; # 匹配所有未匹配的域名
return 404; # 或返回其他页面
}
五、使用端口区分的示例
nginx
# 端口 80 → 网站 A
server {
listen 80;
server_name _;
root /var/www/site-a;
}
# 端口 8080 → 网站 B
server {
listen 8080;
server_name _;
root /var/www/site-b;
}
# 端口 3000 → 网站 C(直接代理到 Node.js)
server {
listen 3000;
server_name _;
location / {
proxy_pass http://127.0.0.1:3001;
}
}
六、实际验证
查看 Nginx 加载了哪些配置
bash
# 查看所有启用的配置
sudo nginx -T | grep "server_name"
# 测试某个域名是否匹配
curl -H "Host: rent.yourdomain.com" http://你的服务器IP
curl -H "Host: blog.yourdomain.com" http://你的服务器IP
查看访问日志区分
nginx
# 为不同站点配置不同日志文件
server {
server_name rent.yourdomain.com;
access_log /var/log/nginx/rentalhousing-access.log;
error_log /var/log/nginx/rentalhousing-error.log;
}
server {
server_name blog.yourdomain.com;
access_log /var/log/nginx/blog-access.log;
error_log /var/log/nginx/blog-error.log;
}
七、实际限制
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 域名区分 | 用户体验好、可无限扩展 | 需要域名 | 生产环境 |
| 端口区分 | 无需域名、配置简单 | 不友好、需要记住端口 | 测试、内部系统 |
| 路径区分 | 单一域名 | 容易冲突、URL 不美观 | 临时方案 |
路径区分示例(单一域名下)
nginx
server {
server_name yourdomain.com;
location /rental/ {
alias /opt/rentalhousing/apps/web/dist/;
}
location /blog/ {
alias /var/www/blog/;
}
}
八、管理命令速查
bash
# 列出所有可用配置
ls /etc/nginx/sites-available/
# 列出已启用的配置
ls -la /etc/nginx/sites-enabled/
# 启用站点
sudo ln -s /etc/nginx/sites-available/站点名 /etc/nginx/sites-enabled/
# 禁用站点(保留配置)
sudo rm /etc/nginx/sites-enabled/站点名
# 重新加载配置
sudo systemctl reload nginx
# 查看错误日志
sudo tail -f /var/log/nginx/error.log
总结
一个服务器/一个 IP 可以部署无限多个网站,限制只是:
- 服务器资源(CPU、内存、带宽)
- 文件描述符限制(Linux 系统配置)
Nginx 通过 server_name 和 listen 的组合,结合 sites-available/sites-enabled 目录结构,实现了清晰、灵活的站点管理。