---
title: 'Nginx 正向代理与反向代理完全指南'
description: '深入理解 Nginx 的正向代理和反向代理,从概念到实战配置,一文掌握代理服务器的核心用法'
pubDate: '2026-03-20'
heroImage: '/images/nginx-proxy.png'
category: '运维'
tags: ['nginx', '代理', '运维', '服务器配置']
---
## 前言
Nginx 是目前最流行的 Web 服务器之一,其核心功能之一就是**代理服务**。但很多人对"正向代理"和"反向代理"的概念感到困惑。本文将通过图解和完整的配置文件,帮你彻底理解这两种代理方式的区别与应用场景。
---
## 一图看懂:正向代理 vs 反向代理
```
┌─────────────────────────────────────────────────────────────────┐
│ 正向代理 (Forward Proxy) │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 客户端 A ──┐ │
│ ├──→ [代理服务器] ──→ 目标服务器 (google.com) │
│ 客户端 B ──┘ │
│ │
│ ✅ 客户端知道目标服务器是谁 │
│ ✅ 目标服务器不知道真实客户端是谁(隐藏客户端) │
│ ✅ 代理代表【客户端】去访问 │
│ │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 反向代理 (Reverse Proxy) │
├─────────────────────────────────────────────────────────────────┤
│ │
│ [代理服务器] ←── 客户端 │
│ │ │
│ ┌───────────────┼───────────────┐ │
│ ↓ ↓ ↓ │
│ 后端服务器1 后端服务器2 后端服务器3 │
│ │
│ ✅ 客户端不知道后端服务器是谁 │
│ ✅ 代理代表【服务器】接收请求 │
│ ✅ 常用于负载均衡、隐藏后端、SSL 终结 │
│ │
└─────────────────────────────────────────────────────────────────┘
```
---
## 核心区别对比表
| 特性 | 正向代理 | 反向代理 |
|------|----------|----------|
| **代理对象** | 客户端 | 服务器端 |
| **谁指定目标** | 客户端指定 | 代理服务器决定 |
| **隐藏对象** | 隐藏客户端 IP | 隐藏后端服务器 |
| **典型场景** | 翻墙、突破访问限制 | 负载均衡、安全防护、缓存 |
| **Nginx 角色** | 客户端的代理 | 服务器的代理 |
| **配置特点** | `proxy_pass $scheme://$http_host` | `proxy_pass http://backend` |
---
## 正向代理详解
### 什么是正向代理?
想象你在公司,公司网络禁止访问某些网站。你可以通过一个允许访问这些网站的中介服务器(代理)来间接访问。这就是**正向代理**——代理客户端去访问目标服务器。
### 典型应用场景
- 🌍 **突破网络限制**:访问被屏蔽的网站
- 🔒 **隐藏真实 IP**:保护客户端隐私
- 📦 **缓存加速**:代理服务器缓存常用资源
- 🏢 **企业内网管控**:统一出口,记录访问日志
### HTTP 正向代理配置
```nginx
server {
listen 8080;
server_name proxy.example.com;
# 设置代理请求的最大允许大小
client_max_body_size 10M;
location / {
# 转发到客户端指定的目标服务器
# $http_host 是客户端请求的目标主机
proxy_pass $scheme://$http_host$request_uri;
# 传递真实客户端信息
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 超时设置
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}
```
**使用方式**:浏览器设置代理为 `proxy.example.com:8080`,然后访问任意网站。
### HTTPS 正向代理(CONNECT 隧道)
HTTPS 代理需要使用 CONNECT 方法建立隧道:
```nginx
server {
listen 8443;
server_name proxy.example.com;
location / {
# 开启隧道模式(关键!)
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass $scheme://$http_host:$server_port;
proxy_set_header Host $http_host;
# 长超时
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
}
}
```
---
## 反向代理详解
### 什么是反向代理?
想象你访问 `baidu.com`,实际上百度有很多后端服务器。你不知道具体访问的是哪台服务器,你只知道访问 `baidu.com`。这就是**反向代理**——代理服务器接收请求,然后转发给后端服务器。
### 典型应用场景
- ⚖️ **负载均衡**:将请求分发到多台服务器
- 🔐 **SSL 终结**:统一处理 HTTPS,后端使用 HTTP
- 🛡️ **安全防护**:隐藏后端服务器真实 IP
- 📦 **静态缓存**:缓存静态资源,减轻后端压力
- 🌐 **跨域处理**:统一处理 CORS
### 基础反向代理配置
```nginx
server {
listen 80;
server_name myapp.example.com;
location / {
# 代理到后端服务器
proxy_pass http://127.0.0.1:8080;
# 设置 Host 头(后端需要知道访问的域名)
proxy_set_header Host $host;
# 传递真实客户端 IP
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 超时设置
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
}
# 静态文件本地处理(不经过代理)
location /static/ {
alias /var/www/static/;
expires 30d;
}
}
```
### 负载均衡配置
```nginx
# 定义后端服务器组
upstream backend {
# 权重模式:weight 越高,分到的请求越多
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=2;
server 192.168.1.12:8080 weight=1;
# 备用服务器(主服务器都不可用时启用)
server 192.168.1.20:8080 backup;
# 健康检查参数
max_fails 3;
fail_timeout 30s;
}
server {
listen 80;
server_name myapp.example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
```
### 负载均衡策略
| 策略 | 配置方式 | 适用场景 |
|------|----------|----------|
| **轮询(默认)** | 无需配置 | 服务器性能相近 |
| **权重** | `weight=N` | 服务器性能不同 |
| **最少连接** | `least_conn;` | 请求处理时间差异大 |
| **IP 哈希** | `ip_hash;` | 需要会话保持 |
| **URL 哈希** | `hash $request_uri;` | 缓存场景 |
### WebSocket 代理
```nginx
location /ws/ {
proxy_pass http://backend;
# WebSocket 必须配置
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 长连接超时
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
```
---
## 常用配置项速查表
| 配置项 | 说明 | 推荐值 |
|--------|------|--------|
| `proxy_pass` | 代理目标地址 | `http://127.0.0.1:8080` |
| `proxy_set_header Host` | 设置 Host 头 | `$host` |
| `proxy_set_header X-Real-IP` | 传递真实 IP | `$remote_addr` |
| `proxy_connect_timeout` | 连接后端超时 | `30s` |
| `proxy_read_timeout` | 读取响应超时 | `30s` |
| `proxy_buffering` | 是否缓冲响应 | `on` |
| `proxy_cache` | 启用缓存 | `on` |
| `keepalive` | 连接池大小 | `32` |
---
## 实战命令
```bash
# 检查配置语法
nginx -t
# 重新加载配置(不断流)
nginx -s reload
# 停止 Nginx
nginx -s stop
# 查看 Nginx 状态
systemctl status nginx
```
---
## 总结
- **正向代理**:代理客户端,隐藏客户端 IP,突破访问限制
- **反向代理**:代理服务器,隐藏后端 IP,负载均衡和安全防护
选择哪种代理方式,取决于你的需求:
- 需要帮客户端访问外部资源 → **正向代理**
- 需要保护后端服务器、分发流量 → **反向代理**
---
> 💡 **提示**:本文所有配置基于 Nginx 1.24+ 版本测试通过。生产环境使用时,请根据实际需求调整超时时间、缓存策略等参数。
Nginx 正向代理与反向代理完全指南
_
新故事即将发生
git回退版本
2026-02-25