虚拟主机 vs 反向代理 实例区分


实例一:虚拟主机(多个域名,本地存文件)

配置

# 这是虚拟主机,不是反向代理
server {
    listen 80;
    server_name a.com;           # 域名 a.com
    root /var/www/a;              # 本地目录
    index index.html;
}

server {
    listen 80;
    server_name b.com;           # 域名 b.com
    root /var/www/b;              # 本地目录
    index index.html;
}

server {
    listen 80;
    server_name c.com;           # 域名 c.com
    root /var/www/c;              # 本地目录
    index index.html;
}

架构图

用户访问 a.com ──→ Nginx ──→ 读取 /var/www/a/index.html
用户访问 b.com ──→ Nginx ──→ 读取 /var/www/b/index.html
用户访问 c.com ──→ Nginx ──→ 读取 /var/www/c/index.html
                          ↑
                      文件都在本机

特征

  • ✅ 多个 server
  • ✅ 不同域名指向本地不同目录
  • ❌ 没有 proxy_pass
  • 📌 这是虚拟主机

实例二:反向代理(多个域名,转发到后端)

配置

# 这是反向代理
server {
    listen 80;
    server_name a.com;           # 域名 a.com

    location / {
        proxy_pass http://192.168.1.100;  # 转发到后端
        proxy_set_header Host a.com;
    }
}

server {
    listen 80;
    server_name b.com;           # 域名 b.com

    location / {
        proxy_pass http://192.168.1.100;  # 转发到同一个后端
        proxy_set_header Host b.com;
    }
}

server {
    listen 80;
    server_name c.com;           # 域名 c.com

    location / {
        proxy_pass http://192.168.1.100;  # 转发到同一个后端
        proxy_set_header Host c.com;
    }
}

# 后端服务器配置(192.168.1.100上)
# server {
#     listen 80;
#     server_name a.com b.com c.com;
#     root /var/www/$host;
# }

架构图

用户访问 a.com ──→ Nginx ──→ 转发 ──→ 后端服务器 192.168.1.100
用户访问 b.com ──→ Nginx ──→ 转发 ──→ 后端服务器 192.168.1.100
用户访问 c.com ──→ Nginx ──→ 转发 ──→ 后端服务器 192.168.1.100
                          ↑                      ↑
                      Nginx 只负责转发        真正存内容的地方

特征

  • ✅ 多个 server
  • ✅ 不同域名都转发到同一台后端
  • ✅ 有 proxy_pass
  • 📌 这是反向代理

实例三:混合模式(部分虚拟主机,部分反向代理)

配置

# 虚拟主机:静态网站直接返回
server {
    listen 80;
    server_name static.com;      # 静态网站
    root /var/www/static;
    index index.html;
}

# 反向代理:动态网站转发给后端
server {
    listen 80;
    server_name dynamic.com;     # 动态网站

    location / {
        proxy_pass http://192.168.1.200:8080;
        proxy_set_header Host dynamic.com;
    }
}

# 反向代理:API 转发给另一台后端
server {
    listen 80;
    server_name api.com;         # API 服务

    location / {
        proxy_pass http://192.168.1.201:3000;
        proxy_set_header Host api.com;
    }
}

架构图

static.com ──→ Nginx ──→ 本地文件 /var/www/static/
dynamic.com ──→ Nginx ──→ 转发 ──→ 192.168.1.200:8080
api.com ──────→ Nginx ──→ 转发 ──→ 192.168.1.201:3000

实例四:同一个域名下区分(虚拟主机做不到的)

反向代理才能实现的

server {
    listen 80;
    server_name example.com;

    # 图片请求转发到图片服务器
    location /images/ {
        proxy_pass http://image-server:8080;
    }

    # API 请求转发到应用服务器
    location /api/ {
        proxy_pass http://app-server:3000;
    }

    # 其他请求转发到 PHP 服务器
    location / {
        proxy_pass http://php-server:9000;
    }
}

架构图

                        /images/ ──→ 图片服务器
                       /
example.com ──→ Nginx ── /api/ ────→ 应用服务器
                       \
                        / ────────→ PHP服务器

这种”根据路径转发到不同后端”的功能,只有反向代理能做到,虚拟主机不行。


实例五:负载均衡(反向代理的典型应用)

配置

# 定义一组后端服务器
upstream backend {
    server 192.168.1.10:8080 weight=3;
    server 192.168.1.11:8080 weight=2;
    server 192.168.1.12:8080 backup;
}

server {
    listen 80;
    server_name shop.com;

    location / {
        proxy_pass http://backend;  # 反向代理到后端集群
        proxy_set_header Host $host;
    }
}

架构图

                       ┌─→ 192.168.1.10:8080 (weight=3)
用户 ──→ shop.com ──→ Nginx ──→ 192.168.1.11:8080 (weight=2)
                       └─→ 192.168.1.12:8080 (backup)

这是反向代理的高级应用——负载均衡


六、快速判断表

特征虚拟主机反向代理
配置中有 proxy_pass❌ 无✅ 有
内容存在哪里本机磁盘后端服务器
能否转发到多台后端❌ 不能✅ 能
能否做负载均衡❌ 不能✅ 能
能否根据路径分发❌ 不能✅ 能(如 /api 去 A,/images 去 B)
Nginx 角色Web 服务器代理服务器

七、一句话记忆法

  • 虚拟主机:多个域名,各读各的本地文件(Nginx 是房东,自己住)
  • 反向代理:多个域名,都转发给后端(Nginx 是中介,帮客户找房子)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注