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 目录结构,实现了清晰、灵活的站点管理。

相关推荐
李白的天不白4 小时前
如何申请外国谷歌账号
运维·服务器·php
Shadow(⊙o⊙)4 小时前
进程分析2.0——进程退出、进程等待-Linux重要经典模块
linux·运维·服务器·开发语言·c++·学习
pengyi8710154 小时前
高匿代理核心原理详解,隐藏真实IP实现无痕网络访问
linux·运维·服务器·网络·tcp/ip
草莓熊Lotso4 小时前
【Linux系统加餐】从原理到实战:System V消息队列全解析 + 基于责任链模式的工业级封装
linux·运维·服务器·c语言·c++·人工智能·责任链模式
小明同学014 小时前
计算机网络编程---手写TCP服务器(三)
服务器·tcp/ip·计算机网络
草莓熊Lotso4 小时前
【Linux网络】从 0 到工业级:TCP 服务器多线程 / 线程池全实现 + 远程命令执行实战
linux·运维·服务器·网络·人工智能·网络协议·tcp/ip
盛世宏博北京4 小时前
物联网赋能档案保护——档案馆“八防”温湿度智能监控系统实施方案
运维·服务器·网络
Benszen4 小时前
docker简介
运维·docker·容器
手揽回忆怎么睡4 小时前
云服务器部署
运维·服务器