150 lines
5.7 KiB
Markdown
150 lines
5.7 KiB
Markdown
---
|
||
title: "反向代理"
|
||
type: concept
|
||
aliases: [Reverse Proxy, 反向代理服务器]
|
||
tags: [network, proxy, infrastructure, web-server]
|
||
---
|
||
|
||
# 反向代理
|
||
|
||
## Definition
|
||
**反向代理**(Reverse Proxy)是一种服务器架构模式,代理服务器位于客户端与源服务器之间,代表源服务器接收客户端请求,并对请求进行转发、负载均衡或缓存。与正向代理(代理客户端)不同,反向代理对客户端透明,客户端不知道真实服务器的存在。
|
||
|
||
## Architecture
|
||
|
||
```
|
||
┌─────────────────────────────────────┐
|
||
│ Reverse Proxy │
|
||
│ (Caddy / Nginx / Apache) │
|
||
│ │
|
||
Client Request → │ example.com → localhost:8080 │
|
||
(隐藏真实服务器) │ api.example.com → localhost:3000 │
|
||
└──────────────┬──────────────────────┘
|
||
│
|
||
┌──────────────┼──────────────────────┐
|
||
│ │ │
|
||
▼ ▼ ▼
|
||
┌──────────┐ ┌──────────┐ ┌──────────┐
|
||
│ Server 1 │ │ Server 2 │ ... │ Server N │
|
||
│ :8080 │ │ :3000 │ │ :5000 │
|
||
└──────────┘ └──────────┘ └──────────┘
|
||
```
|
||
|
||
## Common Use Cases
|
||
|
||
### 1. 多服务域名复用
|
||
单台 VPS 通过不同子域名代理到不同内网服务:
|
||
```
|
||
nas.ishenwei.online → 127.0.0.1:15000 (NAS)
|
||
n8n.ishenwei.online → 127.0.0.1:15678 (n8n)
|
||
grafana.ishenwei.online → 127.0.0.1:13000 (Grafana)
|
||
```
|
||
|
||
### 2. 自动 HTTPS
|
||
反向代理自动处理 SSL 证书申请和续期:
|
||
```
|
||
Caddy: 自动从 Let's Encrypt 获取证书
|
||
Nginx: 需要手动配置 certbot
|
||
```
|
||
|
||
### 3. 负载均衡
|
||
```
|
||
upstream backend {
|
||
server 192.168.1.10:8080;
|
||
server 192.168.1.11:8080;
|
||
server 192.168.1.12:8080;
|
||
}
|
||
```
|
||
|
||
### 4. 缓存加速
|
||
静态资源缓存,减少源服务器负载:
|
||
```
|
||
location /static/ {
|
||
proxy_cache_valid 200 60m;
|
||
proxy_cache_use_stale error timeout updating;
|
||
}
|
||
```
|
||
|
||
## Comparison of Tools
|
||
|
||
| 工具 | 语言 | 配置复杂度 | 自动 HTTPS | 内存占用 | 适用场景 |
|
||
|------|------|-----------|------------|----------|---------|
|
||
| **Caddy** | Go | ⭐ 简单 | ✅ 内置 | ~20MB | 个人/小型服务 |
|
||
| **Nginx** | C | ⭐⭐⭐ 中等 | 需配置 | ~5MB | 生产环境 |
|
||
| **Traefik** | Go | ⭐⭐ 简单 | ✅ 内置 | ~50MB | 容器编排 |
|
||
| **Apache** | C | ⭐⭐⭐⭐ 复杂 | 需配置 | ~50MB | 传统企业 |
|
||
|
||
## Caddy Configuration
|
||
|
||
### 基本反向代理
|
||
```caddyfile
|
||
example.com {
|
||
reverse_proxy localhost:8080
|
||
}
|
||
```
|
||
|
||
### 多域名代理
|
||
```caddyfile
|
||
nas.ishenwei.online {
|
||
reverse_proxy 127.0.0.1:15000
|
||
}
|
||
|
||
n8n.ishenwei.online {
|
||
reverse_proxy 127.0.0.1:15678
|
||
}
|
||
```
|
||
|
||
### 带路径重写
|
||
```caddyfile
|
||
example.com/api/* {
|
||
rewrite /api
|
||
reverse_proxy localhost:3000
|
||
}
|
||
```
|
||
|
||
### 带负载均衡
|
||
```caddyfile
|
||
example.com {
|
||
reverse_proxy localhost:8080 localhost:8081 localhost:8082 {
|
||
lb_policy round_robin
|
||
}
|
||
}
|
||
```
|
||
|
||
## Integration with frp
|
||
|
||
典型架构:frp 隧道 → 反向代理 → 自动 HTTPS
|
||
|
||
```
|
||
┌──────────────────────────────────────────────────────────┐
|
||
│ VPS │
|
||
│ │
|
||
│ Internet → :443 → Caddy (反向代理) → 127.0.0.1:15000 │
|
||
│ ↓ │
|
||
│ frps 监听 :15000 │
|
||
│ ↓ │
|
||
│ frp 隧道 │
|
||
└──────────────────────────────────────────────────────────┘
|
||
↓
|
||
┌──────────────────────────────────────────────────────────┐
|
||
│ 内网机器 │
|
||
│ │
|
||
│ frpc 连接 VPS:7000 │
|
||
│ ↓ │
|
||
│ frpc 映射 localhost:5000 → VPS:15000 │
|
||
│ ↓ │
|
||
│ NAS Web UI (5000端口) │
|
||
└──────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
## Related Concepts
|
||
- [[Caddy]] — 自动 HTTPS 的反向代理工具
|
||
- [[内网穿透]] — 反向代理在内网服务访问中的应用
|
||
- [[TCP 隧道]] — 反向代理的底层机制之一
|
||
- [[Let's Encrypt]] — 自动 HTTPS 证书来源
|
||
- [[负载均衡]] — 反向代理的高级功能
|
||
|
||
## References
|
||
- Caddy: https://caddyserver.com/docs/
|
||
- Nginx: https://nginx.org/en/docs/
|