【阿里云产品公测】以开发者角度看ACE服务『ACE应用构建指南』
评测介绍
- 评测产品: 云引擎ACE服务
- 开发语言: PHP
- 评测人: mr_wid
- 评测时间: 2014年10月13日-19日
评测概要
非常有幸能够申请到ACE的公测资格, 在本篇评测中, 笔者将以一个开发者的角度来对云引擎ACE服务进行介绍与使用。在本篇评测中, 您将看到:
- ACE能够做些什么
- ACE应用的创建与发布
- 应用的配置与调试
- ACE扩展服务的使用
- 评测总结及建议
- 附件: 演示代码及Demo应用"徽博"项目下载
ACE能够做些什么
阿里云应用引擎(ACE)是阿里云计算推出一款基于弹性扩展的网络应用托管平台, 通俗的讲,可以将其看做一个无需进行复杂配置的就可以快速进行部署、发布Web应用程序的应用运行平台, 且能根据应用负载情况自动弹性伸缩应用所需资源,使应用性能时刻维持在最佳状态。告别节日、活动等大量流量涌入时, 现有硬件无法支撑应用的运行, 而又临时无法解决的尴尬情况。
在ACE上, 用户只需将编写好的程序、资源通过svn提交到ACE, 而无需再关心服务器的维护、软件的配置等细节。使开发者/用户能够集中精力编写、运营ACE中托管的应用程序, 从而从繁重的服务器运维工作中解放出来。
ACE除了能够让你轻松部署出属于自己的WordPress博客、Discuz论坛等常规网站类应用, 同时配合ACE的扩展服务, 同样能通过编写 Web API/Services 对移动APP、桌面应用等提供强大的后台支撑能力。
ACE应用的创建与发布
创建一个ACE应用的过程是十分愉快的, 只需为它填上精心准备的应用名称与二级域名, 再选上开发语言, 就可以创建了。如图所示, 笔者创建了一个名为 ACE公测评测 的应用, 并且二级域名为 wid-ace-test.aliapp.com,等应用发布后, 便可以通过二级域名进行访问。
此外, 也可将自己注册的域名的来"替换"这个二级域名进行访问, 具体操作作为后话, 暂且按下不表。
在应用环境的模式选项, 有单实例和集群模式可选, 集群模式是指在同一时间内, 应用有多个实例同时运行, 在运行过程中, 即便有其中一个实例发生运行故障, 也几乎不会影响应用的正常访问。
对于弹性策略, 可以说是ACE服务的最大亮点之一, 开启自动弹性后, 能让应用程序真正做到了不再担心可用资源是否充足、应用是否达到了性能瓶颈等问题。
实例模式与弹性策略在应用创建后也是可以根据需要随时切换的, 所以不用纠结自己的应用在创建时应该选择哪种模式。点确定创建应用, 并返回查看这个已创建的应用信息, 如图:
接下来, 我们创建一个仅有一个页面的Web网站程序, 并且在接下来的评测中慢慢扩展它。
ACE目前使用SVN的方式来提交应用, SVN是一个开源版本控制系统, 管理方便, 易于维护, 在Windows、Linux、OS X下均有相关的svn客户端, 本文中以Windows下的 TortoiseSVN 为例来创建应用仓库和提交应用。
首先在ACE应用的版本管理页生成一个应用仓库, 选择 生成SVN, 在弹出的对话框中选择创建空一个的SVN目录:
得到了SVN地址, 就可以通过SVN客户端对项目执行SVN检出(Checkout), 在检出的过程,是通过阿里云账号和SVN密码进行身份验证的, 第一次使用时, 需要为SVN设置认证密码(见上图), 否则无法正常检出。
在目标目录下, 右键,SVN检出, 检出流程如图:
成功后, 在检出目录下将多出如图中所示的文件/文件夹。webroot 为站点的根目录, 在 webroot 目录下的文件, 除在配置里做特殊设置外, 均能被用户通过浏览器直接访问, 因此, 较为敏感的文件, 不要放在该目录中。
app.yaml , 应用的配置文件, 可以配置URL重写、防盗链、访问控制等。
发布第一个应用
在第一个应用中, 将使用经典的 phpinfo 函数来查看ACE服务中的PHP环境详细情况。在 webroot 目录下, 新建 phpinfo.php 文件并添加代码:
添加代码中应注意将代码保存为 UTF-8 无 BOM 编码方式(不同文本编辑器下操作有所不同), 避免出现不必要的麻烦。
接下来使用SVN将新添加的phpinfo页面提交到ACE中, 操作过程如图:
提交成功后, 到ACE管理页面, 在 版本管理 项, 选择 "发布" 应用。约1分钟后, 即可通过二级域名访问。
从 phpinfo 的信息中可以看到, ACE服务的PHP版本为5.4.14, 并且启用了常用的一些扩展, 所以绝大多数之前编写好的PHP应用, 都可以不加修改的直接在ACE上运行。
ACE的Web服务器程序选用的是Tengine, 由淘宝网发起的Web服务器项目, 目前已开源, 基于Nginx 1.4.7, 对其进行了大量的改进与优化, 使得性能与稳定性上都有了进一步的提升。详情参见 http://tengine.taobao.org/
绑定外部域名
若需要使用独立的域名, 如 www.example.com 来代替 xxx.aliapp.com 进行访问, 可在应用控制面板中添加一个外部域名绑定, 并在域名服务商那添加 CNAME 记录解析到 ACE 的二级域名, 即可完成绑定。绑定的条件是域名必须是经过备案的。
应用的配置与调试
在这之前, 我们先将第一个应用进行扩展, 使它看起来更有意义一点。 对的, 我们来做一个超级简约的"匿名社交网站"(好吧, 其实就是一个匿名留言板), 名字笔者都想好了, 就叫徽博好了。
由于这个应用与第一个发布的应用并无太大联系, 或者说功能改进实在太大, 我们选择重新生成一个空的SVN目录, 即一个新的版本, 这样做的好处之一就是, 等新的版本上线了, 又突然发现新版本存在若干重大BUG, 那么我们就可以快速一键切换回旧版本。
数据库采用ACE提供的MySQL数据库服务, 在控制面板的扩展服务将其打开。
"徽博" 是这次ACE评测中笔者"临时起意"编写的一个小Web应用, 所有的源码、资源文件以及文档等, 将会以附件的形式放在评测的最后。来一起看一下 1.0 版本的徽博真面容。用我好友的话说, "徽博"有着一个不忍直视的前端配色。外加奇葩 -_-|||
PS: 独创的随便登录, 无需注册, 更是让徽博独具"特色"。演示地址: http://wid-ace-test.aliapp.com/
配置应用
通过编辑 app.yaml 配置文件可对应用做代码层配置, app.yaml 在wwwroot目录的同级目录下, 可以配置目录权限、IP黑白名单、URL重写、防盗链等。ACE还提供了xml版本的配置语法, 配置文件为 app.xml, 同样与 wwwroot 同级目录, 可手动创建, 当 app.xml 与 app.yaml 同时存在时, 仅有 app.xml 配置文件生效。
限制: app.yaml 与 app.xml 文件大小最大均不得超过 1.6k 字节。
修改配置文件后, 需要重启发布应用(若未启用自动部署), 并且手动重新启动应用后才会生效。
笔者这里以 app.yaml 版本的配置文件作为介绍。
关于配置文件的特殊说明
在测试配置文件的时候, 发现了一些可能会对配置时成困扰的问题:
1>. 配置中不支持使用 tab(\t) 缩进(请勿在配置的任何位置出现\t), 使用 tab缩进会造成重启失败, 错误内容 : while scanning for the next token found character '\t'that cannot start any token
2>. 同一级配置下, 空格的缩进数目需相同, 这点类似于Python的缩进语法, 否则同样会重启失败。问题图示如下(以配置目录访问控制为例):
目录权限配置
配置语法:
- deny:
- - /目录/
- - /目录1/子目录/
目录结尾的 / 不可省略, 省略后会被判定为前缀匹配。例如配置成 - /lib, 则如 /libpng 目录, /libxxx.html 等以lib开头的路径都将无法访问。支持最多配置10个重写规则。使用示例见上图[正确配置]。
伪静态 rewrite 配置
ACE的 rewrite 语法与与 nginx 一致, 仅写法的格式上有所不同。数量上仅允许10个rewrite规则。
示例: 将 http://wid-ace-test.aliapp.com/articleView.php?aid=12138 伪静为 http://wid-ace-test.aliapp.com/article/12138.html
配置规则:
- rewrite:
- - url: ^/article/(.+)\.html$
- script: /articleView.php?aid=$1 last
配置规则解释: ^/article/(.+)\.html$ 一条正则表达式表示的伪静态路径, 用于匹配路径规则,当请求的URI符合该正则规则时, 转交给目标脚本处理。这里配置的目标脚本为 /articleView.php?aid=$1 last。
对于这里有一点不太好理解的就是 $1 从何而来, $1 表示一个参数, 它表示匹配路径规则中的 (.+) 部分, 即示例中的 12138,当匹配规则中有多个类似于 (.+) 时, 参数依次类推为 $1、$2、$n。 last 为rewrite结束标志。
伪静效果图示:
IP黑白名单配置
ACE同样支持对指定目录的IP访问控制, 每条规则最多支持10个IP, 以 /ontask/ 目录为例, 假设该目录仅允许 127.0.0.1(回传地址, 本机) 与 112.12.50.153 访问, 则可做如下配置:
- denyuri:
- - path: /ontask/
- allowip: ['127.0.0.1', '112.12.50.153']
若要阻止某些IP访问指定目录, 如 /downloads/ 目录, 可采用 denyip 语句:
- denyuri:
- - path: /ontask/
- allowip: ['127.0.0.1', '112.12.50.153']
- - path: /download/
- denyip: ['121.13.8.242', '112.12.48.242']
自定义错误页
用户可在配置文件中对如404(资源未找到)、50x(服务器内部错误)配置错误页面:
- error_page:
- - status: 500 502 503 504 505
- page: /50x.html
- - status: 404
- page: /404.php
调试应用
ACE支持 XHProf 对应用进行性能调试。先介绍下XHProf的使用, 首先在ACE应用的控制面板中侧栏的 性能分析 选项创建存储空间, 然后在PHP文件第一行加入Alibaba::Xhprof()->start() 启动调试, 在PHP文件的最后一行加Alibaba::Xhprof()->finish() 关闭调试, 然后在创建的存储空间中就可以查看相关的性能数据了,这是一个非常实用的性能分析工具, 对性能有一定要求的应用非常有用。
过程图示如下:
XHProf的分析结果是以网页页面形式报告的, 其中有个非常直观的可视化视图, 针对"徽博"的首页性能进行性能分析的结果如下(可视视图):
从视图中可以看出, 应用在性能上整体还是非常可观的, 首页总执行用时 36.5ms, 其中约一半的时间用在了数据库的处理上,约14ms处在数据库的连接上, 但因为笔者使用的是免费的共享型MySQL数据库, 并且走的外网数据库连接路线,所以该数据库的连接速度也算是比较优秀的了。
ACE扩展服务的使用
缓存服务(Cache)
使用缓存, 最直接的目的之一就是提高数据的读取速度, 对于即时性要求不高的热点数据, 如网站的站内统计、阅读排行等, 提供了极大的便利, 大大减少了数据库的查询次数, 并且也减少了程序对数据的重复运算处理, 能够显著提高应用的性能。在应用的扩展服务列表中找到 缓存服务(Cache), 并按照提示创建缓存空间。
在代码中使用缓存服务:
- // $expire缓存过期时间, UNIX时间戳
- // 调用方式: Alibaba::Cache('缓存空间名称')->方法名();
- // 常用方法
- set($key, $var, $expire = null); //添加一条cache, 若 $key 不存在则新建, 若存在则覆盖
- add($key, $var, $expire = null); //添加一条cache, 若 $key 已存在则添加失败并返回 false
- replace($key, $var, $expire = null); //替换cache值, 若 $key 不存在则新建
- delete($key); //删除一条cache
- get($keys); //获取cache, $keys 可为 string 或 array
使用示例:
测试页面: http://wid-ace-test.aliapp.com/test-cache.php
定时任务服务
定时任务允许在特定的时间点或周期性的执行一个请求URI的动作, 最小单位为分钟(即不支持秒级任务), 可用来刷新缓存、同步资源、统计数据等。
如图所示创建一个任务名称为 test-task 并且每隔 30分钟 执行一次的定时任务, 执行的方式为发起一个 HTTP GET请求, 也就是执行 /onTask/updateCounts.php 脚本。
定时任务的时间规则采用的 Cron 表达式, 对Cron 表达式不熟悉的同学, 可以网页搜索 "在线Cron表达式生成器", 根据所需任务规则进行生成。 一些常用的任务规则:
*/30 * * * ? | 每隔30分钟执行一次 |
0 0 12 * * ? | 每天中午12点触发 |
0 0 5 ? * MON | 每周一早晨5点触发 |
0 30 6 ? * MON-FRI | 周一至周五的上午6:30触发 |
0 0 9 5 * ? | 每月5号上午9:00触发 |
如何保护任务脚本不被用户调用? 可以在任务脚本中取 GET 方式的参数进行身份验证。如保护示例中的 updateCount.php, 可在创建任务时的执行URL 中设置被执行的 URL 为: updateCount.php?howareyou=imok
并在 updateCount.php 进行验证:
应用实例: 在"徽博"首页右侧栏, 24小时热门中, 即运用的定时器配合缓存服务, 每30分钟更新一次热门。
演示地址: http://wid-ace-test.aliapp.com/
存储服务(Storage)
应用需要在本地写文件时, 需要先配置 存储服务, 否则所有本地写入操作会被认为是临时的, 不具备持久性。首先在扩展 存储(Storage) 服务中创建一个名称任意的存储空间, 然后在配置文件中指定所需写入文件的目录, 示例:
- ossprefix:
- - /ace/app/webroot/upload/
将 upload 指定为可写目录。 其中 /ace/app/ 是绝对路径, 不可省略。限制: ACE免费的存储服务, 总存储空间大小为1GB。
在默认的配置模板中, 已将 /ace/app/ 设置配置为自动存储目录, 即默认应用目录下写入文件, 均可被保存, 但建议根据需要来指定特定目录即可, 提高文件储服务的效率。
此外, 存储服务也允许通过SDK方式来存取文件。通过 SDK 方式写入文件, 再配合 rewrite 配置, 可达到任意路径的文件伪静态效果。
示例伪静态配置:
- rewrite:
- - url: ^/files/(.+)$
- script: /oss-sdk-test/view-file.php?file=$1 last
在上述伪静的配置中, 将 /files/ 路径后的所有请求, 转向 view-file.php 处理, view-file.php再通过 OSS SDK, 获取文件并输出, 完成静态文件的输出效果。
演示地址: http://wid-ace-test.aliapp.com/oss-sdk-test/
效果图示:
限于评测主题以及篇幅长度, 所以扩展服务的介绍不能做到面面俱到, 更多扩展服务以及详细用法, 请参阅相关帮助文档。ACE开发者手册, 参见: http://ace.aliapp.com/
评测总结及建议
ACE的相关特色及亮点, 笔者已经在评测中或多或少的都进行了相关的介绍。针对ACE服务, 用一句话总结就是: 弹性、零运维, 是中小型Web应用的首选服务。对ACE服务的相关建议如下:
功能改进:
- 更多的扩展服务, 如邮件服务、推送服务等、统计服务、短信服务等;
- 增加流量仪表盘, 提供访问数据和视图;
- MySQL扩展允许内网路线;
- 对各语言均提供日志写入SDK API;
- 更多的编程语言支持, 如: 我大Python。
用户体验:
- 在版本发布页, "发布" 选项旁, 添加 "发布并重启", 使发布与重启一步到位。
- 突破"10"的限制, 在配置上, 很多规则仅允许10条以内, 建议根据用户需求能够相应增加。并且在定时任务的任务名称上, 也仅允许 2-10 字符, 这个就有点短了, 最好多留个输入框来写任务描述。
- 完善ACE应用文档, 丰富各服务、扩展使用细节描述, 整合相关FAQ到帮助文档。
疑似BUG: 在OSS以SDK方式存取文件时, 通过本地文件上传方式 $Storage->saveFile存入文件, 存入后, 在获取 content-type 时, 发现 content-type 并不能返回预期文件类型。如,当上传的文件为 jpg格式的图片时, content-type 预期应为 image/jpeg, 但使用
- $meta = $Storage->getMeta($filename);
- echo $meta['content-type'];
方式获得到的 type, 总为 application/octet-stream
评测中的文件输出代码:
这就导致了, 在取出文件后, 向浏览器输出时, 所有的文件都将以下载的方式进行保存, 而不能使浏览器根据响应头中的Content-type, 来在浏览器直接显示浏览器已识别类型的文件。
如果在设计时就是将所有OSS中的文件看做 octet-stream 类型, 那么同时也希望, 能够在 meta 中取得真实的 MIME Type。
当然, 也有可能是笔者对OSS SDK的使用还不够熟悉, 在取文件类型的方法上调用错误, 如是操作上的问题, 还希望能够及时指正! 谢谢。
参加活动:http://promotion.aliyun.com/act/aliyun/freebeta/