Skip to content

Latest commit

 

History

History
349 lines (264 loc) · 8.3 KB

File metadata and controls

349 lines (264 loc) · 8.3 KB

Express HTTP 云函数部署指南

本指南详细介绍如何将 Express 应用部署到 CloudBase HTTP 云函数。

📋 目录导航


部署特性

HTTP 云函数适合以下场景:

  • 轻量级应用:API 服务、微服务
  • 间歇性访问:不需要持续运行的应用
  • 成本敏感:按请求次数和执行时间计费
  • 快速部署:无需容器化配置

技术特点

特性 说明
计费方式 按请求次数和执行时间
启动方式 冷启动,按需启动
端口要求 固定 9000 端口
扩缩容 自动按请求扩缩
运行时 Node.js 16.x、18.x、20.x

准备部署文件

1. 修改端口配置

编辑 bin/www 文件,确保云函数环境使用 9000 端口:

/**
 * Get port from environment and store in Express.
 */

var port = normalizePort(process.env.PORT || '9000');

⚠️ 重要提示:CloudBase HTTP 云函数要求应用监听 9000 端口。

2. 创建启动脚本

创建 scf_bootstrap 文件(无扩展名):

#!/bin/bash
export PORT=9000
npm start

为启动脚本添加执行权限:

chmod +x scf_bootstrap

3. 优化 package.json

确保 package.json 包含正确的启动脚本:

{
  "name": "cloudrun-express",
  "version": "1.0.0",
  "scripts": {
    "start": "node ./bin/www",
    "dev": "nodemon ./bin/www"
  },
  "dependencies": {
    "express": "^4.18.0",
    "morgan": "^1.10.0",
    "cookie-parser": "^1.4.6",
    "debug": "^4.3.4",
    "http-errors": "^2.0.0",
    "pug": "^3.0.2"
  }
}

项目结构

cloudrun-express/
├── bin/
│   └── www                 # 启动文件
├── public/                 # 静态资源
├── routes/                 # 路由文件
│   ├── index.js
│   ├── users.js
│   └── health.js
├── views/                  # 视图模板
├── app.js                  # 应用主文件
├── package.json           # 项目配置
├── package-lock.json      # 依赖锁定文件
└── scf_bootstrap         # 🔑 云函数启动脚本

💡 说明

  • scf_bootstrap 是 CloudBase 云函数的启动脚本
  • 设置 PORT=9000 环境变量确保应用监听正确端口
  • 使用 npm start 启动应用
  • 云函数会自动安装 package.json 中的依赖

部署步骤

通过控制台部署

  1. 登录 CloudBase 控制台
  2. 选择您的环境,进入「云函数」页面
  3. 点击「新建云函数」
  4. 选择「HTTP 云函数」
  5. 填写函数名称(如:cloudrun-express
  6. 选择运行时:Node.js 18.x(或其他支持的版本)
  7. 提交方法选择:本地上传文件夹
  8. 函数代码选择 cloudrun-express 目录进行上传
  9. 自动安装依赖:开启此选项
  10. 点击「创建」按钮等待部署完成

通过 CLI 部署(敬请期待)

打包部署

如果需要手动打包:

# 创建部署包(排除云托管相关文件)
zip -r cloudrun-express.zip . -x "node_modules/*" ".git/*" "*.log" "Dockerfile" ".dockerignore"

访问应用

获取访问地址

部署成功后,您可以参考通过 HTTP 访问云函数设置自定义域名访问 HTTP 云函数。

访问地址格式:https://your-function-url/

测试接口

  • 根路径/ - Express 欢迎页面
  • 健康检查/health - 查看应用状态
  • 用户列表/api/users - 获取用户列表
  • 用户详情/api/users/1 - 获取特定用户
  • 创建用户POST /api/users - 创建新用户

示例请求

# 健康检查
curl https://your-function-url/health

# 获取用户列表
curl https://your-function-url/api/users

# 创建新用户
curl -X POST https://your-function-url/api/users \
  -H "Content-Type: application/json" \
  -d '{"name":"测试用户","email":"test@example.com"}'

常见问题

Q: 为什么 HTTP 云函数必须使用 9000 端口?

A: CloudBase HTTP 云函数要求应用监听 9000 端口,这是平台的标准配置。通过在 scf_bootstrap 中设置 PORT=9000 环境变量来控制端口。

Q: HTTP 云函数如何处理冷启动?

A: 云函数在没有请求时会自动休眠,首次请求时需要冷启动。可以通过以下方式减少冷启动时间:

  • 减少依赖包大小
  • 使用环境变量缓存配置
  • 避免在函数中进行重复的初始化操作
  • 合理设置内存配置

Q: scf_bootstrap 文件有什么作用?

A: scf_bootstrap 是云函数的启动脚本,用于:

  • 设置环境变量(如 PORT=9000)
  • 启动应用程序
  • 配置运行时环境

Q: 如何查看云函数日志?

A: 在 CloudBase 控制台的云函数页面,点击函数名称进入详情页查看运行日志。

Q: 云函数支持哪些 Node.js 版本?

A: CloudBase 支持 Node.js 16.x、18.x、20.x 等版本,建议使用最新的 LTS 版本。

Q: 如何处理静态文件?

A: Express 的静态文件中间件会自动处理 public 目录下的静态资源。云函数环境支持静态文件服务。

Q: 云函数有哪些限制?

A:

  • 单次执行时间限制(通常为 900 秒)
  • 内存限制(128MB - 3008MB)
  • 临时磁盘空间限制(512MB)
  • 并发请求限制

最佳实践

1. 环境变量管理

app.js 中添加环境变量支持:

// 检测云函数环境
const isCloudFunction = process.env.CLOUDBASE_FUNCTION;

// 动态端口配置
const port = process.env.PORT || (isCloudFunction ? 9000 : 3000);

2. 优化启动脚本

增强 scf_bootstrap 脚本:

#!/bin/bash
export PORT=9000
export NODE_ENV=production
export TZ=Asia/Shanghai

# 检查依赖
if [ ! -d "node_modules" ]; then
    npm install --production
fi

# 启动应用
npm start

3. 错误处理

实现云函数专用的错误处理:

// 云函数错误处理
app.use((err, req, res, next) => {
  console.error('CloudFunction Error:', err.stack);
  
  res.status(err.status || 500).json({
    success: false,
    message: err.message,
    timestamp: new Date().toISOString(),
    requestId: req.headers['x-scf-request-id'] || 'unknown'
  });
});

4. 健康检查优化

增强健康检查接口:

router.get('/', function(req, res, next) {
  res.json({
    status: 'healthy',
    timestamp: new Date().toISOString(),
    framework: 'Express',
    deployment: 'HTTP云函数',
    version: process.env.npm_package_version || '1.0.0',
    node_version: process.version,
    memory_usage: process.memoryUsage(),
    uptime: process.uptime()
  });
});

5. 部署前检查清单

  • scf_bootstrap 文件存在且有执行权限
  • 端口配置为 9000
  • 依赖项在 package.json 中正确声明
  • 排除不必要的文件(如 Dockerfile.dockerignore
  • 测试本地启动是否正常
  • 检查启动脚本语法是否正确
  • 验证环境变量配置
  • 确认日志输出正常

性能优化

1. 减少冷启动时间

// 全局变量缓存
let cachedConfig = null;

function getConfig() {
  if (!cachedConfig) {
    cachedConfig = {
      // 配置项
    };
  }
  return cachedConfig;
}

2. 依赖优化

# 只安装生产依赖
npm install --production

# 清理不必要的文件
npm prune

3. 内存管理

// 监控内存使用
app.use((req, res, next) => {
  const memUsage = process.memoryUsage();
  console.log('Memory Usage:', {
    rss: Math.round(memUsage.rss / 1024 / 1024) + 'MB',
    heapUsed: Math.round(memUsage.heapUsed / 1024 / 1024) + 'MB'
  });
  next();
});

4. 响应优化

// 启用 gzip 压缩
const compression = require('compression');
app.use(compression());

// 设置缓存头
app.use(express.static('public', {
  maxAge: '1d'
}));

相关文档