在云服务器上部署微信小程序后端(通常为 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技术博