奋斗
努力

使用Nginx + Node.js在单核2G服务器部署小程序的最佳实践?

云计算

在单核 2GB 内存的服务器上部署小程序后端(Node.js + Nginx)需要兼顾性能、稳定性和资源限制。以下是经过验证的最佳实践方案:

一、系统优化配置

1. 操作系统层面

# 启用 Swap 分区(推荐 2-4GB)
sudo fallocate -l 3G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

# 调整内核参数
sudo sysctl -w vm.swappiness=10
sudo sysctl -w vm.vfs_cache_pressure=50

2. Node.js 进程管理

使用 PM2 进行进程管理,避免单点故障:

npm install -g pm2
pm2 start app.js --name "miniapp-backend" --max-memory-restart 800M
pm2 startup
pm2 save

关键配置说明:

  • --max-memory-restart 800M:防止内存泄漏导致 OOM
  • 单核服务器建议只运行一个 Node 实例
  • 启用集群模式(cluster)对单核无意义,反而增加上下文切换开销

二、Nginx 反向X_X配置

创建 /etc/nginx/sites-available/miniapp.conf:

upstream nodejs_backend {
    server 127.0.0.1:3000;
    keepalive 32;
}

server {
    listen 80;
    server_name your-domain.com;

    # 静态文件缓存
    location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    # API 请求X_X
    location /api/ {
        proxy_pass http://nodejs_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_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # 超时设置(根据业务调整)
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;

        # 连接保持
        proxy_buffering on;
        proxy_buffer_size 4k;
        proxy_buffers 8 4k;
    }

    # WebSocket 支持(如需)
    location /ws/ {
        proxy_pass http://nodejs_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;
    }

    # 安全头
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";
    add_header X-XSS-Protection "1; mode=block";

    # 强制 HTTPS(需先申请证书)
    # return 301 https://$server_name$request_uri;
}

三、Node.js 应用优化

1. 基础架构示例

// app.js
const express = require('express');
const cluster = require('cluster');
const os = require('os');

if (cluster.isMaster) {
    console.log(`主进程 ${process.pid} 已启动`);
    // 单核服务器只需一个 worker
    process.exit(0);
} else {
    const app = express();
    const PORT = process.env.PORT || 3000;

    // 中间件优化
    app.use(express.json({ limit: '10kb' })); // 限制请求体大小
    app.use(express.urlencoded({ extended: true, limit: '10kb' }));

    // 健康检查
    app.get('/health', (req, res) => {
        res.json({ status: 'ok', pid: process.pid });
    });

    // 业务路由
    app.use('/api', require('./routes'));

    // 错误处理
    app.use((err, req, res, next) => {
        console.error(err.stack);
        res.status(500).json({ error: '内部服务错误' });
    });

    app.listen(PORT, () => {
        console.log(`Worker ${process.pid} 监听端口 ${PORT}`);
    });

    // 优雅关闭
    process.on('SIGTERM', () => {
        console.log('收到终止信号,准备关闭...');
        process.exit(0);
    });
}

2. 内存与性能优化

// 在 app.js 开头添加
process.setMaxListeners(20); // 减少事件监听器警告
process.memoryUsage().rss; // 监控内存使用

// 数据库连接池优化(以 MySQL 为例)
const mysql = require('mysql2/promise');
const pool = mysql.createPool({
    host: 'localhost',
    user: 'user',
    password: 'password',
    database: 'db',
    waitForConnections: true,
    connectionLimit: 10, // 单核建议不超过 10
    queueLimit: 0,
    enableKeepAlive: true,
    keepAliveInitialDelay: 0
});

四、安全加固措施

1. 防火墙配置

sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

2. 应用层安全

  • 实现请求频率限制(使用 express-rate-limit)
  • 启用 CORS 白名单
  • 敏感信息环境变量化(.env 文件不提交到 Git)
  • 定期更新依赖包

五、监控与维护策略

1. 日志管理

# 配置 logrotate
sudo nano /etc/logrotate.d/nodejs-app

配置内容:

/var/log/miniapp/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0644 www-data www-data
    postrotate
        systemctl reload nginx
    endscript
}

2. 监控脚本

#!/bin/bash
# monitor.sh
while true; do
    MEM_USAGE=$(free -m | awk '/^Mem:/ {print $3/$2 * 100}')
    CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)

    if (( $(echo "$MEM_USAGE > 80" | bc -l) )); then
        echo "$(date): 内存使用率过高 - ${MEM_USAGE}%" | logger -t miniapp-monitor
    fi

    sleep 60
done

六、部署清单

  1. 环境准备

    • Ubuntu 20.04 LTS 或更高版本
    • Node.js 18+(LTS 版本)
    • Nginx 1.20+
    • PM2
  2. 部署步骤

    # 1. 安装依赖
    sudo apt update && sudo apt install -y nodejs npm nginx git
    
    # 2. 克隆代码
    cd /var/www/miniapp
    git clone <your-repo> .
    
    # 3. 安装依赖
    npm ci --production
    
    # 4. 配置环境变量
    cp .env.example .env
    nano .env  # 填入实际配置
    
    # 5. 启动服务
    pm2 start ecosystem.config.js --env production
    
    # 6. 配置 Nginx
    sudo ln -s /etc/nginx/sites-available/miniapp.conf /etc/nginx/sites-enabled/
    sudo nginx -t && sudo systemctl restart nginx
    
    # 7. 设置开机自启
    pm2 startup
    pm2 save

七、性能调优建议

  • 数据库选择:优先使用 SQLite(轻量级)或 Redis 作为缓存
  • 静态资源:将图片等静态资源托管到对象存储(如阿里云 OSS)
  • 压缩开启:Nginx 中启用 gzip 压缩
  • HTTP/2:如果支持,启用 HTTP/2 提升性能
  • CDN 提速:静态资源通过 CDN 分发

此方案在保证稳定性的前提下,最大化利用了单核 2GB 服务器的资源,适合中小型小程序后端服务。根据实际业务负载,可逐步扩展至多核或多节点架构。

未经允许不得转载:云服务器 » 使用Nginx + Node.js在单核2G服务器部署小程序的最佳实践?