要优化Web服务器的性能,我们先来看看Web服务器在web页面处理上的步骤:
我们知道,Web页面内容有静态的,也有动态的,静态的内容,web服务器可以直接将结果发回给浏览器,对于动态内容,则通常需要交给应用服务器先处理,由应用服务器返回结果。
当然,也有Web服务器本身可以处理动态内容的,例如IIS就可以自已解释处理ASP,ASP.NET这两种微软的动态网页脚本语言。
从上面简要的分析里,我们大致可以得到这样的结论,影响Web页面访问的影响因素会有这几个:
上面8项很容易理解,也很直接,其实还有以下几项也是关乎Web页面访问速度体验的因素,你可以思考下是否如此?或者说是否会影响到页面访问性能。
我们可以将上面一共11项影响因素抽像出来,那么就是:
反映到我们进行性能优化,可以入手的角度就有:
经过前面小节的简要分析,我相信你对优化Web服务器有一定的思路了,你可以从硬件层面、软件层面、Web代码三个层面去优化。
下面我们结合一个具体的实例来实践一回,本文所举例是一个小型的Web站点,部分数据系假设,如有类同,纯属巧合,仅起抛砖引玉之用。在实际工作中,如果碰到大站点,你可以参考此处的分析,修改优化方案。
1.站点简介
一个社区论坛站点,采用Discuz!论坛程序构建,该程序采用主流的PHP+MySQL组成。
网站目前有近5万注册用户,绝大多数是国内的用户,活跃用户数在一半左右,每天平均PV在15~20万,独立访问IP数在8000左右。
2.Web服务器性能优化需求
网站现部署在国外的服务器,租用虚拟主机来运营,因为访问量比较大,所以经常会收到虚拟主机服务商的流量很大的通知,要求控制下访问量。
另外,虚拟主机的服务器在美国,没有在国内租用虚拟主机的原因是国内网站在备案方面非常繁琐,在网站一开始运营时数据量和访问量都比较小,所以对性能要求不高,数据量小,所以服务器在查询处理数据时速度比较快,也让人感觉访问速度不慢,现在随着数据量和访问量的不断上升,访问速度已明显下降,到了需要改善访问性能的时候了。
另外提出网站数据能够每天自动备份一次,备份数据保留一个月的,以便随时恢复。
上述两点需求,其中第一条才是性能优化需求,第二条是额外的需求了。
3.性能优化方案
根据其网站的现状和优化需求,结合自己的经验,加上谷歌的搜索,同时与网站主不断确认沟通,最终得到以下性能优化方案:
由虚拟主机部署改为独立服务器部署
虚拟主机受限比较多,无法自己自定义配置Web服务器,无法配置PHP动态缓存,而且独立服务器可以独享内存、处理器资源,不再受虚拟主机商对每个虚拟主机用户的内存和处理器资源占用限制。处理器资源和内存资源,对接受更多并发访问有直接性能提升效果。
由Windows操作系统改为Linux操作系统
网站使用的是PHP+MySQL程序,PHP在Windows下的性能,受限于IIS需要通过ISAPI形式调用PHP,所以性能不如Linux下Apache直接通过PHP模块解释PHP,更不如Nginx与PHP-FPM的性能,既然使用了独立服务器,操作系统也可以自己确定,Linux系统我们选用了熟悉的UbuntuLinuxServer10.04(一年前还没有12.04),^-^。
Web服务器采用Nginx,而不使用Apache
选用Nginx而不用Apache的原因非常直接和干脆,因为站点里有很多静态的附件文件,在处理静态内容上,Nginx性能是Apache的差不多10倍。
在PHP解释和伪静态规则方面,Apache要比Nginx强,但这不影响我们放弃它,为缓解这一点,我们在后面对PHP进行了动态缓存。
对PHP查询进行动态缓存,使用eAccelerator这个加速器
PHP加速器是一个为了提高PHP执行效率,从而缓存起PHP的操作码,这样PHP后面执行就不用解析转换了,可以直接调用PHP操作码,这样速度上就提高了不少。
eAccelerator是一个开源PHP加速器,优化和动态内容缓存,提高了PHP脚本的缓存性能,使得PHP脚本在编译的状态下,对服务器的开销几乎完全消除。它还有对脚本起优化作用,以加快其执行效率。使得的PHP程序代码执效率能提高1-10倍,这个加速还是非常明显的。
具体地,我们计划对eAccelerator进行以下设置优化:
选用了Nginx,虽然它的性能很好,但我们仍然需要对它进行性能优化,在这个案例中,我们做了以下优化:
经过上述几个优化项目,Nginx这边一共需要占用200M左右内存资源。
对PHPCGI进程性能进行优化
Nginx没有PHP模块,所以它对PHP的支持是通过PHP-FPM来实现的,PHP-FPM是跑进程来处理并发请求,在这个案例中,我们配置了20个进程,每个进程差不多占用20M左右内存资源,一共是400M左右。
同时,PHP-FPM与Nginx交互机制,选用LinuxSocket模式而不是TCP协议端口,Socks是系统级处理模式,socks也就是一个文件连接,而TCP协议端口,需要经过网络协议处理,性能不如前者,所以我们选择了前者。
MySQL数据库性能优化
因为网站主程序是选用他人开发的开源程序,所以对数据库查询的程序优化我们无法处理,只能从MySQL本身寻找突破口。
我们可以想像一下,对于论坛网站,通常看贴、查贴的访问量要远大于创建贴子、回复贴子的访问量,体现在MySQL数据库上,就是读表与查询表数据的连接处理更多。
因此我们要选择对读表、查询性能更好的存储引擎,结合以前了解的知识,MySQL缺省的MyISAM引擎就是被设计为适合处理读频率远大于写频率的环境,查询效率相当可观,而且内存占用很少,这也与我们租用低内存配置的VPS相符。
具体到MySQL配置参数的优化上,受限于服务器上内存资源本身有限,就直接采用缺省的中型环境配置文件。
内容分发网络应用
站点每天十多万的访问,上万独立IP访问,查看先前的访问统计,访问来自国内各个地区,使用多种网络连接访问进来,为保证来自各网络的用户访问速度,同时也减少对网站服务器的请求,我们采用了CDN来分发静态内容,这样各地的用户可以就近访问到已缓存在CDN上的文件,CDN服务商会在静态内容第一次访问时缓存到他们全国各地的服务器上,当第二次访问时,用户实际是没有连接到网站服务器上获取文件的,而是直接从CDN服务器上获取,可以明显的提升网站性能。
参考资料
下面推荐介绍几本有关Web性能优化的图书,可以找来阅读,尤其是《构建高性能WEB站点》这本书,非常值得服务器运维工程师阅读,它是国内一本面向服务器工程师的性能优化书籍,比较系统地讲解了优化思路,且有很多实际操作方面的举例说明。
作者:Coagent
GOPS2020全球运维大会·2020深圳站,更多DevOps、AIOps、自动化运维精彩议题,等你来~