微信云托管
微信云托管是腾讯提供的 Serverless 容器服务,基于 Docker 镜像部署,免去服务器购买和运维,适合微信小程序/公众号的后端服务快速上线。
📖 官方文档:https://developers.weixin.qq.com/miniprogram/dev/wxcloudservice/wxcloudrun/src/basic/intro.html
🎬 视频教程:https://developers.weixin.qq.com/community/business/course/00068c2c0106c0667f5b01d015b80d
TODO
微信云托管还在探索,目前有很多疑点,该文章仅能作为了解。
一、GitHub 流水线部署
核心概念
微信云托管通过 GitHub 流水线,拉取你的代码 → 读取 Dockerfile → 构建镜像 → 启动容器。
理解这一点很重要:Dockerfile 中的宿主机路径,指的是你的代码仓库目录,不是某台真实服务器。
# Dockerfile 中:
COPY src /demo-server/src
# 这里的 src 就是你 GitHub 仓库根目录下的 src 文件夹Dockerfile 示例(Spring Boot)
# ── 阶段一:Maven 构建 ────────────────────────────────────
FROM maven:3.6.0-jdk-8-slim AS build
WORKDIR /demo-server
COPY settings.xml pom.xml /demo-server/
COPY src /demo-server/src
# 使用自定义 settings.xml 中的国内镜像源加速依赖下载
RUN mvn -s /demo-server/settings.xml -f /demo-server/pom.xml clean package -DskipTests
# ── 阶段二:运行 ──────────────────────────────────────────
FROM openjdk:8-jre
LABEL maintainer="your@email.com"
WORKDIR /demo-server
# 统一重命名 jar,避免版本号变化导致启动命令失效
COPY --from=build /demo-server/target/*.jar app.jar
EXPOSE 80
CMD ["java", "-jar", "app.jar"]端口号三处必须一致
部署时有三个地方都需要填端口号,必须保持一致,否则服务无法正常访问:
| 位置 | 说明 |
|---|---|
Dockerfile EXPOSE | 声明容器监听的端口 |
| 微信云托管「服务配置」 | 平台路由的端口 |
| 微信云托管「流水线配置」 | 构建时指定的端口 |
HTTP / HTTPS 默认端口
- HTTP 默认 80,HTTPS 默认 443
- 如果用的是非标准端口(如 8080),三处都要写
8080,不要混写
Dockerfile 与项目目录关系
Dockerfile 文件必须与项目根目录同级,流水线才能找到它。可通过「目标目录」配置来锁定具体位置。
参考官方 Spring Boot 示例:https://github.com/WeixinCloud/wxcloudrun-springboot

二、环境变量配置
微信云托管支持在控制台配置环境变量,效果类似 Docker 的 -e 参数,但不完全等同(有些中间件读不到,见下文)。
等效的 Docker 命令理解:
docker run -e MYSQL_HOST=xxx -e MYSQL_PASSWORD=yyy my_imageSpring Boot 读取环境变量
在 application.yml 中用 ${变量名} 语法引用:

spring:
datasource:
druid:
master:
url: jdbc:mysql://${MYSQL_HOST}/mydb?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
username: root
password: ${MYSQL_PASSWORD}Node.js 读取环境变量
const serverAddress = process.env.SERVER_ADDRESS;
const dbPassword = process.env.DB_PASSWORD;环境变量的作用范围
微信云托管的环境变量只能在应用程序代码中读取(Java、Node、Python 等),不能直接在 Nginx 配置文件中使用。
原因:Nginx 的 $xxx 读取的是容器操作系统的环境变量,而不是微信云托管注入的应用层环境变量,两者注入机制不同。
三、Nginx 配置
问题背景
很多人会想在 nginx.conf 里用微信云托管的环境变量动态配置代理地址,但这行不通:
# ❌ 这里的 $SERVER_ADDRESS 读的是系统环境变量,不是云托管的应用变量
location /prod-api/ {
proxy_pass $SERVER_ADDRESS;
}解决方案
方案一:直接写死(推荐)
内网域名一般不会变,直接硬编码最简单,也不存在安全风险:
location /prod-api/ {
rewrite ^/prod-api(/.*)$ $1 break;
proxy_pass http://dlnmpwnf.holmes-center-server.hahsntqc.ie54110f.com:8080/;
}方案二:启动脚本动态写入
通过 shell 脚本在容器启动时读取环境变量,动态生成 Nginx 配置,再启动 Nginx:
#!/bin/bash
# 从容器环境变量读取后端地址(需在 Dockerfile 或 docker run 中设置)
BACKEND_HOST=${BACKEND_HOST:-"localhost"}
BACKEND_PORT=${BACKEND_PORT:-"8080"}
# 动态生成 Nginx 配置
cat > /etc/nginx/conf.d/default.conf << EOF
server {
listen 80;
location /prod-api/ {
rewrite ^/prod-api(/.*)$ \$1 break;
proxy_pass http://${BACKEND_HOST}:${BACKEND_PORT}/;
}
location / {
root /usr/share/nginx/html;
try_files \$uri \$uri/ /index.html;
}
}
EOF
# 启动 Nginx
nginx -g 'daemon off;'在 Dockerfile 中用这个脚本作为入口:
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]四、内网地址使用
微信云托管中每个服务都有一个内网地址,用于服务之间互相调用(比如前端 Nginx 代理后端 API)。
内网地址规则
两个常见错误
- 协议错误:内网地址走的是
http://,不是https:// - 端口错误:端口是
EXPOSE声明的实际端口(如 8080),不是 443
正确的代理配置示例:
# ✅ 正确:http 协议 + 实际端口
location /prod-api/ {
rewrite ^/prod-api(/.*)$ $1 break;
proxy_pass http://dlnmpwnf.holmes-center-server.hahsntqc.ie54110f.com:8080/;
}
# ❌ 错误:用了 https 且省略端口
# proxy_pass https://dlnmpwnf.holmes-center-server.hahsntqc.ie54110f.com/;内网地址格式通常为:http://<随机前缀>.<服务名>.<环境ID>.<appid>.com:<端口>
五、Webshell 调试
微信云托管提供了 Webshell 功能,可以直接进入运行中的容器执行命令,排查服务间调不通等问题非常方便。

常用调试命令:
# 测试服务连通性
curl http://内网地址:端口/health
# 查看环境变量
env | grep -i mysql
# 查看进程是否启动
ps aux | grep java
# 查看端口监听
netstat -tlnp | grep 8080