1、pagespeed简介

1.1、简介

Google PageSpeed Service是Google提供的一项免费CDN加速服务,Page Speed Service会从网站的服务器抓取内容,重写网页,再通过Google的服务器呈现给用户浏览,利用谷歌强大的服务器处理能力与反应速度,提升网页的加载速度。

主要包括以下方面优化功能:

1)内容重写,自动合并CSS、JavaScript
2)将CSS移到HTML的Head
3)压缩图片、优化图片、缓存图片
4)使用“优先缓冲可见组件(Cache and Prioritize Visible Content)”让HTML 编码支持缓存服务

Google PageSpeed Service会自动对你的网站进行CSS、图片、JS、Html压缩优化,对内容、DNS缓存等开启并优化,而且PageSpeed Service配备了强大的自定义设置与访问统计功能,还可以控制某一IP或者用户对网站的访问权。

Google PageSpeed Service中的web服务核心模块为apache的mod_pagespeed。mod_pagespeed于2010年发布,让网站管理员可以为其Web应用提速,而不需要深度的性能优化造诣。mod_pagespeed最初版本只作为Apache的模块,并不兼容Nginx这个最流行并为许多大型站点所使用的高性能开源网络服务器。

2013年在google和taobao工程师们的努力下Nginx的PageSpeed模块发布,名为ngx_pagespeed。作为Nginx组件,ngx_pagespeed将重写你的网页,让用户以更快的速度进行访问。重写的工作包括压缩图片、缩减CSS和JavaScript、扩展缓存时间,同样还包括其它一些最佳实践:

1)优化缓存——整合应用程序的数据和逻辑
2)最小化round-trip次数——削减连续的请求/响应周期数
3)最小化请求开销——削减上传大小
4)最小化负载大小——削减响应、下载及缓存页面大小
5)优化浏览器渲染——改善浏览器页面布局
6)移动方面的优化——优化站点移动网络和设备方面的相关特性

1.2、效果测评

1)CDN供应商MaxCDN最近发布了一篇关于ngx_pagespeed测试的 博文

通过PageSpeed,我们将平均网页时间削减1.57秒,将网站跳出率减少1%,退出比例减少2.5%。总而言之,只通过给Nginx配置添加些许语句就提升了额外的性能……我们会继续参与PageSpeed团队一起测试模块,而我们的目的就是让模块更有助于我们的平台。

2)流行WordPress托管提供商ZippyKid同样是PageSpeed 最早的测试者

PageSpeed是世界上第一个针对WordPress优化服务,由ngx_pagespeed驱动,可以自动提升WordPress网站性能并提高访问速度。我们的基准指出为ZippyKid提供的PageSpeed可以减少3/4的网页大小,并且提高50%的页面渲染速度。

2、分布式google pagespeed service设计与实现

2.1、适用于个人网站的简单实践

nginx作为http代理集成了ngx_pagespped模块,在nginx.conf中添加代理网站的配置(源站域名,源站ip:port,可适用cdn域名)之后就能够轻松完成全站静态资源的优化;架构图如下所示。

nginx.conf中server部分配置如下;其中,我们开启了css,图片的rewrite和压缩,开启了inline_preview_images,resize_mobile_images,lazyload_images等需要重构基础页的功能,代理DEMO使用www.baidu.com;

2.2、适用于海量网站的网站托管和全站加速服务架构

2.2.1、在整个架构设计过程中需要考虑到的因素有:

1)IDC地域覆盖
需要考虑按用户地域属性和ISP属性规划若干个区域接入点,每个接入点辐射周边地域用户,用户就近最快速接入获取数据;除此之外,每个区域都将部署代理和缓存集群;

2)全局资源调度
集群服务器资源全局分配,通过docker container集群方式将资源全局化;方便资源按需分配,方便跨区域使用网站托管和网站代理服务;如,某区域资源到瓶颈,代理和缓存container自动被分配到临近资源集群中去,同时区域接入点也会将该区域请求路由到临近代理和缓存集群中去;

3)区域容量管理
每个区域的container资源按需分配,按照pv数自动在相应区域分配对应资源作为客户网站托管的容器,同时在事件性流量变化过程中将自动调整container的资源分配以保障客户网站的接入稳定;

4)运维自动化
涉及到监控、扩容,灾备和服务上下线;使用container集群方式进行资源的监控、扩容和管理,快速、冗余和稳定;

2.2.2、单区域内架构设计:

全站加速区域集群需要考虑上面列出的多种因素;整体架构如下图所示;

为了落地整体平台的资源调度、容量管理和运维自动化等功能,我们在所有区域集群中使用docker虚拟化技术来生成多个资源隔离的容器环境,满足不同客户的网站托管需求,在保证用户计算资源隔离情况下服务器资源被高效利用;我们需要在原有简单架构上引入一些功能模块,他们是:container,泛域名解析,metaserver,redis_cluster,swarm,etcd_cluster,http-proxy,confd,cdn中间页服务,永久在线服务

0)docker container
应对多域名租户的业务场景,我们需要使用虚拟化技术做到租户域名代理服务间资源隔离,保证域名代理服务间的稳定;每个container中部署不同客户的域名代理加速服务(ngx_pagespeed),通过服务器ip+随机端口方式对外暴露服务;

1)泛域名解析
全站加速平台通过网站主将域名指向我们提供的cname完成托管接入;使用泛域名解析方式,可以产生cname、host和contianer之间的相互映射关系,从而方便在多域名租户的环境下,快速定位客户域名代理container的准确分布和物理位置;

2)metaserver
通过调用下游基础模块(redis/etcd/swarm),对外提供WEB端业务(任务增删改功能)和资源集群的监控/管理接口,对内提供任务管理和下发的接口;

3)swarm
提供docker服务器集群资源管理功能,通过区域、业务、ISP等属性tag来进行docker container的资源分配、创建和状态监控等工作;

4)etcd_cluster
etcd_cluster提供所有ngx_pagespeed container自注册和服务发现的功能;metaserver使用etcd集群将任务下发到所有区域的ngx_pagespeed container中,还通过etcd集群中各container节点状态变化来管理任务下发的进度;etcd_cluster可以认为是ngx_pagespeed container与metaserver进行交流的中间件;

5)redis_cluster:
redis集群中存储container_idhost:port映射关系

6)confd
confd与ngx_pagespeed一起部署在container中,它监控etcd集群中相关任务字段的变化,实时更新本地container中ngx_pagespeed的配置并重载nginx配置;

7)cdn中间页服务
使用cdn的中间页服务(下一篇介绍)来支撑全站加速平台的静态cdn资源需求;
假设,我们自己的cdn域名为cdn.apmbe.com,则全站优化平台(ngx_pagespeed的MapRewriteDomain指令)将代理域名的网址通过如下规则进行映射:http://www.baidu.com/zzz/bbb/xxx.jpg http://cdn.apmbe.com/v1.0/www.baidu.com/zzz/bbb/xxx.jpg
因此,在cdn节点回源时需要查找代理域名的后端服务器host:port,我们将所有代理域名的服务器host:port存储在redis集群中,使用http-proxy在每一次cdn节点回源时动态查找目标ip:port并完成转发;

8)http-proxy
http-proxy部署接入集群用来路由接入端流量,它根据redis集群中存储的cnamecontainer的host:port的映射规则来转发接入端的访问流量;
回源http-proxy作为cdn节点的回源源站代理,它根据redis集群中存储的continaer_idhost:port的映射规则来转发cdn回源端的回源流量;

9)永久在线服务
定时抓取客户源站的基础页资源产生自建镜像站,当客户源站因为网络链路抖动或者其他原因无法访问时,自动更新/切换ngx_pagespeed代理服务中的源站回源信息;

2.2.3、多区域内架构设计:

考虑到服务器资源零散分布在全国不同IDC且运营商、带宽资源都不统一的情况,整体区域规划设计如下;

1)全局范围内将全国节点按照南北运营商和临近地域属性分成N组,保持每组M台物理机的规模,方便流量接入、运维和区域容灾冗余;
比如:北方联通东三省组,北方电信京津冀组,南方电信长三角组等;
2)按照南北/运营商属性分成N个分区域metaserver,用来管理和下发本区域内分组节点任务配置;

集群组内架构设计:

1)第一层,从左到右分别为cdn回源入口,全站加速服务业务入口,全国网民流量接入入口;cdn回源入口通过cdn域名接入,全站加速服务业务入口通过metaserver的代理接入,它是所有区域metaserver的上游代理;网民访问网站会将实际流量指向cname所在ip集群,根据就近接入的原则,会被指向到网民所在区域集群的http-proxy;

2)第二层,为上面2.2.2所述的单区域内metaserver+http-proxy架构;其中,考虑到容灾和跨运营商数据同步问题,每个区域内使用独立的memcache和redis集群;

3)第三层,为上面2.2.2所述的单区域内的container架构;

4)另外,平台使用全局统一的etcd集群

3、总结

google pagespeed service提供全站静态资源的优化和加速,提供基础页DOM树的重构和优化,静态资源的压缩、优化、转码和自动上cdn功能;但是对于动态请求,只是简单的透传,不过相较于IDC资源较少的网站其实也提供了全国多点动态加速的效果;