在RHEL 7中安装mod_pagespeed

Redhat 在它的 Linux 发行版 RHEL(Redhat Enterprise Linux)中引入了一个新功能:Software Collections,简称 SCL。SCL 的工作原理和其它的软件部署工具不太一样,SCL 不会把软件装到系统目录中,而是做了一个虚拟的目录结构;而安装的软件默认不启用,需要使用特定命令开启。

拿 PHP 5.5 举例,安装完成之后,PHP 5.5 会出现在 /opt/rh/php55/ 目录下,使用 scl enable php55 可以把它开启。比如查看 PHP 的版本:

使用 PHP 貌似没什么太问题,但是 Apache 和 mod_pagespeed 就有点不和谐了。Apache 2.4 装好之后,在 /opt/rh/httpd24 中。但是安装 mod_pagespeed 的时候,RPM 会抱怨说:

httpd >= 2.2 is needed by mod-pagespeed-beta

而使用了 scl enable httpd24 之后,问题依旧。我还没有仔细看 scl enable 的原理是什么,但基本上它和 RPM 的沟通不太正常。

不过不要紧,RPM 有一个 --nodeps 选项,即不检查所需的依赖库。把原先的命令改成这样即可:

但是呢,还是有一点点的小问题。mod_pagespeed 默认的安装目录是 /etc/httpd,但真正的 httpd 还在 /opt/rh/httpd24 下面,于是我们要么把装好的文件复制过去,要么在安装之前做一个符号链接(Symbolic Link)。我倾向于后者,因为这样可以解决后续的升级问题。制作符号链接的命令如下:

之后再安装 mod_pagespeed 就没有问题了。

使用 Pagespeed 做反向代理

之前有提到过我把博客的图片都移到 App Engine 了,这样做的好处是 Google 的 CDN 很快,并且价格便宜,但坏处也很明显,就是由于某些“不可抗力”的影响,图片时常打不开。没办法,只能再绕回来。

反向代理(Reverse Proxy)是这么一个东西,它可以把远程服务器的资源收回本机,然后再向客户端发出去。简单来说,现在博客图片放在 leonax.storage.googleapis.com 上面,访问不到。设置了一个反向代理之后,图片回到了 leonax.net/images,这样就可以正常访问了。之所以称它为“代理”,是因为源图片依然存放在 googleapis.com,只是用户访问时候,动态抓取过来而已。

一开始我想用 Apache 做反向代理,但貌似它对 CDN 的支持不太好,只好放弃。后来发现 pagespeed 也有类似的功能,尝试下来效果还不错。只需要两行代码:

其中 ModPagespeedMapRewriteDomain 是把页面中所有指向 googleapis.com 的引用都改写成 leonax.net/images,这样我就不用一个一个页面去改了。然后用 ModPagespeedMapProxyDomain 把 leonax.net/images 反向代理到 https://leonax.storage.googleapis.com。这样一来,用户访问 leonax.net/images 的时候,就自动获得后者的内容了。

另外,开启 SSL 支持还需要:

这样做的好处是避免了 googleapis.com 时常访问不了的情况,但坏处是增加了主站的流量,AWS 的小机器可能会承受不了。

使用 mod_pagespeed 来提升博客访问速度

mod_pagespeed 是 Google 提供的一个工具,对网站的输出进行优化,从而提升客户端的访问速度。

mod_pagespeed 支持 Apache 和 Nginx。Apache 中简单的安装方法如下。安装完成之后,它会在 yum 里新建一个安装源,之后通过 yum update 更新就可以了。

如果你使用的是 64 位 CentOS/Fedora,或者 Debian/Ubuntu,请参见官方的安装指引。另外它还支持通过 cPanel 安装,对于共享主机的用户也是一大便利。

mod_pagespeed 中有一系列的默认的优化选项(filter),在安装完成之后自动打开,只需要重启一下 Apache 就可以看到效果了。具体的选项列表可以参考这个页面。基础的优化都已包含了,比如压缩 CSS 和 Javascript、延长资源的过期时间、重写图片等。

如果还想进一步优化,可以考虑几下选项:

  1. remove_comments:删除源文件中的注释。绝大多数情况下,注释对于终端用户都是不可见的,删掉之后不影响浏览。而且 mod_pagespeed 可以识别出 IE 的条件注释而不去动它。
  2. collapse_whitespace:删除源文件中的空白字符,同上,不影响浏览。
  3. insert_dns_prefetch:指引浏览器提前进行 DNS 解析,如果你的博客中引用了其它站点的图片,比如本博客使用 Google Cloud Storage 作为图床,增加这个选项,可以让浏览器预先解析 Cloud Storage 的 DNS,这样可以加速图片的下载速度。

增加选项需要修改 /etc/httpd/conf.d/pagespeed.conf 文件,并添加如下的代码。注意修改完之后依然需要重启 Apache。

另外,如果你的博客启用了 HTTPS,你需要对 HTTPS 进行特殊的设置,因为 HTTPS 中通讯是加密的,mod_pagespeed 无法得知其中的内容。设置也就一句话:

都搞定之后,刷新一下页面看看效果吧。

如果你想知道自己的博客还有哪些优化的余地,可以使用 Google PageSpeed Insights 来检测一下,如果得分在 85 分以上,就非常理想了。

临时禁用 PageSpeed 组件

在调试网站的时候,有时候需要禁用缓存组件,这样才可以看到最新的改动。这个时候 PageSpeed 组件可能会变成一个障碍,它并不能及时地发现原始文件有所改变,从而重新进行缓存。

当然,禁用它也很简单,甚至连 SSH 都用不上。只需要在需要调试的 URL 后面加上参数 ModPagespeed=off,比如这样:

http://leonax.net/?ModPagespeed=off

就可以访问到没有经过 PageSpeed 优化过的网页,如果你仔细看源文件,可以发现一些差别。不过现在博客没有任何的改动,所以单从界面上看不出任何差别。