Nginx一个IP部署多个网站

文章目录

一个服务器/一个 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_namelisten 的组合,结合 sites-available/sites-enabled 目录结构,实现了清晰、灵活的站点管理。

相关推荐
2601_9622184730 分钟前
万象生鲜系统多仓协同同步技术支撑生鲜企业多仓模式数字化转型
大数据·运维·微服务·云原生·架构
mooooooooooye35 分钟前
SSH 工具越用越乱,Xterminal 先清掉这三类失效连接
运维·ssh·github
qetfw36 分钟前
Debian lftp FTP 客户端使用:登录、目录切换与文件传输
linux·运维·debian
2401_862880821 小时前
Linux应用层开发 --- 管道
linux·运维·c语言
隔窗听雨眠1 小时前
TDengine在AIOps中的硬核实战:从时序数据存储到智能运维的完整落地路径
大数据·运维·tdengine
2601_962128261 小时前
Nginx知识详解(理论+实战更易懂)
运维·nginx
Elastic 中国社区官方博客1 小时前
从建议到修复的 4 个阶段:使用 Elastic Workflows 实现人在回路中的自动化
运维·数据库·人工智能·后端·elasticsearch·ai·自动化
段帅星2 小时前
Mac + iTerm2 运维终端配置参考
运维
智恒百亿2 小时前
从开箱到跑通大模型:一台 RTX 5090 八卡服务器的部署实录(附踩坑清单)
运维·服务器
沫璃染墨2 小时前
《从零入门Linux系统篇(三十二):文件篇·五——深入理解磁盘:从物理结构到LBA寻址》
linux·运维·服务器·系统架构·硬件架构