云服务器部署小程序时Nginx和Node.js应该如何配置?

在云服务器上部署微信小程序后端(通常为 Node.js 服务),Nginx 主要作为反向X_X、HTTPS 终结、静态资源托管、负载均衡与安全防护的入口,而 Node.js 则运行实际的业务逻辑(如 Express/Koa/NestJS 等)。以下是生产环境推荐的完整配置指南,兼顾安全性、性能与可维护性:


✅ 一、整体架构示意

微信小程序客户端
        ↓ (HTTPS)
     [公网IP/域名] → Nginx(监听 443/80)
        ↓(反向X_X,HTTP)
   Node.js 服务(localhost:3000,仅内网访问)

⚠️ 注意:小程序强制要求后端接口必须使用 HTTPS,且域名需在微信公众平台「开发管理 → 服务器域名」中备案。


✅ 二、Node.js 服务配置(关键要点)

1. 启动方式(推荐 PM2 进程守护)

# 安装 PM2(全局)
npm install -g pm2

# 启动应用(假设入口为 app.js,监听 3000)
pm2 start app.js --name "miniapp-api" --watch --env production

# 保存进程列表,开机自启
pm2 save
pm2 startup

2. Node.js 代码适配(重要!)

  • 不要监听 0.0.0.0:3000(暴露公网)→ 改为 127.0.0.1:3000(仅本地访问,由 Nginx X_X)

    // ✅ 正确:只允许本地访问
    app.listen(3000, '127.0.0.1', () => {
    console.log('Server running on http://127.0.0.1:3000');
    });
    
    // ❌ 错误:避免监听 0.0.0.0(除非有严格防火墙)
    // app.listen(3000); // 默认绑定 0.0.0.0 → 风险!
  • 添加 CORS(小程序不走浏览器 CORS,但调试或 Web 端需兼容)

    const cors = require('cors');
    app.use(cors({
    origin: ['https://your-miniprogram-domain.com', 'https://devtools.qyapi.weixin.qq.com'], // 小程序调试域可选
    credentials: true
    }));
  • 信任 Nginx 转发的头部(获取真实 IP)

    // Express 示例
    app.set('trust proxy', '127.0.0.1'); // 信任本地 Nginx
    app.use((req, res, next) => {
    req.clientIP = req.headers['x-forwarded-for'] || req.ip;
    next();
    });

✅ 三、Nginx 配置(/etc/nginx/conf.d/miniapp.conf)

upstream node_backend {
    server 127.0.0.1:3000;
    # 可加多实例实现负载均衡(需配合 PM2 cluster 模式)
    # server 127.0.0.1:3001;
    # server 127.0.0.1:3002;
}

server {
    listen 80;
    server_name api.yourdomain.com;  # 替换为你的 API 域名(如 api.example.com)

    # HTTP 强制跳转 HTTPS(小程序要求 HTTPS)
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name api.yourdomain.com;

    # SSL 证书(推荐 Let's Encrypt)
    ssl_certificate /etc/letsencrypt/live/api.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/api.yourdomain.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/api.yourdomain.com/chain.pem;

    # SSL 安全增强(参考 Mozilla SSL Config Generator)
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    # HSTS(强制浏览器后续请求走 HTTPS)
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

    # 反向X_X核心配置
    location / {
        proxy_pass http://node_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 10s;
        proxy_send_timeout 30s;
        proxy_read_timeout 30s;

        # 缓存控制(API 通常不缓存)
        proxy_cache off;
        add_header X-Proxy-Cache "BYPASS";
    }

    # 可选:静态资源(如上传的图片、文件)直接由 Nginx 服务(更高效)
    location /uploads/ {
        alias /var/www/miniapp/uploads/;
        expires 7d;
        add_header Cache-Control "public, immutable";
    }

    # 安全加固:禁止访问敏感路径
    location ~ /.(htaccess|htpasswd|env|log|git|svn) {
        deny all;
    }
}

🔑 证书获取(免费 Let’s Encrypt)

# 安装 certbot
sudo apt install certbot python3-certbot-nginx
# 获取证书(确保域名 DNS 已解析到服务器)
sudo certbot --nginx -d api.yourdomain.com
# 自动续期(certbot 会自动添加 cron)

✅ 四、云服务器系统级配置

项目 推荐配置 说明
防火墙 ufw allow OpenSSH && ufw allow 'Nginx Full' && ufw enable 仅开放 22(SSH)、80、443;关闭 3000 端口对外访问
SELinux/AppArmor 若启用,确保 Nginx 有权限X_X本地端口(一般默认允许) sudo setsebool -P httpd_can_network_connect 1(CentOS/RHEL)
Node.js 版本 LTS 版本(如 v18.x 或 v20.x) nvm install --lts && nvm use --lts
日志管理 Nginx 日志 + PM2 日志分离 pm2 logs miniapp-api 查看实时日志;Nginx 日志路径 /var/log/nginx/miniapp-access.log

✅ 五、微信小程序端注意事项

  • 微信公众平台 → 开发管理 → 服务器域名 中,添加:
    • request 合法域名https://api.yourdomain.com
    • (可选)uploadFile 合法域名:同上(若用 wx.uploadFile)
  • 小程序代码中请求地址必须是 https://api.yourdomain.com/xxx不能写 http://localhost

✅ 六、验证与排错清单

问题现象 检查点
request:fail ssl hand shake error ✅ 域名未备案?证书过期?Nginx SSL 配置错误?用 SSL Labs 测试
request:fail net::ERR_CONNECTION_REFUSED ✅ Node.js 是否运行?curl http://127.0.0.1:3000/test 是否通?PM2 进程状态?pm2 status
502 Bad Gateway ✅ Nginx 是否能连通 Node.js?检查 upstream 地址和端口;netstat -tuln | grep :3000
接口返回 404 ✅ Nginx location / 是否正确X_X?Node.js 路由前缀是否与 Nginx 一致?(如 Nginx X_X /api/,则 Node.js 应处理 /api/xxx
获取不到真实 IP X-Forwarded-For 头是否被 Node.js 正确读取?确认 app.set('trust proxy', ...)

✅ 附:一键部署脚本(精简版)

# deploy.sh(执行前替换 yourdomain.com)
DOMAIN="api.yourdomain.com"
sudo apt update && sudo apt install -y nginx curl git nodejs npm
sudo npm install -g pm2

# 部署 Node.js 代码(示例)
git clone https://github.com/your/repo.git /var/www/miniapp
cd /var/www/miniapp && npm install --production

# 配置 Nginx
sudo tee /etc/nginx/conf.d/miniapp.conf > /dev/null <<EOF
...(上面的 Nginx 配置内容,替换 $DOMAIN)...
EOF

sudo nginx -t && sudo systemctl reload nginx
sudo pm2 start /var/www/miniapp/app.js --name "miniapp-api"

# 申请证书(需提前解析 DNS)
sudo certbot --nginx -d $DOMAIN

如需进一步支持,可提供:

  • 你使用的 Node.js 框架(Express/Koa/NestJS?)
  • 是否需要 WebSocket 支持(小程序 wx.connectSocket)?
  • 是否需接入 Redis/MongoDB?
  • 是否需 Docker 容器化部署?

我可以为你定制详细配置 👇
祝你部署顺利,小程序上线成功!🚀

未经允许不得转载:CLOUD技术博 » 云服务器部署小程序时Nginx和Node.js应该如何配置?