以下是一份面向生产环境、安全可靠、符合微信小程序后端规范的阿里云 CentOS 服务器部署 Node.js 后端(支持微信登录、消息推送、云开发替代等)的完整教程。适用于新手但兼顾最佳实践(含 Nginx 反向X_X、PM2 进程管理、HTTPS 强制、防火墙配置、微信域名白名单等关键点)。
✅ 前提条件
- 已购买阿里云 ECS 实例(推荐:2核4G,CentOS 7.9 或 CentOS 8.x / Alibaba Cloud Linux 3)
- 已备案并解析好自己的已备案域名(如
api.yourdomain.com),微信小程序要求后端域名必须是 HTTPS + 已备案域名 - 已在微信公众平台 → 小程序后台 → 「开发管理」→ 「开发设置」中配置:
- ✔️ 服务器域名(request 合法域名):
https://api.yourdomain.com - ✔️ (可选)uploadFile/ downloadFile 域名(若需文件上传)
- ✔️ 服务器域名(request 合法域名):
⚠️ 注意:
localhost、127.0.0.1、IP 地址、未备案域名、HTTP 协议均不被微信允许!
📦 一、服务器基础环境准备(CentOS 7/8)
1. 更新系统 & 安装基础工具
sudo yum update -y
sudo yum install -y epel-release curl wget git vim htop net-tools
2. 安装 Node.js(推荐 v18.x LTS,兼容微信生态)
# 方式1:使用 NodeSource(推荐,稳定)
curl -fsSL https://rpm.nodesource.com/setup_lts.x | sudo bash -
sudo yum install -y nodejs
# 验证
node -v # v18.x.x
npm -v # ≥ 9.x
✅ 补充:若需 Yarn,执行
npm install -g yarn
🌐 二、部署你的 Node.js 后端项目
1. 创建项目目录 & 上传代码
sudo mkdir -p /opt/wechat-backend
sudo chown -R $USER:$USER /opt/wechat-backend
cd /opt/wechat-backend
# 方式A:Git 克隆(推荐)
git clone https://github.com/yourname/wechat-backend.git .
# 方式B:SFTP/SCP 上传压缩包后解压
# wget https://your-oss-bucket/your-backend.zip
# unzip your-backend.zip
2. 安装依赖 & 环境配置
# 进入项目根目录(确保有 package.json)
cd /opt/wechat-backend
# 安装依赖(建议使用 --production 节省空间)
npm ci --production # 更快更稳定(需有 package-lock.json)
# 创建 .env 文件(敏感信息不要硬编码!)
cat > .env << 'EOF'
NODE_ENV=production
PORT=3000
APP_ID=your_wx_appid_here
APP_SECRET=your_wx_appsecret_here
REDIS_URL=redis://127.0.0.1:6379/0 # 如需 session 缓存(推荐)
JWT_SECRET=strong-random-jwt-secret-key-here
EOF
# 🔒 设置权限(防止泄露)
chmod 600 .env
💡 微信 AppID/AppSecret 获取路径:微信公众平台 → 开发管理 → 开发设置
🚀 三、进程守护:使用 PM2(生产级)
1. 全局安装 PM2
npm install -g pm2
2. 启动服务(带日志与监控)
# 启动(自动读取 .env)
pm2 start app.js --name "wechat-api" --env production
# 查看状态
pm2 status
# 查看实时日志
pm2 logs wechat-api
# 设置开机自启(重要!)
pm2 startup systemd
pm2 save
✅ 此时你的 Node.js 服务已在
http://localhost:3000运行(但外部还无法访问)
🔐 四、配置 Nginx 反向X_X + HTTPS(关键!)
1. 安装 Nginx
sudo yum install -y nginx
sudo systemctl enable nginx
sudo systemctl start nginx
2. 申请免费 HTTPS 证书(使用 Certbot + Let’s Encrypt)
# 安装 certbot
sudo yum install -y certbot python3-certbot-nginx
# 申请证书(替换 yourdomain.com 为你的已备案域名!)
sudo certbot --nginx -d api.yourdomain.com
# ✅ 成功后证书路径:
# /etc/letsencrypt/live/api.yourdomain.com/fullchain.pem
# /etc/letsencrypt/live/api.yourdomain.com/privkey.pem
⚠️ 若报错
Failed to connect to host for DVSNI challenge,请检查:
- 域名 DNS 已正确解析到 ECS 公网 IP
- 阿里云安全组已放行 80 和 443 端口(见下文)
3. 配置 Nginx(反向X_X到 Node.js)
sudo vim /etc/nginx/conf.d/wechat-api.conf
粘贴以下配置(✅ 已优化:HTTPS、HTTP 自动跳转、CORS、微信兼容头):
upstream wechat_backend {
server 127.0.0.1:3000;
}
server {
listen 80;
server_name api.yourdomain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name api.yourdomain.com;
# SSL 证书(certbot 自动生成,无需修改)
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 安全配置(由 certbot 提供)
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
# 微信小程序兼容性(关键头)
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With, X-WX-KEY';
add_header 'Access-Control-Allow-Credentials' 'true';
# 反向X_X到 Node.js
location / {
proxy_pass http://wechat_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_cache_bypass $http_upgrade;
}
# 可选:健康检查接口(微信开发者工具调试用)
location /health {
return 200 'OK';
add_header Content-Type text/plain;
}
}
4. 检查 & 重载 Nginx
sudo nginx -t # 测试配置语法
sudo systemctl reload nginx
✅ 此时访问 https://api.yourdomain.com/health 应返回 OK,且 https://api.yourdomain.com 可正常响应你的 API。
🔒 五、安全加固(阿里云必备)
1. 配置阿里云安全组(控制台操作)
- 登录 阿里云 ECS 控制台
- 找到你的实例 → 「安全组」→ 「配置规则」
- 仅开放以下端口:
- ✅
80(HTTP,用于 Certbot 自动续期) - ✅
443(HTTPS,小程序访问) - ✅
22(SSH,建议限制来源 IP,如公司宽带 IP) - ❌ 关闭
3000、6379、27017等所有其他端口(Node/Redis/MongoDB 仅内网通信)
- ✅
2. 本地防火墙(可选,推荐启用)
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
🧪 六、微信小程序前端调用示例(验证连通性)
在小程序 app.js 或页面中测试:
// 调用微信登录获取 code
wx.login({
success(res) {
if (res.code) {
// 发送 code 到你的后端换取 openid/session_key
wx.request({
url: 'https://api.yourdomain.com/api/login',
method: 'POST',
data: { code: res.code },
success(r) {
console.log('登录成功', r.data);
// r.data.openid, r.data.token 等
}
});
}
}
});
后端 app.js 示例路由(Express):
app.post('/api/login', async (req, res) => {
const { code } = req.body;
const url = `https://api.weixin.qq.com/sns/jscode2session?appid=${APP_ID}&secret=${APP_SECRET}&js_code=${code}&grant_type=authorization_code`;
try {
const result = await axios.get(url);
const { openid, session_key, errcode } = result.data;
if (errcode) throw new Error(`WX error: ${errcode}`);
// 生成自定义 token(JWT)返回给小程序
const token = jwt.sign({ openid }, JWT_SECRET, { expiresIn: '7d' });
res.json({ openid, token });
} catch (e) {
res.status(500).json({ error: e.message });
}
});
🔄 七、后续维护建议
| 任务 | 命令/说明 |
|---|---|
| 查看日志 | pm2 logs wechat-api 或 journalctl -u nginx -f |
| 重启服务 | pm2 restart wechat-api |
| 更新代码后重启 | git pull && npm ci --production && pm2 restart wechat-api |
| 证书自动续期 | Certbot 已配置定时任务(sudo crontab -l 查看) |
| 备份 | 定期备份 /opt/wechat-backend + .env + 数据库 |
❗ 常见问题排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
小程序提示 request:fail net::ERR_CERT_AUTHORITY_INVALID |
HTTPS 证书未生效或域名不匹配 | curl -I https://api.yourdomain.com 检查证书;确认域名完全一致(含 www) |
net::ERR_CONNECTION_REFUSED |
Node 未运行或端口被占 | pm2 status + lsof -i :3000 |
| 微信后台「域名配置」提示“不在合法域名列表中” | 未备案 / 未加 https:// / 多余空格 |
严格按格式填写 https://api.yourdomain.com,不能带路径 |
登录返回 errcode: 40029 |
AppID/AppSecret 错误或 code 过期(5min) | 检查 .env;确保 code 是最新一次 wx.login() 获取的 |
✅ 恭喜!你已完成符合微信官方要求的、安全稳定的 Node.js 后端部署。
需要我为你提供:
- ✨ 完整 Express + JWT + Redis 的模板项目(含微信登录/解密手机号)?
- 🐳 Docker 化部署方案(更易迁移)?
- 📈 日志收集(ELK)或监控(Prometheus + Grafana)?
- 🔐 使用阿里云 RAM 子账号 + 密钥轮换的最佳实践?
欢迎随时告诉我,我可以为你生成对应脚本或配置文件 👇
祝你开发顺利,小程序早日上线!🚀
CLOUD云枢