我有两台云服务器(VPS),位于欧洲的德国,VPS1配置高磁盘大,但网络非常一般;VPS2配置极低,但网络为CN2 gia + CNMIN2专线网络,延迟和丢包都很好。现在我想将VPS1使用宝塔建站作为后端,VPS2则仅安装NGINX作为网站的前端直接面向国内用户访问,两台vps均安装debian12作为操作系统。学习研究一套前后端部署以及反代或者CDN的详细方案。
### 一、整体方案设计思路
核心思路是让 **VPS2 (优质网络)** 作为前端反向代理节点,接收所有国内用户的访问请求,然后将请求转发到 **VPS1 (高性能)** 的后端业务服务器;用户的响应数据则通过VPS1处理后,再经由VPS2回传给用户。这样既利用了VPS1的高性能存储/计算能力,又发挥了VPS2的优质网络优势。
#### 网络拓扑
```
国内用户 → VPS2 (NGINX反向代理) → VPS1 (宝塔建站后端)
↑ ↓
└──────── 响应数据 ─────────┘
```
### 二、环境准备
#### 1. 基础信息确认
- VPS1 (后端):假设IP为 `103.xxx.xxx.101` (德国,宝塔已建站,网站运行端口默认 `80/443`)
- VPS2 (前端):假设IP为 `89.xxx.xxx.102` (德国,仅装NGINX,需开放 `80/443` 端口)
- 系统:Debian 12 (两台均需执行基础更新)
#### 2. 两台VPS基础环境初始化 (均执行)
```bash
# 更新系统包
apt update && apt upgrade -y
# 安装必要依赖
apt install -y wget curl vim net-tools
```
### 三、步骤1:VPS1 (后端) 配置优化
宝塔建站后,需确保:
1. 网站能正常访问 (通过VPS1的IP直接访问验证)
2. 允许VPS2的IP访问后端服务 (防火墙放行)
3. 关闭宝塔的“强制HTTPS”自动跳转(避免反向代理冲突,后续统一在VPS2配置HTTPS)
#### 具体操作
1. **宝塔防火墙放行VPS2的IP**
- 登录宝塔面板 → 安全 → 防火墙 → 添加规则:
- 端口:80、443
- 来源IP:填写VPS2的公网IP (`89.xxx.xxx.102`)
- 备注:允许VPS2反向代理访问
2. **验证后端服务可用性**
登录VPS1,执行:
```bash
# 测试80端口是否监听
netstat -tulpn | grep 80
# 测试本地访问网站
curl http://127.0.0.1
```
### 四、步骤2:VPS2 (前端) 安装并配置NGINX反向代理
#### 1. 安装NGINX (Debian 12)
```bash
# 安装NGINX
apt install -y nginx
# 启动并设置开机自启
systemctl start nginx
systemctl enable nginx
# 验证安装
nginx -v # 输出版本即成功
systemctl status nginx # 确保状态为active (running)
```
#### 2. 配置NGINX反向代理核心配置
##### 第一步:备份默认配置 (避免冲突)
```bash
mv /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
mv /etc/nginx/sites-enabled/default /etc/nginx/sites-enabled/default.bak
```
##### 第二步:创建反向代理配置文件
```bash
# 编辑自定义配置文件 (以域名 example.com 为例)
vim /etc/nginx/conf.d/example.com.conf
```
##### 第三步:写入详细配置 (核心代码)
```nginx
# 全局优化参数 (针对国内网络)
worker_processes auto; # 自动匹配CPU核心数
worker_connections 1024; # 单进程最大连接数
keepalive_timeout 65; # 长连接超时时间
tcp_nodelay on; # 禁用Nagle算法,降低延迟
gzip on; # 开启Gzip压缩 (减少传输数据量)
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# 反向代理核心配置
server {
# 监听80端口 (HTTP)
listen 80;
listen [::]:80;
server_name example.com www.example.com; # 替换为你的域名
# 强制跳转到HTTPS (可选,建议开启)
return 301 https://$host$request_uri;
}
server {
# 监听443端口 (HTTPS)
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com www.example.com; # 替换为你的域名
# HTTPS证书配置 (建议在VPS2上用acme.sh申请,或宝塔导出证书后上传到VPS2)
ssl_certificate /etc/nginx/ssl/example.com/fullchain.pem; # 证书文件路径
ssl_certificate_key /etc/nginx/ssl/example.com/privkey.pem; # 私钥文件路径
# SSL优化配置 (提升安全性和性能)
ssl_protocols TLSv1.2 TLSv1.3; # 仅启用安全的TLS版本
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_stapling on;
ssl_stapling_verify on;
# 反向代理核心规则
location / {
# 转发请求到VPS1的后端服务器
proxy_pass http://103.xxx.xxx.101; # 替换为VPS1的公网IP (如果VPS1用443则改为https://)
proxy_set_header Host $host; # 传递域名到后端
proxy_set_header X-Real-IP $remote_addr; # 传递真实客户端IP到后端
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递IP链
proxy_set_header X-Forwarded-Proto $scheme; # 传递协议 (HTTP/HTTPS)
# 超时配置 (适配德国网络,避免请求超时)
proxy_connect_timeout 60s; # 连接超时
proxy_send_timeout 60s; # 发送超时
proxy_read_timeout 60s; # 读取超时
# 缓冲区配置 (提升大文件传输性能)
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
# 静态文件缓存 (减轻VPS1压力)
proxy_cache_valid 200 304 12h;
proxy_cache_valid any 1m;
}
# 单独配置静态文件反向代理 (可选,进一步优化性能)
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|ttf|svg)$ {
proxy_pass http://103.xxx.xxx.101;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
expires 7d; # 静态文件缓存7天
add_header Cache-Control "public, max-age=604800";
}
}
```
#### 3. 配置说明与补充
##### (1) HTTPS证书获取
- 推荐在VPS2上用 `acme.sh` 申请免费Let's Encrypt证书:
```bash
# 安装acme.sh
curl https://get.acme.sh | sh
source ~/.bashrc
# 申请证书 (替换为你的域名和邮箱)
acme.sh --issue -d example.com -d www.example.com --nginx --email your@email.com
# 安装证书到NGINX目录
acme.sh --install-cert -d example.com \
--key-file /etc/nginx/ssl/example.com/privkey.pem \
--fullchain-file /etc/nginx/ssl/example.com/fullchain.pem \
--reloadcmd "systemctl reload nginx"
```
##### (2) 测试NGINX配置并重启
```bash
# 检查配置语法是否正确
nginx -t # 输出 "nginx: configuration file /etc/nginx/nginx.conf test is successful" 即正确
# 重启NGINX使配置生效
systemctl reload nginx # 平滑重启,不中断现有连接
```
### 五、步骤3:域名解析配置
将你的域名解析到 **VPS2的公网IP (`89.xxx.xxx.102`)**,而非VPS1:
- A记录:`@` → `89.xxx.xxx.102`
- A记录:`www` → `89.xxx.xxx.102`
- (可选) AAAA记录:如需IPv6访问,解析到VPS2的IPv6地址
### 六、步骤4:验证与优化
#### 1. 访问验证
- 浏览器访问 `https://example.com`,应能正常打开VPS1上宝塔搭建的网站。
- 检查后端日志:登录VPS1的宝塔面板 → 网站 → 日志,确认日志中能看到真实的客户端IP(而非VPS2的IP),说明`X-Real-IP`配置生效。
#### 2. 性能优化补充
##### (1) VPS1 宝塔优化
- 关闭宝塔的“防跨站攻击”中不必要的限制(避免拦截VPS2的代理请求)。
- 开启宝塔的OPCache、Redis缓存,提升后端响应速度。
##### (2) VPS2 NGINX 进一步优化
- 开启NGINX的`access_log`和`error_log`,便于排查问题:
```nginx
# 在server块中添加
access_log /var/log/nginx/example.com_access.log;
error_log /var/log/nginx/example.com_error.log warn;
```
- 限制单IP并发连接数(防止CC攻击):
```nginx
# 在http块中添加
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
limit_conn conn_limit_per_ip 20; # 单IP最大20个并发连接
```
### 七、故障排查
1. **访问超时**:检查VPS1防火墙是否放行VPS2的IP;检查VPS2到VPS1的网络连通性(`ping 103.xxx.xxx.101`、`telnet 103.xxx.xxx.101 80`)。
2. **HTTPS证书报错**:确认证书路径正确,域名解析生效,且证书未过期。
3. **后端无法获取真实IP**:检查NGINX配置中的`proxy_set_header X-Real-IP`和`X-Forwarded-For`是否配置正确,宝塔网站的日志设置是否开启“记录真实IP”。
### 总结
1. **核心架构**:VPS2 (NGINX反向代理) 接收用户请求 → 转发到VPS1 (宝塔后端) → 响应数据经VPS2回传,兼顾性能与网络质量。
2. **关键配置**:NGINX需配置`proxy_pass`指向VPS1,同时传递真实IP、优化超时/缓存参数,HTTPS证书部署在VPS2。
3. **域名解析**:必须将域名解析到VPS2的IP,而非VPS1,才能利用其优质网络。
这套方案可直接落地,所有代码均针对Debian 12优化,重点解决了跨VPS反向代理的网络延迟、IP透传、静态文件缓存等核心问题。



文章评论