首页 > 代码库 > 【阿里云产品公测】以开发者角度看ACE服务『ACE应用构建指南』

【阿里云产品公测】以开发者角度看ACE服务『ACE应用构建指南』

?;ZnD(4?  
评测介绍 1V-sibE  
j |LOg  
  • 评测产品: 云引擎ACE服务
  • 开发语言: PHP
  • 评测人: mr_wid
  • 评测时间: 2014年10月13日-19日
XV1XzG#C  
.>p.k*vU  
评测概要 9]:F!d/  
fYlqaO4[  
非常有幸能够申请到ACE的公测资格, 在本篇评测中, 笔者将以一个开发者的角度来对云引擎ACE服务进行介绍与使用。在本篇评测中, 您将看到:
  • ACE能够做些什么
  • ACE应用的创建与发布
  • 应用的配置与调试
  • ACE扩展服务的使用
  • 评测总结及建议
  • 附件: 演示代码及Demo应用"徽博"项目下载
            
<tdsUh:?&  
ACE能够做些什么 0@RVM|  
zEDN^K ‘  
阿里应用引擎(ACE)是阿里云计算推出一款基于弹性扩展的网络应用托管平台, 通俗的讲,可以将其看做一个无需进行复杂配置的就可以快速进行部署、发布Web应用程序的应用运行平台, 且能根据应用负载情况动弹性伸缩应用所需资源,使应用性能时刻维持在最佳状态。告别节日、活动等大量流量涌入时, 现有硬件无法支撑应用的运行, 而又临时无法解决的尴尬情况。 oWq]\yT<`  
I7W?}bR*6  
在ACE上, 用户只需将编写好的程序、资源通过svn提交到ACE, 而无需再关心服务器的维护、软件的配置等细节。使开发者/用户能够集中精力编写、运营ACE中托管的应用程序, 从而从繁重的服务器运维工作中解放出来。 iB+ _+A  
`t+;[G>ZE  
ACE除了能够让你轻松部署出属于自己的WordPress博客、Discuz论坛等常规网站类应用, 同时配合ACE的扩展服务, 同样能通过编写 Web API/Services 对移动APP、桌面应用等提供强大的后台支撑能力。
            
l7 U<]i GL  
ACE应用的创建与发布 M,we,!B0  
g|M>C:ZT  
创建一个ACE应用的过程是十分愉快的, 只需为它填上精心准备的应用名称与二级域名, 再选上开发语言, 就可以创建了。
如图所示, 笔者创建了一个名为 ACE公测评测 的应用, 并且二级域名为 wid-ace-test.aliapp.com,等应用发布后, 便可以通过二级域名进行访问。 u/%Z0`X  
{Rn*)D9  
此外, 也可将自己注册的域名的来"替换"这个二级域名进行访问, 具体操作作为后话, 暂且按下不表。 H=9{|%iS  
  YTg8Zg-Z  
在应用环境的模式选项, 有单实例和集群模式可选, 集群模式是指在同一时间内, 应用有多个实例同时运行, 在运行过程中, 即便有其中一个实例发生运行故障, 也几乎不会影响应用的正常访问。 ‘?a d  
B.~[m}  
对于弹性策略, 可以说是ACE服务的最大亮点之一, 开启自动弹性后, 能让应用程序真正做到了不再担心可用资源是否充足、应用是否达到了性能瓶颈等问题 8L[\(~Zf  
bVr`a*EM  
S";}gw?r6  
实例模式与弹性策略在应用创建后也是可以根据需要随时切换的, 所以不用纠结自己的应用在创建时应该选择哪种模式。点确定创建应用, 并返回查看这个已创建的应用信息, 如图: 3gv?rJV  
  G<Urj+3/Xo  
接下来, 我们创建一个仅有一个页面的Web网站程序, 并且在接下来的评测中慢慢扩展它。 " s/ws  
 ~;uU{TT  
ACE目前使用SVN的方式来提交应用, SVN是一个开源版本控制系统, 管理方便, 易于维护, 在Windows、Linux、OS X下均有相关的svn客户端, 本文中以Windows下的 TortoiseSVN 为例来创建应用仓库和提交应用。 cL4Xh|NBp  
_p<wATv?7t  
_5o5/@  
首先在ACE应用的版本管理页生成一个应用仓库, 选择 生成SVN, 在弹出的对话框中选择创建空一个的SVN目录: a..LbQQ  
  [-^xw1:  
得到了SVN地址, 就可以通过SVN客户端对项目执行SVN检出(Checkout), 在检出的过程,是通过阿里云账号和SVN密码进行身份验证的, 第一次使用时, 需要为SVN设置认证密码(见上图), 否则无法正常检出。 lU`t~|>r+  
RY\ 0dv>  
在目标目录下, 右键,SVN检出, 检出流程如图: <2wC)l3j*  
  :\^jIKvZ  
成功后, 在检出目录下将多出如图中所示的文件/文件夹。webroot 为站点的根目录, 在 webroot 目录下的文件, 除在配置里做特殊设置外, 均能被用户通过浏览器直接访问, 因此, 较为敏感的文件, 不要放在该目录中。 [_*?~  
q-S#[I+g  
w8F`RRHEE  
app.yaml , 应用的配置文件, 可以配置URL重写、防盗链、访问控制等。 (W#^-*$R  
()<?^lr33  
发布第一个应用 E`|vu*l7  
f67t.6Vw2+  
在第一个应用中, 将使用经典的 phpinfo 函数来查看ACE服务中的PHP环境详细情况。在 webroot 目录下, 新建 phpinfo.php 文件并添加代码: VdGpreRPC  
  xEufbFAN?  
添加代码中应注意将代码保存为 UTF-8 无 BOM 编码方式(不同文本编辑器下操作有所不同), 避免出现不必要的麻烦。 l!:L<B  
k{bC3)‘$#R  
接下来使用SVN将新添加的phpinfo页面提交到ACE中, 操作过程如图: <VhD>4f{]  
  Yi <1z:\  
提交成功后, 到ACE管理页面, 在 版本管理 项, 选择 "发布" 应用。约1分钟后, 即可通过二级域名访问。 #P{|7}jk  
  bd2QQ1[1vh  
从 phpinfo 的信息中可以看到, ACE服务的PHP版本为5.4.14,  并且启用了常用的一些扩展, 所以绝大多数之前编写好的PHP应用, 都可以不加修改的直接在ACE上运行。 GQ sE5Vb  
PoLk{{l3  
ACE的Web服务器程序选用的是Tengine, 由淘宝网发起的Web服务器项目, 目前已开源, 基于Nginx 1.4.7, 对其进行了大量的改进与优化, 使得性能与稳定性上都有了进一步的提升。详情参见 http://tengine.taobao.org/ F6_e n z  
sAnb  
绑定外部域名 ^_BjO(b‘e  
9x eg,#1  
若需要使用独立的域名, 如 www.example.com 来代替 xxx.aliapp.com 进行访问, 可在应用控制面板中添加一个外部域名绑定, 并在域名服务商那添加 CNAME 记录解析到 ACE 的二级域名, 即可完成绑定。绑定的条件是域名必须是经过备案的。            
md lMciP  
应用的配置与调试 >[Tt‘.S!?  
,x?Jrcx~‘C  
在这之前, 我们先将第一个应用进行扩展, 使它看起来更有意义一点。 对的, 我们来做一个超级简约的"匿名社交网站"(好吧, 其实就是一个匿名留言板), 名字笔者都想好了, 就叫徽博好了。
Q‘YakEv >=  
N;4wbUPL7h  
由于这个应用与第一个发布的应用并无太大联系, 或者说功能改进实在太大, 我们选择重新生成一个空的SVN目录, 即一个新的版本, 这样做的好处之一就是, 等新的版本上线了, 又突然发现新版本存在若干重大BUG, 那么我们就可以快速一键切换回旧版本。
Y/ %XkDC~  
数据库采用ACE提供的MySQL数据库服务, 在控制面板的扩展服务将其打开。 w"L]?#  
  WwUHHm<v  
"徽博" 是这次ACE评测中笔者"临时起意"编写的一个小Web应用, 所有的源码、资源文件以及文档等, 将会以附件的形式放在评测的最后。来一起看一下 1.0 版本的徽博真面容。用我好友的话说, "徽博"有着一个不忍直视的前端配色。外加奇葩 -_-||| arvKJmD  
  ]1M Z:]k  
PS: 独创的随便登录, 无需注册, 更是让徽博独具"特色"。演示地址: http://wid-ace-test.aliapp.com/ u(8dsg R  
un}!&*+  
配置应用 V`G^Jyj  
9U3.=J  
通过编辑 app.yaml 配置文件可对应用做代码层配置, app.yaml 在wwwroot目录的同级目录下, 可以配置目录权限、IP黑白名单、URL重写、防盗链等。ACE还提供了xml版本的配置语法, 配置文件为 app.xml, 同样与 wwwroot 同级目录, 可手动创建, 当 app.xml 与 app.yaml 同时存在时, 仅有 app.xml 配置文件生效。 fZQ2<*)pqO  
\y+^r|IL  
限制: app.yaml 与 app.xml 文件大小最大均不得超过 1.6k 字节。 j|{n?  
修改配置文件后, 需要重启发布应用(若未启用自动部署), 并且手动重新启动应用后才会生效。 5Ha(i [d  
5x!rT&!G  
Y Azj>c&  
笔者这里以 app.yaml 版本的配置文件作为介绍。 f`8?]@y{  
+o35${  
关于配置文件的特殊说明 =&~ K;=:  
PGuPw‘2;[  
在测试配置文件的时候, 发现了一些可能会对配置时成困扰的问题: P GzwS  
:_Iz(2hV  
1>. 配置中不支持使用 tab(\t) 缩进(请勿在配置的任何位置出现\t), 使用 tab缩进会造成重启失败, 错误内容 : while scanning for the next token found character ‘\t‘that cannot start any token n*Hx"2XF  
s.a@uR^  
!e+Sa{X  
2>. 同一级配置下, 空格的缩进数目需相同, 这点类似于Python的缩进语法, 否则同样会重启失败。问题图示如下(以配置目录访问控制为例):
  %v UUx+  
 O`Htdnu  
目录权限配置 09i7 7  
L @J$kqWY  
配置语法:   @c}Gw;e  
复制代码
  1.   deny:
  2.     - /目录/
  3.     - /目录1/子目录/
ONUa7  
目录结尾的 / 不可省略, 省略后会被判定为前缀匹配。例如配置成 - /lib, 则如 /libpng 目录,  /libxxx.html 等以lib开头的路径都将无法访问。支持最多配置10个重写规则。使用示例见上图[正确配置]。 -s ^cy+jd  
%}unlSTPP  
伪静态 rewrite 配置 \w-3Spk*  
"B9zQ,[Q  
ACE的 rewrite 语法与与 nginx 一致, 仅写法的格式上有所不同。数量上仅允许10个rewrite规则。 /=QsZ,~xo  
@KJmNM1]V  
示例: 将 http://wid-ace-test.aliapp.com/articleView.php?aid=12138 伪静为 http://wid-ace-test.aliapp.com/article/12138.html D0L s~qr  
M&e=LV  
u,~+ho@  
配置规则:   :Ye~I;" 8  
BF"eVKA  
复制代码
  1. rewrite:
  2.   - url: ^/article/(.+)\.html$
  3.     script: /articleView.php?aid=$1 last
`W7;-  
;zSV~G6-  
配置规则解释: ^/article/(.+)\.html$ 一条正则表达式表示的伪静态路径, 用于匹配路径规则,当请求的URI符合该正则规则时, 转交给目标脚本处理。这里配置的目标脚本为 /articleView.php?aid=$1 last。 QaXdO=3  
Psm9hP :m  
对于这里有一点不太好理解的就是 $1 从何而来, $1 表示一个参数, 它表示匹配路径规则中的 (.+) 部分, 即示例中的 12138,当匹配规则中有多个类似于 (.+) 时, 参数依次类推为 $1、$2、$n。 last 为rewrite结束标志。 >b~Q%{1  
P<9T.l  
伪静效果图示: COD^osM@  
 
Z*(OcQ-  
IP黑白名单配置 ^5+7D1>W%  
-*2b/=$u  
ACE同样支持对指定目录的IP访问控制, 每条规则最多支持10个IP, 以 /ontask/ 目录为例, 假设该目录仅允许 127.0.0.1(回传地址, 本机) 与 112.12.50.153 访问, 则可做如下配置:
     z; >O5a>z  
复制代码
  1. denyuri:
  2.   - path: /ontask/
  3.     allowip: [‘127.0.0.1‘, ‘112.12.50.153‘]
,S?:lQuK5  
若要阻止某些IP访问指定目录, 如 /downloads/ 目录, 可采用 denyip 语句:     6K >(n  
复制代码
  1. denyuri:
  2.   - path: /ontask/
  3.     allowip: [‘127.0.0.1‘, ‘112.12.50.153‘]
  4.   - path: /download/
  5.     denyip: [‘121.13.8.242‘, ‘112.12.48.242‘]
R^.c  
Z7Nhb{  
自定义错误页 :4pO/I~  
\_+Af`  
用户可在配置文件中对如404(资源未找到)、50x(服务器内部错误)配置错误页面: W7 +Q&4Y  
复制代码
  1. error_page:
  2.   - status: 500 502 503 504 505
  3.     page: /50x.html
  4.   - status: 404
  5.     page: /404.php
uuy0fQQ8ti  
rWBgYh  
调试应用 rNgAzH  
^(:na6C  
ACE支持 XHProf 对应用进行性能调试。先介绍下XHProf的使用, 首先在ACE应用的控制面板中侧栏的 性能分析 选项创建存储空间, 然后在PHP文件第一行加入Alibaba::Xhprof()->start() 启动调试, 在PHP文件的最后一行加Alibaba::Xhprof()->finish() 关闭调试, 然后在创建的存储空间中就可以查看相关的性能数据了,这是一个非常实用的性能分析工具, 对性能有一定要求的应用非常有用。 @d|]BqQ4jh  
PG‘I7)Bv  
过程图示如下: 9y)}-TcSpY  
  v^ 1x}  
XHProf的分析结果是以网页页面形式报告的, 其中有个非常直观的可视化视图, 针对"徽博"的首页性能进行性能分析的结果如下(可视视图):

图片:22-ace-test-xhprof-callgraph.png

X4"[,:Tw  
从视图中可以看出, 应用在性能上整体还是非常可观的, 首页总执行用时 36.5ms, 其中约一半的时间用在了数据库的处理上,约14ms处在数据库的连接上, 但因为笔者使用的是免费的共享型MySQL数据库, 并且走的外网数据库连接路线,所以该数据库的连接速度也算是比较优秀的了。            
vY,]f^F"  
ACE扩展服务的使用 1i Q(q\%  
; d}  
缓存服务(Cache) be.Kx< I  
,qhv(  
使用缓存, 最直接的目的之一就是提高数据的读取速度, 对于即时性要求不高的热点数据, 如网站的站内统计、阅读排行等, 提供了极大的便利, 大大减少了数据库的查询次数, 并且也减少了程序对数据的重复运算处理, 能够显著提高应用的性能。在应用的扩展服务列表中找到 缓存服务(Cache), 并按照提示创建缓存空间。 P?y{ 9H*  
  A^F0}MYT  
在代码中使用缓存服务:     w_q =mKu  
复制代码
  1. // $expire缓存过期时间, UNIX时间戳
  2. // 调用方式: Alibaba::Cache(‘缓存空间名称‘)->方法名();
  3. // 常用方法
  4. set($key, $var, $expire = null);    //添加一条cache, 若 $key 不存在则新建, 若存在则覆盖
  5. add($key, $var, $expire = null);    //添加一条cache, 若 $key 已存在则添加失败并返回 false
  6. replace($key, $var, $expire = null);    //替换cache值, 若 $key 不存在则新建
  7. delete($key);    //删除一条cache
  8. get($keys);    //获取cache, $keys 可为 string 或 array
QSOJHRl=C  
tNW0 C]  
使用示例: `]<~lf  
  ralU9MN.  
测试页面: http://wid-ace-test.aliapp.com/test-cache.php >Wj8[9zf  
l3kBt-m  
定时任务服务 iLFhm4.PO  
N37#V s  
定时任务允许在特定的时间点或周期性的执行一个请求URI的动作, 最小单位为分钟(即不支持秒级任务), 可用来刷新缓存、同步资源、统计数据等。 Js !Zk\O  
?^:xNRE$j  
如图所示创建一个任务名称为 test-task 并且每隔 30分钟 执行一次的定时任务, 执行的方式为发起一个 HTTP GET请求, 也就是执行 /onTask/updateCounts.php 脚本。 JZcW?Or  
  &E!-~‘|z  
定时任务的时间规则采用的 Cron 表达式, 对Cron 表达式不熟悉的同学, 可以网页搜索 "在线Cron表达式生成器", 根据所需任务规则进行生成。 一些常用的任务规则: m*TJ@gI*t  
~Q 1%DV.  
*/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触发
uvGFo)9q3  
如何保护任务脚本不被用户调用? 可以在任务脚本中取 GET 方式的参数进行身份验证。如保护示例中的 updateCount.php, 可在创建任务时的执行URL 中设置被执行的 URL 为: updateCount.php?howareyou=imok lb#`f,r>  
并在 updateCount.php 进行验证: rW9ULS2 d  
  -Cf<#‘x_  
应用实例: 在"徽博"首页右侧栏, 24小时热门中, 即运用的定时器配合缓存服务, 每30分钟更新一次热门。 Gt?ckMB  
h&?tF~h  
演示地址: http://wid-ace-test.aliapp.com/
ekuRGG  
[Uu!:SZ  
存储服务(Storage) wB0ONH[  
&k {1N.  
应用需要在本地写文件时, 需要先配置 存储服务, 否则所有本地写入操作会被认为是临时的, 不具备持久性。首先在扩展 存储(Storage) 服务中创建一个名称任意的存储空间, 然后在配置文件中指定所需写入文件的目录, 示例:     jhSc9  
复制代码
  1. ossprefix:
  2.   - /ace/app/webroot/upload/
{2%@I~US  
将 upload 指定为可写目录。 其中 /ace/app/ 是绝对路径, 不可省略。限制: ACE免费的存储服务, 总存储空间大小为1GB。 gUxJ>~  
=nN&8vRH  
V9kL\Ys  
在默认的配置模板中, 已将 /ace/app/ 设置配置为自动存储目录, 即默认应用目录下写入文件, 均可被保存, 但建议根据需要来指定特定目录即可, 提高文件储服务的效率。 uEkUK|  
v#`P?B\  
此外, 存储服务也允许通过SDK方式来存取文件。通过 SDK 方式写入文件, 再配合 rewrite 配置, 可达到任意路径的文件伪静态效果。 B (dq$+4  
示例伪静态配置:
     m/W)IG>  
复制代码
  1. rewrite:
  2.   - url: ^/files/(.+)$
  3.     script: /oss-sdk-test/view-file.php?file=$1 last
vc(6lN9>  
在上述伪静的配置中, 将 /files/ 路径后的所有请求, 转向 view-file.php 处理, view-file.php再通过 OSS SDK, 获取文件并输出, 完成静态文件的输出效果。 fdTyY ;  
演示地址: http://wid-ace-test.aliapp.com/oss-sdk-test/ ]i@VIvYq  
效果图示: l]o&D))R  
  $mG&4Y  
``mW\=fe  
限于评测主题以及篇幅长度, 所以扩展服务的介绍不能做到面面俱到, 更多扩展服务以及详细用法, 请参阅相关帮助文档。
ACE开发者手册, 参见: http://ace.aliapp.com/            
~ugK&0i[2  
评测总结及建议 g4^df%)&  
3?GEXO&,E  
ACE的相关特色及亮点, 笔者已经在评测中或多或少的都进行了相关的介绍。针对ACE服务, 用一句话总结就是: 弹性、零运维, 是中小型Web应用的首选服务。对ACE服务的相关建议如下: 3EKqXXzOB  
p V^hZ.  
功能改进:
  • 更多的扩展服务, 如邮件服务、推送服务等、统计服务、短信服务等;
  • 增加流量仪表盘, 提供访问数据和视图;
  • MySQL扩展允许内网路线;
  • 对各语言均提供日志写入SDK API;
  • 更多的编程语言支持, 如: 我大Python。
/xRPQ|  
用户体验:
  • 在版本发布页, "发布" 选项旁, 添加 "发布并重启", 使发布与重启一步到位。
  • 突破"10"的限制, 在配置上, 很多规则仅允许10条以内, 建议根据用户需求能够相应增加。并且在定时任务的任务名称上, 也仅允许 2-10 字符, 这个就有点短了, 最好多留个输入框来写任务描述。
  • 完善ACE应用文档, 丰富各服务、扩展使用细节描述, 整合相关FAQ到帮助文档。
,-*oc>  
we&g9j‘  
疑似BUG:
在OSS以SDK方式存取文件时, 通过本地文件上传方式 $Storage->saveFile存入文件, 存入后, 在获取 content-type 时, 发现 content-type 并不能返回预期文件类型。如,当上传的文件为 jpg格式的图片时, content-type 预期应为 image/jpeg, 但使用     L7tC?F]}SK  
复制代码
  1. $meta = $Storage->getMeta($filename);
  2. echo $meta[‘content-type‘];
kiFTx&gf  
方式获得到的 type, 总为 application/octet-stream +9mnxU>  
:kDHwYv$  
评测中的文件输出代码: QNH5Cq;Y  
  IU`&h2KZ.  
这就导致了, 在取出文件后, 向浏览器输出时, 所有的文件都将以下载的方式进行保存, 而不能使浏览器根据响应头中的Content-type, 来在浏览器直接显示浏览器已识别类型的文件。 D-BWgK  
n1xN:A  
如果在设计时就是将所有OSS中的文件看做 octet-stream 类型, 那么同时也希望, 能够在 meta 中取得真实的 MIME Type。 j6KGri  
czf|c  
sCFqz[I  
当然, 也有可能是笔者对OSS SDK的使用还不够熟悉, 在取文件类型的方法上调用错误, 如是操作上的问题, 还希望能够及时指正! 谢谢。            
Py[Z9KLX  
+SSF=]4+  
原文地址:http://bbs.aliyun.com/read/179824.html

参加活动:http://promotion.aliyun.com/act/aliyun/freebeta/

 



【阿里云产品公测】以开发者角度看ACE服务『ACE应用构建指南』