前言
本文旨在通过 快速部署一个 wordpress 网站到阿里云函数计算平台 这个示例来展示 serverless web 新的开发模式, 包括 fun 工具一键初始化 nas, 同步网站到 nas, 一键部署等能力, 展现函数计算的开发敏捷特性、自动弹性伸缩能力、免运维和完善的监控设施。
相关参考文档: https://yq.aliyun.com/articles/640912
1.1 demo 概述
- demo 示例效果入口: http://hz.mofangdegisn.cn
- 账号: fc-test-user
- 密码: fc-test-pwd
- demo 示例工程地址: fc-wordpress
1.2 解决方案
如上图所示, 当多个用户通过对外提供的 url 访问web服务的时候时候,每秒的请求几百上千都没有关系, 函数计算平台会自动伸缩, 提供足够的执行实例来响应用户的请求, 同时函数计算提供了完善的监控设施来监控您的函数运行情况。
1.3 serverless 方案与传统自建 web 方案对比
函数计算完整费用详情:
- 每月前 100 万次函数调用免费, 每月前 400000(gb*秒) 费用免费, 函数的内存可以设置为 128m 或者 256m, 因此对于一个一个月访问量低于 100 万次的网站, 该项是免费的
- 对于低成本的网站, 假设一个月的产生的公网流量为 1gb, 0.8元
- nas, us$0.06/gb/month, 网站大小为 50m, 即使按 1g 计算, 0.42元
- rds mysql 最基本的单机版本, 25元/月
函数计算计费 | nas 定价
如上所述, 在低成本网站领域, 函数计算具有十分明显的成本优势,同时还保持了弹性能力,以后业务规模做大以后并没有技术切换成本(可能需要做的只是更换一个更强的关系型数据库), 同时财务成本增长配合预付费也能保持平滑。低成本网站变成高可用高性能网站如丝般顺滑。
函数计算运行 php 框架原理
在具体操作部署之前, 先简单梳理一遍 函数计算运行 php 框架原理
2.1 传统服务器 php 运行原理
- 原理示意图
- a simple nginx conf
从上面原理示意图我们可以看出,web 服务器根据 conf 中 location将 php 脚本交给 php-fpm 去解析,然后将解析后的结果返回给 client 端
2.2 fc 驱动 php 工程原理
- 函数计算的执行环境实例相当于传统 web 服务的 apache/nginx
- 用户函数相当于实现 apache/nginx 的 conf 中 location
- 用户将 web 网站部署在 nas,然后挂载 nas 到函数的执行环境, 比如下面代码中 /mnt/auto 目录
- 对于 wordpress 入口函数代码就是这么简单: index.php
- 其中函数计算为用户提供了一个 $globals['fcphpcgiproxy'] 对象用来和 php-fpm 进行交互,对
php 工程中的 php 文件进行解析,该对象提供了两个重要的接口:
- requestphpcgi
requestphpcgi($request, $docroot, $phpfile = "index.php", $fastcgiparams = [], $options = [])
- $request: 跟 php http invoke 入口的参数一致
- $docroot: web 工程的根目录
- $phpfile: 用于拼接 cgi 参数中的 script_filename 的默认参数
- $fastcgiparams: 函数计算内部尽量根据 $request给您构造 default cgi params, 但是如果您不是想要的,可以使用$fastcgiparams覆盖一些参数 (reference: cgi)
- $options: array类型,可选参数, debug_show_cgi_params 设为 true ,会打印每次请求 php 解析时候的 cgi 参数, 默认为 false ;readwritetimeout 设置解析的时间, 默认为 5 秒
如果您有兴趣, 可以了解下函数计算 php runtime:
- php 入口函数
- php 执行环境
案例操作步骤
准备条件
有一个域名, 比如 abc.com, 并将域名 cname 解析到 函数计算(fc) 对应的 region
如您想在杭州的 region 部署 wordpres 网站, 则将 abc.com cname 解析到 12345.cn-hangzhou.fc.aliyuncs.com, 其中 12345 是您的 accountid
3.1 安装最新的 fun 工具
- 安装版本为8.x 最新版或者10.x 、12.x nodejs
- 安装 funcraf
3.2 clone 工程
git clone https://github.com/awesome-fc/fc-wordpress.git
3.3 根据需要使用的数据库进入不同的目录
- 复制 .env_example 文件为 .env, 并且修改 .env 中的信息为自己的信息
如果使用 mysql 数据库, 参考章节 3.3.1
如果使用 sqlite3 数据库, 参考章节 3.3.2
3.3.1 使用 mysql 数据库
- 进入 目录 fc-wp-mysql
fun nas initfun nas info
fun nas init: 初始化 nas, 基于您的 .env 中的信息获取(已有满足条件的nas)或创建一个同region可用的nas
如果你没有修改 templata.yml 中的配置 service名字, 那么则可以进入下一步; 如果有修改, 会在当前目录生成新的目录 .fun/nas/auto-default/{servicename} (fun nas info 可以列出新的目录), 将默认目录下的 .fun/nas/auto-default/fc-wp-mysql/wordpress 的wordpress目录拷贝到 .fun/nas/auto-default/{servicename} 下, 同时可以删除目录 .fun/nas/auto-default/fc-wp-mysql/wordpress
- 上传 wordpress 网站到 nas
fun nas syncfun nas ls nas:///mnt/auto/
fun nas sync: 将本地 nas 中的内容(.fun/nas/auto-default/fc-wp-mysql)上传到 nas 中的 fc-wp-mysql 目录
fun nas ls nas:///mnt/auto/: 查看我们是否已经正确将文件上传到了 nas
3.3.2 使用 sqlite3 数据库
- 进入 目录 fc-wp-sqlite
fun nas initfun nas info
fun nas init: 初始化 nas, 基于您的 .env 中的信息获取(已有满足条件的nas)或创建一个同region可用的nas
如果你没有修改 templata.yml 中的配置 service名字, 那么则可以进入下一步; 如果有修改, 会在当前目录生成新的目录 .fun/nas/auto-default/{servicename} (fun nas info 可以列出新的目录), 将默认目录下的 .fun/nas/auto-default/fc-wp-sqlite/wordpress 的wordpress目录拷贝到 .fun/nas/auto-default/{servicename} 下, 同时可以删除目录 .fun/nas/auto-default/fc-wp-sqlite/wordpress
- 本地完成安装过程, 初始化 sqlite3 数据库
- 在目录 .fun/nas/auto-default/fc-wp-sqlite/wordpress 中输入命令:
php -s 0.0.0.0:80
- 修改 host 文件,添加 127.0.0.1 hz.mofangdegisn.cn
- linux/mac : vim /etc/hosts
- windows7: c:windowssystem32driversetc
其中 hz.mofangdegisn.cn 是您预先准备的域名
- 通过浏览器输入 hz.mofangdegisn.cn, 这个时候没有mysql数据库设置页面,完成 wordpress 安装过程
成功安装以后, 这个时候, .fun/nas/auto-default/fc-wp-sqlite/wordpress/wp-content 下面应该有一个 database 的目录, ls -a 查看, 应该有 .ht.sqlite 这个 sqlite3 数据库文件
- 回退 host 文件的修改
注: 中间修改 host 的目的是初始化 sqlite3 数据库的时候, base site url 是提前准备的域名, 而不是 127.0.0.1
- 上传 wordpress 网站到 nas
fun nas syncfun nas ls nas:///mnt/auto/
fun nas sync: 将本地 nas 中的内容(.fun/nas/auto-default/fc-wp-sqlite)上传到 nas 中的 fc-wp-sqlite 目录
fun nas ls nas:///mnt/auto/: 查看我们是否已经正确将文件上传到了 nas
3.4 部署函数到fc平台
接下来将函数部署到云平台:
- 修改 index.php 中的 $host 中的值
- 修改 template.yml logconfig 中的 project, 任意取一个不会重复的名字即可
- 修改 template.yml 自定义域名为自己提前准备好的域名
- 执行 fun deploy
登录控制台 https://fc.console.aliyun.com,可以看到service 和 函数已经创建成功, 并且 service 也已经正确配置。
通过浏览器打开自己之前配置的域名, 比如本例中的 hz.mofangdegisn.cn
- mysql 版本数据库, 可以直接跟传统的 wordpress 一样,直接进入安装过程
- sqlite3 版本数据库, 由于之前已经完成初始化,可以直接进入网站首页或网站后台
faq
q1: 函数计算能开发高性能高可用网站吗?
a: 可以, 只要连接的数据库性能足够, 有必要再配合预留实例消除冷启动就足够高 qps 的 web 网站了。
q2: 使用低成本 sqlite3 版本的网站, 冷启动第一次打开很慢怎么办?
a: 用一个 timer trigger 的函数 keep warm
q3: 使用低成本 sqlite3 版本的网站, 能支持多大的qps?
a: 由 sqlite3 数据库性能决定, 这边有一些压测结果:
每次压力增大时候, 都有些冷启动,时间慢点,但是支持从压测结果来看支持 50 qps 是没有疑问的, 是足够支持一些中小网站的。
q3: 使用其他语言基于函数计算开发 serverless 网站可以吗?
a: 可以, 比如 python: https://yq.aliyun.com/articles/603249 , 或者直接使用 custom runtime, 内置了 java、python 和 node, custom runtime 用户手册
作者:rsong
本文为云栖社区内容,未经允许不得转载。