海外云服务器Nginx反向代理+负载均衡+高可用完整教程(2026最新版)
Meta Description: 用海外云服务器搭建Nginx反向代理+负载均衡+Keepalived高可用架构,涵盖upstream多站点分发、后端健康检查、会话保持、故障自动切换,附服务器配置推荐与价格对比。
- 前言
- 服务器配置推荐与价格对比
- 第一步:环境准备与基础配置
- 第二步:Nginx反向代理基础配置
- 第三步:负载均衡策略详解
- 第四步:后端健康检查
- 第五步:SSL/HTTPS负载均衡
- 第六步:Keepalived高可用配置
Meta Description: 用海外云服务器搭建Nginx反向代理+负载均衡+Keepalived高可用架构,涵盖upstream多站点分发、后端健康检查、会话保持、故障自动切换,附服务器配置推荐与价格对比。
关键词:Nginx反向代理、负载均衡、Keepalived高可用、upstream配置、海外云服务器搭建
前言
当你的海外业务从单台服务器扩展到多台时,Nginx反向代理+负载均衡 是最基础也最关键的架构升级。通过将用户请求分发到多台后端服务器,既能提升访问速度和并发处理能力,又能实现故障自动切换。本教程从零开始,手把手教你配置Nginx upstream负载均衡、健康检查、会话保持,并用Keepalived实现主备高可用——所有命令均可直接复制执行,附CentOS 7和Ubuntu 22.04双系统适配。
服务器配置推荐与价格对比
搭建负载均衡架构至少需要2台服务器(1台Nginx代理 + 1台后端),推荐3台实现高可用。
配置档位表
| 配置档位 | 适用场景 | CPU | 内存 | 硬盘 | 月付参考价 |
|---|---|---|---|---|---|
| 入门级(2台) | 小型博客/API | 1核 | 1GB | 25GB SSD | $4-7/台 |
| 推荐级(3台) | 中型电商/SaaS | 2核 | 4GB | 50GB SSD | $10-15/台 |
| 企业级(3台+) | 高并发/多站点 | 4核 | 8GB | 100GB SSD | $20-40/台 |
服务商价格对比表
| 服务商 | 月付 | 年付(折扣后) | 数据中心 | 优点 |
|---|---|---|---|---|
| 阿里云国际版 ECS | $4.2 | $3.2/月 | 新加坡/香港/硅谷 | 中文面板、支持支付宝 |
| AWS Lightsail | $3.5 | $3.5/月 | 全球20+区域 | 新用户免费套餐、生态完善 |
| 腾讯云国际版 CVM | $4.5 | $3.5/月 | 香港/新加坡/东京 | 低延迟到国内、微信支付 |
| Vultr | $6.0 | $6.0/月 | 全球32个 | 按小时计费、随时销毁 |
| DigitalOcean | $6.0 | $6.0/月 | 全球14个 | 文档最完善、社区教程多 |
💡 新手建议:选阿里云国际版或腾讯云国际版香港节点,延迟低、有中文面板,通过
5.chengzicloud.cloud 购买还可享额外折扣。
🚀 还没有海外云服务器?通过 5.chengzicloud.cloud 选购阿里云/AWS/腾讯云国际版,享专属折扣和中文技术支持。
第一步:环境准备与基础配置
1.1 系统更新
// CentOS 7 yum update -y && yum install -y epel-release nginx keepalived
// Ubuntu 22.04 apt update -y && apt install -y nginx keepalived
1.2 创建后端测试服务(用于验证负载均衡)
在所有后端服务器上部署一个简单的测试页面:
// CentOS 7
yum install -y python3
// Ubuntu 22.04
apt install -y python3
创建测试页面:
cat > /var/www/html/index.html << 'EOF'
<!DOCTYPE html>
<html>
<head><title>Server Info</title></head>
<body>
<h1>Server: $(hostname)</h1>
<p>IP: $(hostname -I | awk '{print $1}')</p>
<p>Time: $(date)</p>
</body>
</html>
EOF
1.3 启动后端服务(用Python HTTP Server模拟)
// 创建 systemd 服务
cat > /etc/systemd/system/backend.service << 'EOF'
[Unit]
Description=Backend HTTP Server
After=network.target
[Service]
Type=simple
WorkingDirectory=/var/www/html
ExecStart=/usr/bin/python3 -m http.server 8080
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable backend
systemctl start backend
第二步:Nginx反向代理基础配置
2.1 基础反向代理
编辑Nginx配置文件:
// CentOS 7
vi /etc/nginx/conf.d/reverse-proxy.conf
// Ubuntu 22.04
vi /etc/nginx/sites-available/reverse-proxy.conf
基础反向代理配置:
// 基础反向代理 - 将请求转发到后端服务器
upstream backend_pool {
server 192.168.1.101:8080; // 后端服务器1
server 192.168.1.102:8080; // 后端服务器2
}
server {
listen 80;
server_name example.com www.example.com;
location / {
proxy_pass http://backend_pool;
proxy_set_header Host $host;
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;
}
}
2.2 多站点反向代理
// 多站点反向代理 - 一个Nginx代理多个后端服务
upstream site_a {
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}
upstream site_b {
server 192.168.1.103:3000;
}
upstream api_backend {
server 192.168.1.104:5000;
server 192.168.1.105:5000;
}
// 站点A
server {
listen 80;
server_name site-a.com www.site-a.com;
location / {
proxy_pass http://site_a;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
// 站点B
server {
listen 80;
server_name site-b.com www.site-b.com;
location / {
proxy_pass http://site_b;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
// API服务
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://api_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;
// API超时设置
proxy_connect_timeout 30s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}
第三步:负载均衡策略详解
3.1 轮询(Round Robin)— 默认策略
// 轮询 - 请求按顺序分配到各后端
upstream backend_roundrobin {
server 192.168.1.101:8080;
server 192.168.1.102:8080;
server 192.168.1.103:8080;
}
3.2 加权轮询(Weighted Round Robin)
// 加权轮询 - 性能强的服务器分配更多请求
upstream backend_weighted {
server 192.168.1.101:8080 weight=5; // 4核8G - 承担50%请求
server 192.168.1.102:8080 weight=3; // 2核4G - 承担30%请求
server 192.168.1.103:8080 weight=2; // 1核2G - 承担20%请求
}
3.3 IP Hash(会话保持)
// IP Hash - 同一IP的请求总是发到同一后端(会话保持)
upstream backend_iphash {
ip_hash;
server 192.168.1.101:8080;
server 192.168.1.102:8080;
server 192.168.1.103:8080;
}
// 适用场景:需要登录状态的Web应用、购物车、Session共享等
3.4 Least Connections(最少连接)
// 最少连接 - 将请求分配给当前连接数最少的服务器
upstream backend_leastconn {
least_conn;
server 192.168.1.101:8080;
server 192.168.1.102:8080;
server 192.168.1.103:8080;
}
// 适用场景:长连接场景(WebSocket、数据库连接池、文件下载)
3.5 综合生产配置
// 生产环境推荐配置 - 加权+健康检查+超时+会话保持
upstream production_backend {
// 加权轮询
server 192.168.1.101:8080 weight=5 max_fails=3 fail_timeout=30s;
server 192.168.1.102:8080 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.1.103:8080 weight=2 max_fails=3 fail_timeout=30s;
// 会话保持(可选,根据业务需求启用)
// ip_hash;
// 最少连接(与weight二选一)
// least_conn;
// 连接超时
keepalive 32;
}
server {
listen 80;
server_name production.example.com;
location / {
proxy_pass http://production_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;
proxy_set_header X-Forwarded-Proto $scheme;
// 长连接复用
proxy_http_version 1.1;
proxy_set_header Connection "";
// 超时设置
proxy_connect_timeout 10s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
// 缓冲设置
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
}
}
第四步:后端健康检查
4.1 被动健康检查(Nginx内置)
// 被动健康检查 - Nginx内置,检测到失败后自动标记不可用
upstream backend_passive {
server 192.168.1.101:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.102:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.103:8080 max_fails=3 fail_timeout=30s;
// max_fails=3: 连续失败3次后标记为不可用
// fail_timeout=30s: 标记不可用持续30秒后重新尝试
}
4.2 主动健康检查(Nginx Plus或OpenResty)
如果使用Nginx Plus或OpenResty,可以配置主动健康检查:
// 主动健康检查 - 定期主动检测后端状态(需Nginx Plus或OpenResty)
upstream backend_active {
zone backend_zone 64k;
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}
// 在server块中配置
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_active;
proxy_next_upstream error timeout http_502 http_503 http_504;
proxy_next_upstream_tries 3;
proxy_next_upstream_timeout 10s;
}
}
4.3 自定义健康检查接口
在后端服务器上创建健康检查端点:
// 创建健康检查脚本
cat > /var/www/html/health.php << 'EOF'
<?php
// 简单的健康检查接口
header('Content-Type: application/json');
// 检查必要服务(数据库、Redis等)
$healthy = true;
$message = 'OK';
// 可以添加更多检查逻辑
// 例如:检查数据库连接
// $db = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
echo json_encode([
'status' => $healthy ? 'healthy' : 'unhealthy',
'message' => $message,
'timestamp' => time(),
'server' => gethostname()
]);
EOF
在Nginx配置中添加健康检查路由:
// 健康检查路由 - 返回后端服务器状态
location /health {
proxy_pass http://backend_pool;
proxy_set_header Host $host;
access_log off; // 不记录健康检查日志
}
第五步:SSL/HTTPS负载均衡
5.1 SSL终止(SSL Termination)
// SSL终止 - 在Nginx层处理SSL,后端只需HTTP
upstream backend_ssl {
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://backend_ssl;
proxy_set_header Host $host;
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 https;
}
}
// HTTP重定向到HTTPS
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
5.2 SSL透传(SSL Passthrough)
// SSL透传 - 后端服务器处理SSL(需要stream模块)
stream {
upstream backend_passthrough {
server 192.168.1.101:443;
server 192.168.1.102:443;
}
server {
listen 443;
proxy_pass backend_passthrough;
proxy_protocol on;
}
}
第六步:Keepalived高可用配置
6.1 Keepalived安装
// CentOS 7 yum install -y keepalived
// Ubuntu 22.04 apt install -y keepalived
6.2 主节点配置(MASTER)
cat > /etc/keepalived/keepalived.conf << 'EOF'
global_defs {
router_id NGINX_MASTER // 路由ID,主节点唯一标识
script_user root
enable_script_security
}
// 健康检查脚本
vrrp_script chk_nginx {
script "/usr/bin/curl -s -o /dev/null http://localhost/health"
interval 2 // 每2秒检查一次
weight -20 // 失败时降低优先级
fall 3 // 连续失败3次
rise 2 // 连续成功2次恢复
}
vrrp_instance VI_1 {
state MASTER // 主节点
interface eth0 // 网卡接口名
virtual_router_id 51 // 虚拟路由ID,主备必须相同
priority 100 // 优先级,MASTER必须高于BACKUP
advert_int 1 // VRRP通告间隔
authentication {
auth_type PASS
auth_pass 1234 // 认证密码,主备必须相同
}
virtual_ipaddress {
192.168.1.100/24 // 虚拟IP地址
}
track_script {
chk_nginx
}
// 状态变化通知脚本(可选)
notify_master "/etc/keepalived/scripts/notify.sh MASTER"
notify_backup "/etc/keepalived/scripts/notify.sh BACKUP"
notify_fault "/etc/keepalived/scripts/notify.sh FAULT"
}
EOF
6.3 备节点配置(BACKUP)
cat > /etc/keepalived/keepalived.conf << 'EOF'
global_defs {
router_id NGINX_BACKUP // 路由ID,备节点唯一标识
script_user root
enable_script_security
}
vrrp_script chk_nginx {
script "/usr/bin/curl -s -o /dev/null http://localhost/health"
interval 2
weight -20
fall 3
rise 2
}
vrrp_instance VI_1 {
state BACKUP // 备节点
interface eth0
virtual_router_id 51 // 必须与MASTER相同
priority 90 // 必须低于MASTER
advert_int 1
authentication {
auth_type PASS
auth_pass 1234 // 必须与MASTER相同
}
virtual_ipaddress {
192.168.1.100/24
}
track_script {
chk_nginx
}
}
EOF
6.4 健康检查脚本
// 创建Keepalived健康检查脚本
mkdir -p /etc/keepalived/scripts
cat > /etc/keepalived/scripts/check_nginx.sh << 'EOF'
#!/bin/bash
// 检查Nginx进程是否存在
if ! pgrep -x nginx > /dev/null; then
// 尝试重启Nginx
systemctl start nginx
sleep 2
// 再次检查
if ! pgrep -x nginx > /dev/null; then
exit 1 // Nginx启动失败,返回失败
fi
fi
exit 0 // Nginx运行正常,返回成功
EOF
chmod +x /etc/keepalived/scripts/check_nginx.sh
6.5 启动Keepalived
// CentOS 7
systemctl enable keepalived
systemctl start keepalived
// Ubuntu 22.04
systemctl enable keepalived
systemctl start keepalived
// 检查状态
systemctl status keepalived
ip addr show | grep 192.168.1.100 // 检查虚拟IP是否生效
第七步:故障切换测试
7.1 模拟主节点故障
// 在MASTER节点停止Nginx
systemctl stop nginx
// 观察BACKUP节点日志
tail -f /var/log/messages | grep -i keepalived
// 检查虚拟IP是否切换到BACKUP
ip addr show | grep 192.168.1.100
7.2 恢复测试
// 在MASTER节点重启Nginx
systemctl start nginx
// 观察是否自动回切
tail -f /var/log/messages | grep -i keepalived
// 检查虚拟IP是否回到MASTER
ip addr show | grep 192.168.1.100
7.3 验证负载均衡
// 多次请求测试负载均衡效果
for i in {1..10}; do
curl -s http://192.168.1.100 | grep "Server:"
sleep 1
done
// 应该看到请求被分配到不同的后端服务器
第八步:监控与日志
8.1 Nginx访问日志配置
// 自定义日志格式 - 记录负载均衡信息
log_format upstream_log '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'upstream: $upstream_addr '
'response_time: $upstream_response_time';
// 在server块中启用
server {
listen 80;
server_name example.com;
access_log /var/log/nginx/upstream_access.log upstream_log;
error_log /var/log/nginx/upstream_error.log;
location / {
proxy_pass http://backend_pool;
// ... 其他配置
}
}
8.2 监控脚本
cat > /usr/local/bin/nginx-monitor.sh << 'EOF'
#!/bin/bash
// Nginx负载均衡监控脚本
// 检查Nginx状态
NGINX_STATUS=$(systemctl is-active nginx)
if [ "$NGINX_STATUS" != "active" ]; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] ALERT: Nginx is down!" >> /var/log/nginx-monitor.log
systemctl restart nginx
fi
// 检查后端服务器健康
BACKENDS=("192.168.1.101:8080" "192.168.1.102:8080" "192.168.1.103:8080")
for backend in "${BACKENDS[@]}"; do
if ! curl -s -o /dev/null -w "%{http_code}" "http://$backend/health" | grep -q "200"; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] WARNING: Backend $backend is unhealthy" >> /var/log/nginx-monitor.log
fi
done
// 检查虚拟IP状态
VIP_STATUS=$(ip addr show | grep "192.168.1.100" | wc -l)
if [ "$VIP_STATUS" -eq 0 ]; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] WARNING: Virtual IP is not active" >> /var/log/nginx-monitor.log
fi
EOF
chmod +x /usr/local/bin/nginx-monitor.sh
// 添加定时任务 - 每5分钟检查一次
echo "*/5 * * * * /usr/local/bin/nginx-monitor.sh" >> /var/spool/cron/root
进阶配置
WebSocket负载均衡
// WebSocket反向代理 - 需要特殊Header处理
upstream websocket_backend {
ip_hash; // WebSocket必须会话保持
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}
server {
listen 80;
server_name ws.example.com;
location /ws {
proxy_pass http://websocket_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 86400s; // WebSocket长连接超时
}
}
缓存配置
// 代理缓存 - 减轻后端压力
proxy_cache_path /var/cache/nginx levels=1:2
keys_zone=my_cache:10m
max_size=10g
inactive=60m
use_temp_path=off;
upstream backend_cached {
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_cached;
proxy_cache my_cache;
proxy_cache_valid 200 10m; // 200状态缓存10分钟
proxy_cache_valid 404 1m; // 404状态缓存1分钟
// 缓存Key
proxy_cache_key $scheme$proxy_host$request_uri;
// 缓存状态
add_header X-Cache-Status $upstream_cache_status;
}
}
总结
Nginx反向代理+负载均衡+Keepalived高可用是海外业务扩展的基础设施。通过本教程,你已经学会了:基础反向代理配置、多种负载均衡策略选择、后端健康检查机制、SSL终止与透传、以及Keepalived主备高可用架构。这套架构可以轻松应对从单站点到多站点、从低并发到高并发的各种场景。
🚀 通过 5.chengzicloud.cloud 购买以上平台均有额外折扣,点击首页查看最新优惠。
延伸阅读:
- 海外云服务器搭建Docker+Portainer容器管理平台完整教程
- 海外云服务器Nginx反向代理+Let's Encrypt免费SSL证书配置完整教程
- 海外云服务器网站安全加固完整教程:ModSecurity WAF + fail2ban + WordPress 加固
本文由 5.chengzicloud.cloud 提供,点击访问首页了解更多海外云服务器部署方案和专属优惠。
常见问题(FAQ)
负载均衡和反向代理有什么区别?
反向代理是将客户端请求转发到后端服务器;负载均衡是在多台后端服务器之间分配请求。Nginx可以同时实现两者——配置upstream就是负载均衡,配置proxy_pass就是反向代理。生产环境中通常两者结合使用。
应该选择哪种负载均衡策略?
默认轮询适合大多数场景;加权轮询适合后端服务器性能不同的情况;IP Hash适合需要会话保持的Web应用(如登录状态、购物车);最少连接适合长连接场景(如WebSocket、文件下载)。建议从轮询开始,根据实际需求调整。
Keepalived切换时会中断连接吗?
会有短暂中断(通常1-3秒),因为需要等待VRRP检测到故障并完成VIP切换。可以通过调整advert_int(VRRP通告间隔)和script检测interval来缩短切换时间,但过短可能导致误判。
如何处理后端服务器维护?
可以在Nginx配置中临时标记服务器为down,或者使用keepalived的权重调整功能。维护时建议先从负载均衡池中移除该节点,待维护完成后再加回。
负载均衡服务器本身挂了怎么办?
这就是Keepalived的作用——通过虚拟IP实现主备切换。建议至少部署2台Nginx代理节点,配合Keepalived实现高可用。如果预算充足,可以考虑云厂商的负载均衡服务(如阿里云SLB、AWS ELB)。
SSL证书应该在哪一层处理?
推荐在Nginx层进行SSL终止(SSL Termination),这样后端服务器只需要处理HTTP请求,简化配置且减少后端计算压力。如果需要端到端加密(如金融、支付场景),可以使用SSL透传。