超完整踩坑实录)
摘要网上绝大多数部署教程都是基于Linux服务器而Windows Server部署小程序后端、配置Nginx反向代理、Let’s Encrypt免费SSL证书会遇到大量独有的坑。本文基于真实项目微信绩效考核小程序 Node.js Express后端 MySQL8.0 Windows云服务器完整记录从零到上线全流程。包含Windows环境Nginx完整配置、Certbot证书签发与404报错排错、证书自动续签、小程序域名配置、预览/体验版区分、MySQL导入踩坑、PM2进程守护等实战内容可直接照着操作上线。整体部署架构微信小程序前端Nginx 443 HTTPS127.0.0.1:端口 Node.js后端本地MySQL8.0数据库小程序前端发起HTTPS请求公网访问Nginx的443端口Nginx反向代理转发请求到本机Node后端服务Node后端读写服务器本地MySQL实现外网所有人均可访问小程序真机正常调用接口一、服务器环境准备Windows Server1. 安装Node.js版本和本地开发环境保持一致配置系统环境变量2. 安装MySQL8.0监听本机127.0.0.1禁止对公网开放3306端口3. 云服务器安全组放行端口80、443❗安全规范不要开放自定义后端端口、3306端口到公网避免被扫描攻击4. 将后端项目上传服务器项目路径必须为纯英文不允许中文、空格、特殊字符二、后端部署踩坑禁止直接npm run start运行❌错误示范很多新手踩坑在服务器PowerShell直接进入项目目录执行开发模式启动npm runstart现象与问题1. PowerShell窗口关闭、远程桌面断开、服务器锁屏/重启Node进程直接销毁小程序接口502无法访问2. npm run start多为开发WebRoot热更新模式资源占用高不适合生产环境3. Windows会话机制即使最小化窗口断开远程连接也有可能杀死会话下全部进程✅正确方案PM2进程守护实现后台常驻#全局安装pm2npm install pm2-g#启动后端服务自定义服务名称pm2startindex.js--name jixiao-api#配置开机自启pm2 startup pm2 save#查看服务状态online代表运行正常pm2 list排查小程序接口报错优先查看后端日志pm2 logs jixiao-api三、Nginx 反向代理 HTTPS域名配置Windows专属完整版Certbot证书404报错修复自动续签 微信小程序强制接口必须使用HTTPS协议不允许HTTP明文、不允许IP端口访问真机环境会直接拦截请求。3.1 前置端口放行云服务器安全组务必放行-80HTTP端口Let’s Encrypt证书校验必须使用不可关闭-443HTTPS访问端口小程序正式接口访问3.2 Windows安装Nginx1. 下载Windows稳定版Nginx解压至C:\nginx路径禁止中文、空格2. 管理员PowerShell执行Nginx启停命令#启动nginxstartnginx#重载配置修改conf后必须执行nginx-s reload#停止nginxnginx-s stop3.3 Windows安装Certbot免费SSL证书工具1. Certbot客户端解压到服务器路径C:\Certbot2. 创建证书校验目录C:\Certbot\webroot3. 执行证书申请命令certbot certonly--webroot-w C:\Certbot\webroot-d 项目正式域名--email 个人备案邮箱--agree-tos--no-eff-email3.4 深度踩坑Windows Nginx 专属 Certbot 404 校验失败全网最细根因解析3.4.1 完整报错日志PSC:\Certbot certbot certonly--webroot-w C:\Certbot\webroot-d 项目正式域名--email 个人备案邮箱--agree-tos--no-eff-email Saving debug log to C:\Certbot\log\letsencrypt.log Requesting a certificatefor项目正式域名 Certbot failed to authenticate some domains(authenticator: webroot).The Certificate Authority reported these problems: Identifier: 项目正式域名Type: unauthorized Detail: 服务器公网IP: Invalid responsefromhttps://项目正式域名/.well-known/acme-challenge/xxx: 404 Hint: The Certificate Authority failed to download the temporary challenge files created by Certbot.Some challenges have failed.3.4.2 真实报错链路核心Let’s Encrypt 证书校验规则必须从 HTTP 80 端口获取挑战文件禁止 301 跳转 HTTPS我的旧配置错误链路1. CA 访问http://项目正式域名/.well-known/acme-challenge/xxx2. Nginx 80 全局return 301强制跳转 HTTPS3. CA 被动跳转到https://项目正式域名/.well-known/xxx4. 443 站点未对应物理文件 →404 鉴权失败日志中 CA 直接访问https://就是铁证80 端口被强制跳转了。3.4.3 Windows Nginx 独有 Bug与 Linux 行为不一致这是Windows 移植版 Nginx 专属坑Linux 不会出现- Linux Nginx一旦^~精准匹配路径直接终止执行忽略外层所有指令- Windows Nginx即便匹配location ^~依然会继续执行 server 顶层的 return 301我的旧配置致命错误server { listen 80; server_name 项目正式域名; location ^~ /.well-known/acme-challenge/ { alias C:/Certbot/webroot/; } return 301 https://$host$request_uri; # 致命写在 server 顶层 }导致匹配到校验路径后依然被强行跳转 HTTPS。3.4.4 第二重坑Windows 下 alias 路径拼接错乱旧写法alias C:/Certbot/webroot/;Certbot 真实文件路径C:\Certbot\webroot\.well-known\acme-challenge\文件Alias 拼接后错误路径C:/Certbot/webroot//.well-known/...多出一层斜杠路径错乱文件找不到✅结论acme 校验场景禁止用 alias必须用 root3.4.5 最终正确 80 端口配置可直接覆盖server { listen 80; server_name 项目正式域名; # 证书校验路径优先放行不走 HTTPS 跳转 location ^~ /.well-known/acme-challenge/ { root C:/Certbot/webroot; default_type text/plain; } # 普通请求才跳转 HTTPS关键把301关进 location / 内部 location / { return 301 https://$host$request_uri; } }修正核心两点1.return 301location /** 移入 **校验路径命中^~后直接终止不会执行跳转2.**aliasroot**** 改为 **路径拼接正常精准匹配 Certbot 生成的校验文件3.4.6 Windows 生效必须彻底重启 NginxWindows 仅reload可能不生效必须强杀进程taskkill/F/IM nginx.exestartnginx3.4.7 重新执行证书签发命令certbot certonly--webroot-w C:\Certbot\webroot-d 项目正式域名--email 个人备案邮箱--agree-tos--no-eff-email3.4.8 终极备用方案100% 成功若 Windows Nginx 诡异问题依旧直接绕过 80 端口跳转问题使用 DNS 验证certbot certonly--manual-d 项目正式域名--email 个人备案邮箱--agree-tos--no-eff-email3.4.9 补充$host 与 $server_name 区别非故障原因-$host取用户访问的域名-$server_name取配置文件固定域名本次报错和变量无关纯粹是 Windows Nginx 顶层return执行逻辑 bug 导致。3.5 Nginx完整生产配置替换C:\nginx\conf\nginx.conf全部内容http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; # 80端口服务HTTP强制跳转HTTPS server { listen 80; server_name 项目正式域名; # 证书校验路径优先放行不走 HTTPS 跳转 location ^~ /.well-known/acme-challenge/ { root C:/Certbot/webroot; default_type text/plain; } # 普通请求才跳转 HTTPS关键把301关进 location / 内部 location / { return 301 https://$host$request_uri; } } # 443 HTTPS正式服务 server { listen 443 ssl; server_name 项目正式域名; #Certbot生成证书路径 ssl_certificate C:/Certbot/live/项目正式域名/fullchain.pem; ssl_certificate_key C:/Certbot/live/项目正式域名/privkey.pem; #ssl安全协议配置 ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; #续签证书同样需要放行校验路径 location /.well-known/acme-challenge/ { root C:/Certbot/webroot; try_files $uri 404; } #反向代理转发请求到本地Node后端 location / { proxy_pass http://127.0.0.1:后端自定义端口; 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; } } }保存配置重载Nginx修改配置后Windows 环境不要只执行 nginx -s reload建议彻底强杀重启 Nginxtaskkill/F/IM nginx.exestartnginx3.6 HTTPS连通验证浏览器访问接口地址https://项目正式域名/api/health- 浏览器地址栏出现绿色安全锁- 接口正常返回JSON响应代表Nginx、反向代理、SSL证书全部生效外网所有设备均可访问。3.7 SSL证书自动续签Windows Let’s Encrypt证书有效期仅90天过期之后HTTPS直接失效小程序无法访问必须配置自动续签。 环境说明Windows ServerCertbot 5.5.0Nginx路径C:\nginx\nginx‑1.30.0 注意Certbot为Linux工具移植至Windows直接在任务计划传参数执行会出现后台会话阻塞、Nginx读取配置失败问题需要封装bat脚本解决。手动测试续签功能是否正常# 切换到certbot根目录cd C:\Certbot certbot renew结果判断1. 输出Certificate not yet due for renewal- 含义证书未到续期时间服务器访问Let’s Encrypt正式接口网络正常续签链路校验通过。- 警告An error occurred requesting ACME Renewal Information (ARI)属于可选扩展接口报错不影响续签直接忽略。2. 如果出现ConnectTimeoutError连接超时- 代表服务器出站无法访问Let’s Encrypt自动续签不可靠。建议切换国内云厂商免费SSL证书或者设置日历提醒到期手动重新申请证书。 说明只有证书距离到期剩余 ≤30天certbot renew才会真正执行证书更新大于30天仅做连通校验不会修改任何证书文件操作安全。编写自动续签批处理脚本直接在任务计划程序调用certbot会存在两个问题1. Windows任务计划为无交互后台会话Certbot容易进程阻塞挂住任务一直显示“正在运行”不退出2. 直接执行nginx -s reload会以任务计划的工作目录去查找conf/nginx.conf导致Nginx报找不到配置文件错误。因此封装bat脚本脚本路径C:\Certbot\renew_cert.bat完整内容echo off ::执行certbot续签检测输出日志到run.log C:\Users\服务器管理员账户\AppData\Local\Programs\Python\对应Python版本\Scripts\certbot.exe renew C:\Certbot\run.log 21 set ret%errorlevel% ::切换到Nginx根目录再执行reload解决nginx读取conf路径异常 cd /d C:\nginx\nginx-1.30.0 if %ret% equ 0 ( C:\nginx\nginx-1.30.0\nginx.exe -s reload C:\Certbot\run.log 21 )脚本逻辑1. 调用certbot renew做证书检测全部执行输出写入C:\Certbot\run.log方便排查定时任务后台执行问题2. 捕获certbot执行返回码3. 切换工作目录至Nginx根目录再执行nginx -s reload避免找不到conf、logs目录报错4. certbot执行成功才执行Nginx重载操作。本地验证bat脚本管理员权限打开PowerShell执行脚本C:\Certbot\renew_cert.bat正常现象脚本瞬间执行完毕无Nginx报错日志输出Certificate not yet due for renewal、no renewal failures。Windows任务计划程序配置定时续签Windows没有Linux的crontab使用系统自带任务计划程序实现无人值守续签。 ❗不要直接调用certbot.exe调用上面编写好的bat脚本。1. Windows搜索打开【任务计划程序】右侧点击【创建任务】不要使用创建基本任务部分高级选项无法勾选2.常规选项卡- 名称Certbot‑SSL自动续签- 安全选项勾选 ✅不管用户是否登录都要运行- 勾选 ✅不存储密码- 勾选 ✅最高权限运行后台运行必须开启防止权限不足进程卡死3.触发器选项卡 → 新建- 设置每月- 勾选全部月份一月~十二月- 日期1- 时间03:00:00- 启用✅勾选4.操作选项卡 → 新建- 操作启动程序- 程序或脚本C:\Certbot\renew_cert.bat- 添加参数留空- 起始于(可选)C:\Certbot5.设置选项卡- ✅允许任务按需运行- ☑如果任务失败按以下频率重新启动5分钟重启最多3次- ❌取消勾选如果任务运行时间超过以下时间停止任务- 如果任务运行没有结束不启动新实例下拉选择请勿启动新实例6. 点击确定保存任务。测试定时任务1. 选中任务右侧操作栏点击【运行】2. 正常表现短暂变为【正在运行】几秒后自动切回【准备就绪】3. 打开【历史记录】看到事件102 任务已完成代表定时任务执行完成。 如果历史记录被禁用点击右侧【启用所有任务历史记录】。日志查看位置1. Certbot证书业务日志C:\Certbot\log\letsencrypt.log查看证书申请、续签详情2. 定时bat脚本运行日志C:\Certbot\run.log排查任务计划后台执行异常。日志关键关键字-no renewal failures续签检测执行无错误-Certificate not yet due for renewal证书还未到续期时间仅检测不更新-Successfully renewed certificate真正完成证书续签仅剩余有效期≤30天时才会出现。风险说明1. Certbot对Windows为非原生适配极少数场景下后台任务会偶发阻塞如频繁出现卡死推荐使用Windows原生工具win‑acme2. Let’s Encrypt续签逻辑仅证书剩余有效期 ≤30天定时任务才会下载新证书其余时间只做连通性校验不会修改文件3. 续签成功后自动执行nginx -s reload热加载证书业务无中断。 执行逻辑每月1号凌晨3点自动执行bat脚本 → certbot检测证书状态 → 需要续期就更新证书文件 → 执行nginx重载加载新证书全程无需人工干预。四、小程序前端代码修改修改工具类api.js接口基地址❌本地调试旧地址constDEFAULT_BASEhttp://127.0.0.1:本地开发端口;✅服务器HTTPS正式地址constDEFAULT_BASEhttps://项目正式域名; 注意末尾不要多余斜杠避免接口拼接出现双斜杠错误。五、微信公众平台服务器域名配置 ⚠️大坑开发者工具中勾选「不校验合法域名」仅电脑模拟器生效手机真机完全无效1. 浏览器登录微信公众平台 mp.weixin.qq.com2. 开发 → 开发设置 → 服务器域名3. 修改request合法域名填入https://项目正式域名4. 使用管理员微信扫码确认保存。六、小程序预览版 / 体验版 / 正式版区分版本生成方式权限说明是否需要上传代码用途预览版开发者工具点击预览扫码仅限项目管理员、开发者微信访问其他人扫码报错不需要上传代码本地快速开发调试有效期30分钟体验版开发者工具上传代码mp后台生成必须手动添加体验成员微信号否则提示暂无体验权限需要上传代码内部人员测试不需要微信审核正式版上传代码提交审核发布全部普通用户可访问上传微信审核对外上线使用 ✨重要知识点预览版、体验版、正式版共用同一套后端和MySQL数据库。修改服务器数据库数据全部版本立刻同步生效不需要重新上传小程序前端代码修改页面、js等前端代码才需要开发者工具上传。 体验版补充mp后台【体验版设置】可以配置默认启动页面例如填写pages/login/login扫码直接跳转登录页该配置仅针对体验版生效。七、常见报错速查表现象排查方向手机小程序报域名校验失败mp网页后台配置request合法域名模拟器跳过校验对真机无效接口502 Bad GatewayPM2查看服务状态不要使用npm run start直接运行确认Nginx正常启动接口500内部服务器错误执行pm2 logs jixiao-api查看后端日志优先排查SQL执行报错扫体验版二维码提示暂无体验权限公众平台后台把测试微信账号加入体验成员列表Certbot申请证书返回404Nginx配置是否放行/.well-known/acme-challenge路径安全组开放80端口HTTPS一段时间后突然失效检查证书有效期确认Windows任务计划程序自动续签任务正常运行八、总结1. Windows云服务器Node后端生产环境严禁直接运行npm run start必须使用PM2做进程守护防止断开远程桌面服务停止。2. Windows部署NginxCertbot一定要单独配置.well-known/acme-challenge路径否则证书校验报404。3. 微信小程序真机域名限制只认公众网页后台配置开发者工具调试选项不会影响手机。4. Let’s Encrypt证书只有90天有效期Windows系统依靠任务计划程序完成自动续签避免证书过期服务瘫痪。5. 区分小程序前端代码变更和数据库变更改前端页面需要上传修改数据库不需要上传小程序。6. 本地导出的SQL脚本不要直接在服务器执行优先核对服务器真实表结构规避字段缺失、外键报错。