【阿里云产品公测】以开发者角度看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 G zwS  
:_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,当匹配规则中有多个相似于 (.+) 时, 参数依次类推为 $一、$二、$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的分析结果是以网页页面形式报告的, 其中有个很是直观的可视化视图, 针对"徽博"的首页性能进行性能分析的结果以下(可视视图): 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://promotion.aliyun.com/act/aliyun/freebeta/ php

 

相关文章
相关标签/搜索