一、前提条件
已安装 Serverless Cloud Framework, 已开通服务并完成 Serverless Cloud Framework 的 权限配置。
二、支持框架
| 支持框架 | 相关文档 |
| Express | 快速部署 Express 框架 |
| Koa | 快速部署 Koa 框架 |
| Egg | 快速部署 Egg 框架 |
| Next.js | 快速部署 Nextjs 框架 |
| Nuxt.js | 快速部署 Nuxtjs 框架 |
| Nest.js | 快速部署 Nestjs 框架 |
| Flask | 快速部署 Flask 框架 |
| Django | 快速部署 Django 框架 |
| Laravel | 快速部署 Laravel 框架 |
三、操作步骤
1. 本地开发应用
根据你实际业务场景,本地完成开发,详情可参考 支持框架 开发文档。
2. 配置 yml 文件
在项目根目录下,新建 serverless.yml 文件,按照以下示例进行配置编写。全量配置请参考 配置文档。
# serverless.ymlcomponent: http # (必选) 组件名称name: webDemo # 必选) 组件实例名称.inputs: region: ap-guangzhou # 云函数所在区域 src: # 部署src下的文件代码,并打包成zip上传到bucket上 src: ./ # 本地需要打包的文件目录 exclude: # 被排除的文件或目录 – .env – 'node_modules/**' faas: # 函数配置相关 framework: express #选择框架,此处以 express 为例 runtime: Nodejs12.16 name: webDemo # 云函数名称 timeout: 10 # 超时时间,单位秒 memorySize: 512 # 内存大小,默认 512 MB layers: – name: layerName # layer名称 version: 1 # 版本 apigw: # # http 组件会默认帮忙创建一个 API 网关服务 isDisabled: false # 是否禁用自动创建 API 网关功能 id: service-xxx # api网关服务ID,不填则自动新建网关 name: serverless # api网关服务ID api: # 创建的 API 相关配置 cors: true # 允许跨域 timeout: 15 # API 超时时间 name: apiName # API 名称 qualifier: $DEFAULT # API 关联的版本 protocols: – http – https environment: test
3. 创建完成后,在根目录下执行 scf deploy 进行部署,组件会根据选择的框架类型,自动生成 scf_bootstrap 启动文件进行部署。
注意:由于启动文件逻辑与用户业务逻辑强关联,默认生成的启动文件可能导致框架无法正常启动,建议你根据实际业务需求,手动配置启动文件,详情参考各框架的部署指引文档。
四、示例 scf_bootstrap
·express:
#!/usr/bin/env bash/var/lang/node12/bin/node app.js
·koa
#!/usr/bin/env bash/var/lang/node12/bin/node app.js
·egg
#!/var/lang/node12/bin/node/** * docker 中 node 路径:/var/lang/node12/bin/node * 由于 serverless 函数只有 /tmp 读写权限,所以在启动时需要修改两个环境变量 * NODE_LOG_DIR 是为了改写 egg-scripts 默认 node 写入路径(~/logs)-> /tmp * EGG_APP_CONFIG 是为了修改 egg 应有的默认当前目录 -> /tmp */process.env.EGG_SERVER_ENV = 'prod';process.env.NODE_ENV = 'production';process.env.NODE_LOG_DIR = '/tmp';process.env.EGG_APP_CONFIG = '{"rundir":"/tmp","logger":{"dir":"/tmp"}}';const { Application } = require('egg');// 如果通过层部署 node_modules 就需要修改 eggPathObject.defineProperty(Application.prototype, Symbol.for('egg#eggPath'), { value: '/opt',});const app = new Application({ mode: 'single', env: 'prod',});app.listen(9000, '0.0.0.0', () => { console.log('Server start on http://0.0.0.0:9000');});
·nextjs
#!/var/lang/node12/bin/node/*# HTTP 直通函数由于是基于 docker 镜像运行,所以必须监听地址为 0.0.0.0,并且端口为 9000*/const { nextStart } = require('next/dist/cli/next-start');nextStart(['–port', '9000', '–hostname', '0.0.0.0']);
·nuxtjs
#!/var/lang/node12/bin/node/*# HTTP 直通函数由于是基于 docker 镜像运行,所以必须监听地址为 0.0.0.0,并且端口为 9000*/require('@nuxt/cli') .run(['start', '–port', '9000', '–hostname', '0.0.0.0']) .catch((error) => { require('consola').fatal(error); require('exit')(2); });
·nestjs
#!/bin/bash# SERVERLESS=1 /var/lang/node12/bin/npm run start — -e /var/lang/node12/bin/nodeSERVERLESS=1 /var/lang/node12/bin/node ./dist/main.js
·flask
#!/bin/bash# HTTP 直通函数由于是基于 docker 镜像运行,所以必须监听地址为 0.0.0.0,并且端口为 9000/var/lang/python3/bin/python3 app.py
·django
#!/bin/bash# HTTP 直通函数由于是基于 docker 镜像运行,所以必须监听地址为 0.0.0.0,并且端口为 9000/var/lang/python3/bin/python3 manage.py runserver 0.0.0.0:9000
·laravel
#!/bin/bash######################################## 注入 serverless 环境下的环境变量######################################## 注入 SERVERLESS 标识export SERVERLESS=1# 修改模板编译缓存路径,云函数只有 /tmp 目录可读写export VIEW_COMPILED_PATH=/tmp/storage/framework/views# 修改 session 以内存方式(数组类型)存储export SESSION_DRIVER=array# 日志输出到 stderrexport LOG_CHANNEL=stderr# 修改应用存储路径export APP_STORAGE=/tmp/storage# 初始化模板缓存目录mkdir -p /tmp/storage/framework/views# HTTP 直通函数由于是基于 docker 镜像运行,所以必须监听地址为 0.0.0.0,并且端口为 9000# 云端可执行文件路径 /var/lang/php7/bin/php/var/lang/php7/bin/php artisan serve –host 0.0.0.0 –port 9000