?;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、桌面应用等提供强大的后台支撑能力。
l7U<]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_en z
sAnb
绑定外部域名 ^_BjO(b‘e
9xeg,#1
若需要使用独立的域名, 如 www.example.com 来代替 xxx.aliapp.com 进行访问, 可在应用控制面板中添加一个外部域名绑定, 并在域名服务商那添加 CNAME 记录解析到 ACE 的二级域名, 即可完成绑定。绑定的条件是域名必须是经过备案的。
mdlMciP
应用的配置与调试 >[Tt‘.S!?
,x?Jrcx~‘C
在这之前, 我们先将第一个应用进行扩展, 使它看起来更有意义一点。 对的, 我们来做一个超级简约的"匿名社交网站"(好吧, 其实就是一个匿名留言板), 名字笔者都想好了, 就叫徽博好了。 Q‘YakEv >=
N;4wbUPL7h
由于这个应用与第一个发布的应用并无太大联系, 或者说功能改进实在太大, 我们选择重新生成一个空的SVN目录, 即一个新的版本, 这样做的好处之一就是, 等新的版本上线了, 又突然发现新版本存在若干重大BUG, 那么我们就可以快速一键切换回旧版本。 Y/
%XkDC~
数据库采用ACE提供的MySQL数据库服务, 在控制面板的扩展服务将其打开。 w"L]?#
WwUHHm<v
"徽博" 是这次ACE评测中笔者"临时起意"编写的一个小Web应用, 所有的源码、资源文件以及文档等, 将会以附件的形式放在评测的最后。来一起看一下 1.0 版本的徽博真面容。用我好友的话说, "徽博"有着一个不忍直视的前端配色。外加奇葩 -_-||| arvKJmD
]1MZ:]k
PS: 独创的随便登录, 无需注册, 更是让徽博独具"特色"。演示地址: http://wid-ace-test.aliapp.com/ u(8dsgR
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的缩进语法, 否则同样会重启失败。问题图示如下(以配置目录访问控制为例):
%vUUx+
O`Htdnu
目录权限配置 09i77
L@J$kqWY
配置语法: @c}Gw;e
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 D0Ls~qr
M&e=LV
u,~+ho@
配置规则: :Ye~I;"8
BF"eVKA
-
rewrite:
-
- url: ^/article/(.+)\.html$
-
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
-
denyuri:
-
- path: /ontask/
-
allowip: [‘127.0.0.1‘, ‘112.12.50.153‘]
,S?:lQuK5
若要阻止某些IP访问指定目录, 如 /downloads/ 目录, 可采用 denyip 语句: 6K >(n
-
denyuri:
-
- path: /ontask/
-
allowip: [‘127.0.0.1‘, ‘112.12.50.153‘]
-
- path: /download/
-
denyip: [‘121.13.8.242‘, ‘112.12.48.242‘]
R^.c
Z7Nhb{
自定义错误页 :4pO/I
~
\_+Af`
用户可在配置文件中对如404(资源未找到)、50x(服务器内部错误)配置错误页面: W7 +Q&4Y
-
error_page:
-
- status: 500 502 503 504 505
-
page: /50x.html
-
- status: 404
-
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
-
// $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
QSOJHRl=C
tNW0 C]
使用示例: `]<~lf
ralU9MN.
测试页面: http://wid-ace-test.aliapp.com/test-cache.php >Wj8[9zf
l3kBt-m
定时任务服务 iLFhm4.PO
N37#Vs
定时任务允许在特定的时间点或周期性的执行一个请求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
~Q1%DV.
uvGFo)9q3
如何保护任务脚本不被用户调用? 可以在任务脚本中取 GET 方式的参数进行身份验证。如保护示例中的 updateCount.php, 可在创建任务时的执行URL 中设置被执行的 URL 为: updateCount.php?howareyou=imok lb#`f,r>
并在 updateCount.php 进行验证: rW9ULS2d
-Cf<
#‘x_
应用实例: 在"徽博"首页右侧栏, 24小时热门中, 即运用的定时器配合缓存服务, 每30分钟更新一次热门。 Gt?ckMB
h&?tF~h
演示地址: http://wid-ace-test.aliapp.com/ ekuRGG
[Uu!:SZ
存储服务(Storage) wB0ONH[
&k {1N.
应用需要在本地写文件时, 需要先配置 存储服务, 否则所有本地写入操作会被认为是临时的, 不具备持久性。首先在扩展 存储(Storage) 服务中创建一个名称任意的存储空间, 然后在配置文件中指定所需写入文件的目录, 示例: jhSc9
-
ossprefix:
-
- /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>
-
rewrite:
-
- url: ^/files/(.+)$
-
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
pV^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
-
$meta = $Storage->getMeta($filename);
-
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/