利用Nginx实现一个IP部署多个网站
作者:江上清风山间明月
文章主要介绍了如何在一个服务器/一个IP地址上部署多个网站虚拟主机的方法,主要包括基于域名、端口和IP地址的区分方式,并详细描述了Nginx的虚拟主机配置结构和匹配优先,此外,文章还提供了完整的多站点部署示例、限制方案以及管理命令速查,需要的朋友可以参考下
一个服务器/一个 IP 地址完全可以部署多个网站虚拟主机
一、一个 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
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
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. 创建三个配置文件
# 租房系统 sudo nano /etc/nginx/sites-available/rentalhousing
server {
listen 80;
server_name rent.yourdomain.com;
root /opt/rentalhousing/apps/web/dist;
location /api/ {
proxy_pass http://127.0.0.1:3000;
}
}
# 博客 sudo nano /etc/nginx/sites-available/blog
server {
listen 80;
server_name blog.yourdomain.com;
root /var/www/blog;
index index.html;
}
# 个人主页 sudo nano /etc/nginx/sites-available/homepage
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
root /var/www/homepage;
index index.html;
}
2. 启用所有站点
# 创建符号链接 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 按以下顺序匹配:
# 1. 精确域名匹配 server_name rent.yourdomain.com; # 最高优先级 # 2. 通配符开头 server_name *.yourdomain.com; # 匹配 sub.yourdomain.com # 3. 通配符结尾 server_name rent.*; # 匹配 rent.anything # 4. 正则表达式 server_name ~^(www\.)?(.+)$; # 最低优先级
默认站点(兜底配置)
server {
listen 80 default_server; # 默认站点
server_name _; # 匹配所有未匹配的域名
return 404; # 或返回其他页面
}
五、使用端口区分的示例
# 端口 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 加载了哪些配置
# 查看所有启用的配置 sudo nginx -T | grep "server_name" # 测试某个域名是否匹配 curl -H "Host: rent.yourdomain.com" http://你的服务器IP curl -H "Host: blog.yourdomain.com" http://你的服务器IP
查看访问日志区分
# 为不同站点配置不同日志文件
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 不美观 | 临时方案 |
路径区分示例(单一域名下)
server {
server_name yourdomain.com;
location /rental/ {
alias /opt/rentalhousing/apps/web/dist/;
}
location /blog/ {
alias /var/www/blog/;
}
}
八、管理命令速查
# 列出所有可用配置 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 目录结构,实现了清晰、灵活的站点管理。
以上就是利用Nginx实现一个IP部署多个网站的详细内容,更多关于Nginx一个IP部署多个网站的资料请关注脚本之家其它相关文章!
