Serverless HTTP 服务 通过命令行完成框架部署

除了控制台之外,你也可以通过命令行快速部署 Web 框架,本篇文档将具体介绍,如何通过 Serverless 应用中心的 HTTP 组件,完成 Web 应用的本地部署。

相关产品
Serverless HTTP 服务 产品页,含版本规格、价格与购买入口。

一、前提条件

已开通服务并完成 Serverless 应用中心的 权限配置。

二、支持框架

支持框架 相关文档
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

赞 (0)
上一篇 4天前
下一篇 4天前