从零搭建微信小程序后端域名、备案、HTTPS 证书与 Nginx以 perfecttools.top 为例一、背景微信小程序强制要求所有网络请求通过 HTTPS 协议且服务器域名必须完成 ICP 备案。对于刚接触的开发者从注册域名、DNS 解析、备案、申请 SSL 证书到配置 Nginx 反向代理后端服务最后在小程序后台设置合法域名整个链路节点多且跨平台。本文以华为云 Ubuntu 服务器 腾讯云注册的perfecttools.top域名为例详细记录完整部署流程。特别使用acme.sh工具申请和管理 Let’s Encrypt 免费证书并实现自动续期。同时借助子域名划分不同功能模块如api.perfecttools.top、admin.perfecttools.top让整体架构更清晰易维护。二、发展早期微信小程序对 HTTPS 的严格要求增加了部署门槛但 Let’s Encrypt 等免费证书的出现大幅降低了成本。acme.sh作为纯 Shell 实现的 ACME 客户端安装零依赖、配置简单、自动续期稳定成为很多运维人员的首选。Nginx 凭借其高性能和灵活的代理能力一直是 SSL 终结和反向代理的事实标准。如今这套组合已成为个人开发者和小型团队快速上线小程序的标配方案。三、目的本文将以一个微信小程序 demo 为主线串联以下完整流程在腾讯云注册域名perfecttools.top并划分子域名配置 DNS 解析将不同子域名指向华为云服务器提交 ICP 备案在华为云 ECS 上安装 Nginx 并部署后端服务使用acme.sh申请免费 SSL 证书并配置自动续期配置 Nginx 启用 HTTPS 并按子域名反向代理到对应后端模块在小程序后台配置合法域名并通过wx.request进行接口调用验证整条链路四、核心概念与架构4.1 核心术语子域名在主域名前添加前缀用于划分不同服务模块如api.perfecttools.top提供 APIadmin.perfecttools.top提供管理后台。A 记录DNS 中将域名指向 IPv4 地址的记录。ICP 备案中国大陆境内提供 Web 服务的网站必须完成工信部备案。ACME 协议自动化证书管理环境协议Let’s Encrypt 使用该协议验证域名所有权并签发证书。acme.sh一款轻量 Shell 脚本支持多种 DNS API 自动完成域名验证实现证书自动申请和续期。Nginx 反向代理将 HTTPS 请求解密后转发给后端应用并将响应加密返回客户端。SSL 终结在 Nginx 层面处理 SSL 加密和解密后端服务只需处理 HTTP。4.2 整体架构图HTTPSHTTP :8080HTTP :8081静态文件SSL 证书自动续期A 记录微信小程序NginxSpring Boot API 服务管理后台静态页面acme.shLets Encrypt腾讯云 DNS华为云 ECS4.3 核心业务流程API微信小程序Nginxacme.sh华为云 ECS腾讯云 DNS开发者API微信小程序Nginxacme.sh华为云 ECS腾讯云 DNS开发者添加 A 记录 (api / admin)解析至服务器 IP安装 Nginx 后端应用运行 acme.sh 申请证书通过 DNS API 验证域名安装证书到指定目录配置 SSL 并重载HTTPS 请求 api.perfecttools.top代理请求返回 JSON加密响应QAQ1为什么小程序必须使用 HTTPSA微信要求所有网络请求加密传输防止中间人攻击和数据泄露保护用户隐私。Q2acme.sh 与 Certbot 的主要区别Aacme.sh 无需 root 权限零系统依赖对 DNS API 的支持更丰富配置更轻量尤其适合自动化场景。五、详细操作步骤5.1 域名申请与子域名规划在腾讯云注册perfecttools.top并规划以下子域名子域名功能后端端口说明api.perfecttools.topAPI 接口8080小程序调用的主接口admin.perfecttools.top管理后台8081内部管理界面static.perfecttools.top静态资源-直接由 Nginx 返回根域名官网首页-静态页面5.2 DNS 解析在腾讯云 DNS 解析控制台添加 A 记录主机记录api类型 A值华为云服务器公网 IP主机记录admin类型 A值同上主机记录static类型 A值同上主机记录类型 A值同上待解析生效后可通过ping api.perfecttools.top验证。5.3 ICP 备案在腾讯云备案系统提交备案信息填写网站名称、用途等上传身份证件。一般需 15~20 个工作日。备案通过后会获得备案号需要在网站底部展示。5.4 服务器环境搭建华为云 Ubuntu 20.04# 更新系统sudoaptupdatesudoaptupgrade-y# 安装 Nginxsudoaptinstallnginx-y# 开放防火墙端口sudoufw allowNginx Full# 华为云安全组需同时放行 80 和 443 端口# 启动 Nginxsudosystemctlenablenginxsudosystemctl start nginx5.5 部署后端服务示例假设我们有两个 Spring Boot 服务api-service.jar监听 8080admin-service.jar监听 8081为每个服务创建 systemd 管理文件# /etc/systemd/system/api-service.service[Unit]DescriptionAPI ServiceAfternetwork.target[Service]ExecStart/usr/bin/java-jar/opt/apps/api-service.jarUserwww-dataRestartalways[Install]WantedBymulti-user.target类似地创建admin-service.service然后启动sudosystemctl daemon-reloadsudosystemctlenableapi-service admin-servicesudosystemctl start api-service admin-service5.6 使用 acme.sh 申请 SSL 证书安装 acme.shcurlhttps://get.acme.sh|sh-semailyour-emailexample.comsource~/.bashrc配置 DNS API以腾讯云为例acme.sh 支持数百个 DNS 服务商的 API 自动验证。对于腾讯云需要设置DNSPod API Token腾讯云 DNSPod 与腾讯云账户互通。exportDP_Id你的DNSPod IDexportDP_Key你的DNSPod Token申请泛域名证书推荐一次申请覆盖所有子域名acme.sh--issue--dnsdns_dp-dperfecttools.top-d*.perfecttools.topdns_dp是 acme.sh 内置的腾讯云 DNSPod 接口。完成后证书保存在~/.acme.sh/perfecttools.top_ecc/目录默认使用 ECC 密钥。安装证书到 Nginx 使用的目录sudomkdir-p/etc/nginx/ssl/perfecttools.top acme.sh --install-cert-dperfecttools.top-d*.perfecttools.top\--key-file /etc/nginx/ssl/perfecttools.top/privkey.pem\--fullchain-file /etc/nginx/ssl/perfecttools.top/fullchain.pem\--reloadcmdsudo systemctl reload nginx该命令将证书复制到/etc/nginx/ssl/目录并在证书更新时自动重载 Nginx。自动续期acme.sh 安装时已自动添加 cron 任务每天检查证书有效期到期前 60 天自动续期。可通过以下命令查看crontab-l|grepacme.sh5.7 Nginx 配置 HTTPS 与反向代理编辑/etc/nginx/sites-available/perfecttools.top# HTTP 跳转到 HTTPS server { listen 80; server_name perfecttools.top *.perfecttools.top; return 301 https://$host$request_uri; } # API 子域名 server { listen 443 ssl http2; server_name api.perfecttools.top; ssl_certificate /etc/nginx/ssl/perfecttools.top/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/perfecttools.top/privkey.pem; ssl_trusted_certificate /etc/nginx/ssl/perfecttools.top/fullchain.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { proxy_pass http://127.0.0.1:8080; 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 https; } } # Admin 管理后台 server { listen 443 ssl http2; server_name admin.perfecttools.top; # 复用相同证书因为泛域名证书已覆盖 ssl_certificate /etc/nginx/ssl/perfecttools.top/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/perfecttools.top/privkey.pem; ssl_trusted_certificate /etc/nginx/ssl/perfecttools.top/fullchain.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { proxy_pass http://127.0.0.1:8081; 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 https; } } # 根域名静态页面 server { listen 443 ssl http2; server_name perfecttools.top; ssl_certificate /etc/nginx/ssl/perfecttools.top/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/perfecttools.top/privkey.pem; ssl_trusted_certificate /etc/nginx/ssl/perfecttools.top/fullchain.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; root /var/www/html; index index.html; }启用站点并重载 Nginxsudoln-s/etc/nginx/sites-available/perfecttools.top /etc/nginx/sites-enabled/sudonginx-tsudosystemctl reload nginx5.8 微信小程序配置小程序后台设置合法域名登录微信公众平台 - 开发 - 开发管理 - 服务器域名在request 合法域名中添加https://api.perfecttools.top每月可修改 5 次且必须为备案域名小程序端调用示例// 在小程序的 app.js 或页面逻辑中wx.request({url:https://api.perfecttools.top/greeting,method:GET,success(res){console.log(服务器返回:,res.data);},fail(err){console.error(请求失败,err);}})后端提供测试接口RestControllerpublicclassGreetingController{GetMapping(/greeting)publicStringgreeting(){returnHello from API service!;}}使用微信开发者工具编译预览即可看到请求成功返回数据。5.9 验证全链路浏览器直接访问https://api.perfecttools.top/greeting应显示 JSON 或字符串。使用curl -v https://api.perfecttools.top/greeting检查 SSL 握手是否成功。检查acme.sh状态acme.sh --list列出所有证书和到期时间。在微信开发者工具中查看 Network 面板确认请求地址为合法域名且无证书错误。六、高性能设计6.1 HTTP/2 支持Nginx 配置中已添加http2多路复用减少延迟。6.2 Gzip 压缩gzip on; gzip_types text/plain application/json; gzip_min_length 1000;6.3 会话缓存与 OCSP 装订ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 114.114.114.114 valid300s;6.4 缓冲区调优proxy_buffer_size 16k; proxy_buffers 4 64k; proxy_busy_buffers_size 128k;七、可靠性与安全性7.1 acme.sh 自动续期保障acme.sh 的 cron 任务默认每天 0 点检查到期前自动续期并执行--reloadcmd。若担心漏续可监控证书到期时间如通过acme.sh --list输出解析。7.2 强制 HTTPS 与 HSTS在 SSL server 块中添加add_header Strict-Transport-Security max-age63072000 always;7.3 权限控制SSL 私钥目录ssl/权限设置为 700文件 600。后端应用与 Nginx 通过 127.0.0.1 通信不暴露公网端口。7.4 限制访问频率limit_req_zone $binary_remote_addr zoneapi_limit:10m rate20r/s; server { location / { limit_req zoneapi_limit burst50 nodelay; # ... } }八、进阶多模块与扩展8.1 增加新子域名的步骤DNS 添加对应 A 记录。如果需要独立证书可单独用 acme.sh 申请但因为已有泛域名证书直接复用即可。在 Nginx 中新增server块配置代理或静态目录。重载 Nginx。8.2 动态路由与 Nacos 集成若后端采用微服务框架Nginx 可以仅作为 API 网关的统一入口再通过 Spring Cloud Gateway 将请求路由到不同微服务实现更精细的控制。九、生产环境最佳实践备份与恢复定期备份/etc/letsencrypt/或 acme.sh 的证书目录以及 Nginx 配置文件。日志集中管理接入 ELK 或云日志服务监控 Nginx 访问和错误日志。自动化部署使用 CI/CD 工具更新后端 jar 包后自动重启 systemd 服务。监控告警配置 UptimeRobot 探测 API 接口可用性设置证书到期前 30 天邮件提醒通过 acme.sh 的--renew-hook脚本实现。安全更新定期sudo apt update sudo apt upgrade更新系统及 Nginx 版本。十、总结与推荐阅读从域名注册、备案、DNS 解析到 acme.sh 自动申请泛域名 SSL 证书再到 Nginx 反向代理后端服务最后在小程序后台完成域名绑定整个过程虽然涉及多个平台但每一步都有章可循。利用泛域名证书和 acme.sh 的自动续期可以大大降低运维负担通过子域名划分不同功能模块让架构更清晰也为未来扩展留足了空间。【额外内容】小程序备案、ICP备案等国家审批时候同时只能有一个提交审批另一个会被立即打回。推荐阅读acme.sh 官方 WikiLet’s Encrypt 官方文档Nginx 入门指南微信小程序网络请求详解