高可用性(High Availability, HA)是确保系统在大部分时间都能正常运行的关键目标。本指南将介绍如何使用NGINX作为反向代理和负载均衡器,结合PM2进程管理器,在VPS服务器上实现高可用性解决方案。
客户端 → NGINX (负载均衡) → 多个PM2管理的Node.js应用实例
# 更新系统
sudo apt update && sudo apt upgrade -y
# 安装Node.js和npm
curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt install -y nodejs
# 安装PM2
sudo npm install -g pm2
# 安装NGINX
sudo apt install -y nginx
pm2 start app.js -i max --name "myapp"
-i max
参数让PM2根据CPU核心数自动创建多个实例
# 查看运行中的应用
pm2 list
# 监控应用状态
pm2 monit
# 查看日志
pm2 logs
# 保存当前进程列表
pm2 save
# 设置开机启动
pm2 startup
编辑NGINX配置文件(/etc/nginx/sites-available/yourdomain.com
):
upstream node_app {
server 127.0.0.1:3000;
server 127.0.0.1:3001;
server 127.0.0.1:3002;
# 添加更多端口以匹配PM2启动的实例数
}
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
location / {
proxy_pass http://node_app;
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_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache_bypass $http_upgrade;
}
}
# 创建符号链接
sudo ln -s /etc/nginx/sites-available/yourdomain.com /etc/nginx/sites-enabled/
# 测试NGINX配置
sudo nginx -t
# 重启NGINX
sudo systemctl restart nginx
在NGINX配置中添加健康检查:
upstream node_app {
server 127.0.0.1:3000 max_fails=3 fail_timeout=30s;
server 127.0.0.1:3001 max_fails=3 fail_timeout=30s;
# ...
# 添加健康检查端点
check interval=5000 rise=2 fall=3 timeout=1000 type=http;
check_http_send "HEAD /health HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
NGINX支持多种负载均衡算法:
- 轮询(默认)
- 最少连接(least_conn
)
- IP哈希(ip_hash
)
upstream node_app {
least_conn;
# 其余配置...
}
server {
listen 443 ssl http2;
# SSL配置...
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
}
# 安装PM2日志轮转模块
pm2 install pm2-logrotate
# 配置日志轮转
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 30
pm2 set pm2-logrotate:compress true
考虑使用工具如GoAccess进行实时日志分析:
sudo apt install -y goaccess
goaccess /var/log/nginx/access.log --log-format=COMBINED
# 允许必要端口
sudo ufw allow 22
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable
在NGINX中:
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s;
server {
limit_conn conn_limit_per_ip 20;
limit_req zone=req_limit_per_ip burst=20 nodelay;
}
对于更高级的高可用性需求,可以考虑:
通过以上配置,您的VPS服务器将具备较高的可用性,能够处理更多并发请求,并在单个实例失败时自动切换到其他可用实例。