实例一:虚拟主机(多个域名,本地存文件)
配置
# 这是虚拟主机,不是反向代理
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 是中介,帮客户找房子)
发表回复