插件窝 干货文章 NGINX PM2 VPS: 构建高可用和可扩展的应用服务架构

NGINX PM2 VPS: 构建高可用和可扩展的应用服务架构

NGINX proxy PM2 应用 658    来源:    2025-04-11

NGINX + PM2 + VPS: 构建高可用和可扩展的应用服务架构

架构概述

这种组合提供了一个强大的Web应用部署方案: - VPS 提供基础的服务器资源 - PM2 作为Node.js应用的进程管理器 - NGINX 作为反向代理和负载均衡器

核心组件配置

1. PM2 配置

# 安装PM2
npm install pm2 -g

# 启动应用
pm2 start app.js --name "my-app"

# 常用命令
pm2 list              # 查看运行中的应用
pm2 monit             # 监控应用
pm2 logs              # 查看日志
pm2 reload all        # 零停机重载
pm2 save              # 保存当前进程列表
pm2 startup           # 设置开机自启

# 生态系统文件 (ecosystem.config.js)
module.exports = {
  apps: [{
    name: 'app',
    script: './app.js',
    instances: 'max',  # 根据CPU核心数自动扩展
    exec_mode: 'cluster',
    env: {
      NODE_ENV: 'production'
    }
  }]
}

2. NGINX 反向代理配置

server {
    listen 80;
    server_name yourdomain.com;

    location / {
        proxy_pass http://localhost:3000;  # 假设Node应用运行在3000端口
        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;
    }

    # 静态文件服务
    location /static/ {
        alias /path/to/static/files/;
        expires 30d;
    }
}

3. SSL/TLS 配置 (使用Let's Encrypt)

# 安装Certbot
sudo apt-get install certbot python3-certbot-nginx

# 获取证书
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

# 自动续期测试
sudo certbot renew --dry-run

高可用性策略

  1. PM2集群模式:

    pm2 start ecosystem.config.js
    
    • 自动根据CPU核心数创建多个实例
    • 一个进程崩溃会自动重启
  2. NGINX负载均衡 (多应用实例):

    upstream node_app {
       server 127.0.0.1:3000;
       server 127.0.0.1:3001;
       server 127.0.0.1:3002;
       keepalive 64;
    }
    
    server {
       location / {
           proxy_pass http://node_app;
           # 其他proxy设置...
       }
    }
    
  3. 日志管理:

    • 使用PM2日志管理: pm2 logs --timestamp --lines 100
    • 配置日志轮转: bash pm2 install pm2-logrotate pm2 set pm2-logrotate:max_size 10M pm2 set pm2-logrotate:retain 30

性能优化

  1. NGINX缓存:

    proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m inactive=60m use_temp_path=off;
    
    server {
       location / {
           proxy_cache my_cache;
           proxy_cache_valid 200 302 10m;
           proxy_cache_valid 404 1m;
           # 其他设置...
       }
    }
    
  2. HTTP/2支持:

    server {
       listen 443 ssl http2;
       # SSL和其他设置...
    }
    
  3. Gzip压缩:

    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    

监控与维护

  1. PM2监控仪表板:

    pm2 monitor
    
  2. 关键指标监控:

    • 使用pm2 list查看CPU和内存使用
    • 设置自动重启阈值: bash pm2 start app.js --max-memory-restart 200M
  3. 备份策略:

    • 定期备份应用代码和数据库
    • 备份NGINX配置和SSL证书

扩展方案

  1. 多VPS架构:

    • 使用NGINX作为前端负载均衡器
    • 后端多个VPS运行应用实例
    • 共享数据库或使用数据库集群
  2. 容器化部署:

    • 使用Docker容器化应用
    • PM2作为容器内进程管理器
    • Kubernetes或Docker Swarm编排
  3. CDN集成:

    • 配置Cloudflare或其他CDN
    • 缓存静态资源
    • DDoS防护

常见问题解决

  1. 502 Bad Gateway:

    • 检查PM2是否运行: pm2 list
    • 检查应用端口是否与NGINX配置匹配
    • 查看应用错误日志: pm2 logs
  2. 性能瓶颈:

    • 使用tophtop检查系统资源
    • NGINX访问日志分析: goaccess /var/log/nginx/access.log
    • 调整PM2实例数
  3. SSL证书续期失败:

    • 检查Certbot日志: /var/log/letsencrypt/
    • 确保NGINX配置没有语法错误: nginx -t
    • 手动续期测试: certbot renew --dry-run

这种架构提供了良好的平衡点,既有足够的性能处理中小规模流量,又具备向更大规模扩展的能力,同时保持了配置和管理的相对简单性。