Nginx 正向代理与反向代理完全指南

Nginx 正向代理与反向代理完全指南

_
---
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+ 版本测试通过。生产环境使用时,请根据实际需求调整超时时间、缓存策略等参数。

git回退版本 2026-02-25

评论区