访问云服务器
云开发提供了多种方式访问轻量应用服务器上部署的服务,满足不同场景的需求:
| 访问方式 | 适用场景 | 特点 |
|---|---|---|
| 小程序 SDK 访问 | 微信小程序调用后端服务 | 内网访问、自动携带用户身份、无需暴露公网 IP |
| 公网 IP 直连 | 开发测试、临时访问 | 灵活、支持任意协议和端口 |
推荐方式
- 小程序场景:使用 小程序 SDK 访问,享受内网加速和身份认证能力
- 开发调试:可以临时使用 公网 IP 直连 进行快速验证
方式一:小程序 SDK 访问
小程序可以通过微信云开发 SDK 直接调用云服务器接口,无需暴露公网 IP,享受内网加速和自动身份认证。当前小程序 SDK 访问时,仅可以请求到云服务器上的 80 端口,请确保在 80 端口上启动服务并进行监听。
前置准备
确保云服务器上的服务已启动并监听 80 端口。可以通过以下方式实现:
- 使用 Nginx 反向代理:将 80 端口转发到应用端口
- 应用直接监听 80 端口:配置 Web 框架(如 Express、Flask 等)监听 80 端口
代码示例
// 1. 在小程序 app.js 的 onLaunch 中初始化云开发环境
wx.cloud.init({
env: 'your-env-id', // 替换为你的环境 ID
traceUser: true,
})
// 2. 在需要调用的地方使用 callContainer 方法
const result = await wx.cloud.callContainer({
config: {
env: "your-env-id" // 可以在调用时指定环境
},
header: {
"X-WX-SERVICE": "tcbanyservice", // 【必填】固定值,指定云开发服务
"X-Vm-Service": "lhins-xxxxxxxxx", // 【必填】替换为你的实例 ID
// 可以添加其他自定义 Header
},
path: "/api/user/info", // API 路径
method: "POST", // HTTP 方法
data: { // 请求参数
userId: 123
}
})
console.log('Response:', result.data)
核心参数说明
| Header 字段 | 是否必填 | 说明 | 示例值 |
|---|---|---|---|
X-WX-SERVICE | ✅ 必填 | 固定为 tcbanyservice,用于路由到云开发服务 | tcbanyservice |
X-Vm-Service | ✅ 必填 | 轻量服务器的实例 ID,在控制台可查看 | lhins-abc123 |
如何获取实例 ID
在 云开发控制台 - 云服务器 页面,点击服务器名称可查看实例 ID(格式如 lhins-xxxxxxxxx)
调试步骤
-
本地验证:使用公网 IP + 80 端口测试服务是否正常
curl http://<服务器公网IP>/api/user/info -
小程序端验证:确认本地验证通过后,在小程序开发者工具中测试 SDK 调用
自动注入的信息
云开发会在请求 Header 中自动携带小程序用户和环境信息,后端服务可直接读取这些 Header 实现身份验证和业务逻辑:
用户身份信息
| Header 字段 | 说明 | 示例 |
|---|---|---|
X-WX-OPENID | 用户 OpenID(用户唯一标识) | oABCD1234567890 |
X-WX-APPID | 小程序 AppID | wx1234567890abcdef |
X-WX-UNIONID | 用户 UnionID(跨应用标识,需满足条件) | oUNIONabcd123456 |
环境与调用信息
| Header 字段 | 说明 | 示例 |
|---|---|---|
X-WX-ENV | 云开发环境 ID | test-1a2b3c |
X-WX-SOURCE | 调用来源 | wx_devtools(开发者工具)wx_client(真机) |
X-WX-PLATFORM | 调用平台 | devtools / android / ios |
X-Forwarded-For | 客户端真实 IP(支持 IPv4/IPv6) | 192.168.1.100 |
资源复用场景(当使用其他小程序的云资源时)
| Header 字段 | 说明 |
|---|---|
X-WX-FROM-OPENID | 资源所属小程序的用户 OpenID |
X-WX-FROM-APPID | 资源所属小程序的 AppID |
X-WX-FROM-UNIONID | 资源所属小程序的用户 UnionID |
后端获取示例(Node.js Express)
app.post('/api/user/info', (req, res) => {
// 获取用户 OpenID
const openid = req.headers['x-wx-openid']
const appid = req.headers['x-wx-appid']
console.log('User OpenID:', openid)
console.log('App ID:', appid)
// 业务逻辑...
res.json({ code: 0, message: 'success' })
})
响应信息
云开发会在响应中添加调试和监控相关的 Header:
| Header 字段 | 说明 |
|---|---|
X-Cloudbase-Request-Id | 请求唯一标识,用于问题追踪和日志查询 |
X-Cloudbase-Upstream-Status-Code | 后端服务实际返回的 HTTP 状态码 |
X-Cloudbase-Upstream-Timecost | 后端服务处理耗时(毫秒) |
X-Cloudbase-Upstream-Type | 后端服务类型标识 |
故障排查
遇到问题时,请记录 X-Cloudbase-Request-Id,提供给技术支持以便快速定位问题。
方式二:公网 IP 直连
轻量应用服务器默认分配公网 IP 地址,可以直接通过 IP 访问服务器上运行的服务。
适用场景
- 🔧 开发调试:快速验证服务是否正常运行
- 🧪 临时测试:无需配置域名即可测试功能
- 🌐 非 HTTP 协议:访问 SSH、数据库、自定义协议服务
访问方式
HTTP/HTTPS 服务
# HTTP 访问(默认 80 端口)
curl http://<公网IP>/api/hello
# HTTPS 访问(需要服务器配置 SSL 证书)
curl https://<公网IP>:443/api/hello
# 自定义端口
curl http://<公网IP>:8080/api/hello
SSH 连接
ssh root@<公网IP>
数据库连接
# MySQL 示例
mysql -h <公网IP> -P 3306 -u root -p
特点
| 特性 | 说明 |
|---|---|
| 协议支持 | 支持任意协议(HTTP、HTTPS、TCP、UDP 等) |
| 端口限制 | 无限制,由服务器上运行的服务决定 |
| 安全性 | 需要注意配置防火墙规则,避免暴露不必要的端口 |
| 稳定性 | IP 地址可能会变化(重启服务器等操作) |
安全提示
- 生产环境不建议使用:公网 IP 直连缺少 HTTPS 加密和访问控制,存在安全风险
- 配置防火墙:在控制台的防火墙设置中,仅开放必要的端口(如 80、443、22)
- 使用强密码:如果开放 SSH 等管理端口,务必使用强密码或密钥认证
查看公网 IP
在 云开发控制台 - 云服务器 页面,点击服务器实例可查看公网 IP 地址。
常见问题
Q1:小程序 SDK 访问云服务器报错 "找不到服务"?
可能原因:
X-Vm-Service填写的实例 ID 不正确- 服务器上的服务未监听 80 端口
- 服务器防火墙未开放 80 端口
解决方法:
- 在控制台确认实例 ID(格式如
lhins-xxxxxxxxx) - 在服务器上执行
netstat -tlnp | grep 80确认服务已监听 - 先用公网 IP + 80 端口测试服务是否正常
Q2:如何在后端获取小程序用户的 OpenID?
通过小程序 SDK 调用时,云开发会自动在请求 Header 中注入用户信息:
// Node.js 示例
app.post('/api/user/info', (req, res) => {
const openid = req.headers['x-wx-openid']
const appid = req.headers['x-wx-appid']
if (!openid) {
return res.status(401).json({ error: '未授权' })
}
// 使用 openid 进行业务逻辑
res.json({ openid, appid })
})
Q3:生产环境应该选择哪种访问方式?
推荐方案:
- 小程序场景:使用「小程序 SDK 访问」,享受内网加速和自动身份认证
- 避免使用:公网 IP 直连(仅适合开发测试)
原因:
- 公网 IP 可能会变化,不适合长期使用
- 缺少 HTTPS 加密,存在数据泄露风险
- 无法进行统一的访问控制和流量管理