nginx

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > nginx > Nginx一个IP部署多个网站

利用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 可以部署无限多个网站,限制只是:

Nginx 通过 server_namelisten 的组合,结合 sites-available/sites-enabled 目录结构,实现了清晰、灵活的站点管理。

以上就是利用Nginx实现一个IP部署多个网站的详细内容,更多关于Nginx一个IP部署多个网站的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文