Skip to content

微信云托管

微信云托管是腾讯提供的 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)

dockerfile
# ── 阶段一: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

image-20250217188880004.png


二、环境变量配置

微信云托管支持在控制台配置环境变量,效果类似 Docker 的 -e 参数,但不完全等同(有些中间件读不到,见下文)。

等效的 Docker 命令理解:

bash
docker run -e MYSQL_HOST=xxx -e MYSQL_PASSWORD=yyy my_image

Spring Boot 读取环境变量

application.yml 中用 ${变量名} 语法引用:

image-20250217188880005.png

yaml
spring:
  datasource:
    druid:
      master:
        url: jdbc:mysql://${MYSQL_HOST}/mydb?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
        username: root
        password: ${MYSQL_PASSWORD}

Node.js 读取环境变量

js
const serverAddress = process.env.SERVER_ADDRESS;
const dbPassword = process.env.DB_PASSWORD;

环境变量的作用范围

微信云托管的环境变量只能在应用程序代码中读取(Java、Node、Python 等),不能直接在 Nginx 配置文件中使用

原因:Nginx 的 $xxx 读取的是容器操作系统的环境变量,而不是微信云托管注入的应用层环境变量,两者注入机制不同。


三、Nginx 配置

问题背景

很多人会想在 nginx.conf 里用微信云托管的环境变量动态配置代理地址,但这行不通:

nginx
# ❌ 这里的 $SERVER_ADDRESS 读的是系统环境变量,不是云托管的应用变量
location /prod-api/ {
    proxy_pass $SERVER_ADDRESS;
}

解决方案

方案一:直接写死(推荐)

内网域名一般不会变,直接硬编码最简单,也不存在安全风险:

nginx
location /prod-api/ {
    rewrite ^/prod-api(/.*)$ $1 break;
    proxy_pass http://dlnmpwnf.holmes-center-server.hahsntqc.ie54110f.com:8080/;
}

方案二:启动脚本动态写入

通过 shell 脚本在容器启动时读取环境变量,动态生成 Nginx 配置,再启动 Nginx:

bash
#!/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 中用这个脚本作为入口:

dockerfile
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

四、内网地址使用

微信云托管中每个服务都有一个内网地址,用于服务之间互相调用(比如前端 Nginx 代理后端 API)。

内网地址规则

两个常见错误

  1. 协议错误:内网地址走的是 http://,不是 https://
  2. 端口错误:端口是 EXPOSE 声明的实际端口(如 8080),不是 443

正确的代理配置示例:

nginx
# ✅ 正确: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 功能,可以直接进入运行中的容器执行命令,排查服务间调不通等问题非常方便。

image-20250217188880006.png

常用调试命令:

bash
# 测试服务连通性
curl http://内网地址:端口/health

# 查看环境变量
env | grep -i mysql

# 查看进程是否启动
ps aux | grep java

# 查看端口监听
netstat -tlnp | grep 8080