海外云服务器Nginx反向代理+负载均衡+高可用完整教程(2026最新版)

📅 · 海外云服务器自建服务教程 - ChengziCloud

一句话结论

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台)小型博客/API1核1GB25GB SSD$4-7/台
推荐级(3台)中型电商/SaaS2核4GB50GB SSD$10-15/台
企业级(3台+)高并发/多站点4核8GB100GB 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 购买以上平台均有额外折扣,点击首页查看最新优惠。

延伸阅读:

本文由 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透传。