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_name 和 listen 的组合,结合 sites-available/sites-enabled 目录结构,实现了清晰、灵活的站点管理。

相关推荐
fengkai454514 分钟前
十二、Redis -2
运维·数据库·redis·容器
哎呦,帅小伙哦32 分钟前
进程监控工具——htop
linux·运维·服务器
深圳恒讯1 小时前
海外服务器延迟高怎么解决?从线路到TCP协议的6层排查清单
运维·服务器·tcp/ip
北龙云海1 小时前
AI驱动数据库运维变革:北龙云海智能巡检平台实践与展望
运维·数据库·人工智能
AI职业加油站1 小时前
AI 校招现状:大模型应用工程师证书,助力简历能力证明
大数据·运维·人工智能·学习·职场发展
Lsetea3 小时前
curl报58 unable to set private key file:客户端证书与私钥加载排查
运维·https·ssl证书·openssl·curl
天远Date Lab3 小时前
零信任架构实战:基于天远学籍核验三要素构建自动化竞赛资格审查网关
运维·人工智能·架构·自动化
Lsetea3 小时前
OpenSSL报certificate is not yet valid:error 9与notBefore时间排查
linux·运维·https·ssl证书·openssl
魔法阵维护师3 小时前
Linux 命令行入门踩坑记录:从 VMware 装系统到文件管理
linux·运维·服务器
飞飞传输4 小时前
业务系统文件安全检测怎么做?生物医药企业选型与建设指南
大数据·运维·安全