[民工日记]LAMP网站建设 之性能优化篇(下)

7. reverse proxy/cache

reverse proxy又称http accelerator是在web server 前面加一道proxy, 所有request先经过proxy, 如果是在proxy缓存内的内容则不用经过web server直接就从缓存取出内容返回给用户的浏览器, 否则转给后面的web server.这样大大减轻了web server 的负担,从而使web server可以专注与处理动态页面,而可以缓存的静态页面则由更加快速轻便的proxy直接返回给用户, 从而提高了系统的总体处理能力和响应速度.

老牌open source proxy 软件Squid就可以用来做reverse proxy/http accelerator.

Apache 的mod_proxy 和mod_cache也可以结合起来达到相同功能.

squid 稳定版本现在是2.6和3.0. 2.6尚不支持http 1.1. 2.5问题较多,建议不要使用.

有一个比较新的开源软件 varnish是专门的reverse proxy软件, 从架构和原理来说性能很好并且非常灵活, 通过一种简单而功能强大的编程语言VCL定制你的policy;问题是对于新手掌握VCL并写出安全而又符合自己需要的control script不是意见容易的事. 我试用了varnish一阵,可能是自己的VCL写的有问题, 在performance上还不如squid, 而且一不小心还会出错…所以暂时放到一边,有时间再慢慢研究. 但是长远来说, varnish在这个领域非常有潜力.

除了caching, reverse proxy 还可以用于集成不同平台的后台web server, 甚至用于作load balancing.


8. PHP opcode cache/accelerator/opcode optimizer

所谓php opcode cache, 就是把编译后的php opcode 缓存起来, 从而不必每个请求都编译一边, 大大提高了php的执行效率.

open source中APC, Turke MMCache(eAccelerator的前身)/eAccelerator是老牌的; 其中eAccelerator在众多评测中声誉甚佳, 并且还有 opcode优化, cache压缩以及很好的管理界面等优点. 但在海归网的服务器上, 或许是设置或者海归网应用本身的原因, eAccelerator的表现实在是强差人意,甚至还不如不用.

对几种opcode cache反复试用的结果, xcache的效果最好, 切切实实地加快了PHP的执行速度. 在网上搜索一下, Xcache的用户满意度都很高。 xcache目前还没有opcode 优化功能, 期望在这方面能更进一步。

9. data cache

对于server side的缓存,一般来说可以有几级cache:

用户请求–>reverse cache, 若命中, 则直接返回
否则 –> web server ;
查询数据首先查 data cache; 若命中则不用查询数据库
否则查询数据库–>DBMS首先查自己的query_cache, 若命中则直接返回结果不用到磁盘上进行查询

这里说的是data caching.

由于php web applicaiton基本上来说是一种shared-nothing的架构, 每次请求是与其他请求基本是互不相干的, 不像J2EE或.NET一样数据可以缓存在内存里(比如jaba servlet或asp.net的session), 所以缺省是无法在内存里缓存数据的而是每次请求都得重新查询一遍数据库; 为了减少或简化数据库的访问(因这往往是瓶颈), 一般的数据缓存方法有:

–数据存储在文件里
— 数据存储在数据库表里:把耗费资源的复杂查询或计算的结果放到简单的数据库表中供以后重用,
— 数据存在 shared memory里, 从而多个php进程在多次请求间可以共享.
— 数据存在专门的caching服务中.

从性能来说,存贮在shared memory里是最快的.

如果只有一台服务器, 那么可以利用eaccelerator/xcache提供的功能–除了cache php opcode之外, 这些工具也都提供了直接cache应用程序数据到内存里的功能. 例如, 使用xcache的 API很简单:

if (xcache_isset("my_key")) {
//从cache取出数据
$data = xcache_get("my_key);
...
} else {
....
//把数据存到cache里
xcache_set("
my_key", $new_data, 3600); // save data for 1 hour
}

但是如果是多台web server, 很多时候就无法在本地机器的内存里cache数据了,因为会有数据一致性的问题。这种情况下一个很好的解决方法是使用memcached.

memcached 是开源的分布式caching 服务,支持几乎所有主要编程语言,客户端接口包括php/java/puthon/ruby/.net/perl/c 等。客户通过tcp/ip协议访问memcached缓存。最早是live journel网站为了解决多服务器数据缓存问题开发的,现在在许多著名的大流量网站上被使用,例如facebook, wikimedia, slashdot, sourceforge等等。

php的memcached 接口是一个zend extension需要下载编译; 当然还需要下载安装memcached 本身。

10. easy traffic limiting with iptables, 禁止 hotlinks etc

这个本来跟服务器性能无关,但是由于经常网站变得很慢是由于一些网站蜘蛛(有些是搜索引擎,有些是些恶意蜘蛛或者到处乱抓网站内容的)无休止频繁的扫网站,搞得服务器不堪重负。 一般简单的方法是在apache里禁止user agent 或者禁止ip, 但效果不好。用iptables的recents模块可以在ip层对client进行限速。

举个例子, 以下这两条iptables规则:

iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set

iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --update --seconds 600 --hitcount 2 -j DROP

的意思是说, 任何用户不能在600秒内访问本机器的web server (tcp 80端口)平均超过2 次。若超过则请求将被丢掉(客户端的表现就是服务器没响应)。

也就是说, 来自同一个ip的蜘蛛或恶意攻击者将无法在短时间内对服务器发起大量连接请求导致服务器瘫痪。

另外, 由于直接在别的网站链接本站的图片会导致服务器流量过大, 降低服务器性能, 有时被迫在apache里禁止无本地referer的访问图像请求。 不过现在海龟网的图像文件已经转移到了另一个server上也就没有这个限制了。

匆匆草就,先睡了。 以后有时间再瞎聊下scalability与availabilty。

About: mmpower

Software Architect & Soccer Fan 黑超白袜 = IT 民工 + 摇滚大叔


Leave a Reply

Your email address will not be published. Required fields are marked *