三天前我决定将http://hjc.im/http://ligstd.com/ 强制开启SSL(https://hjc.im/all-force-ssl/ ),但是这几天发现SSL对Ghost博客的Ajax加载有一定影响。切换页面的时候由于速度明显变慢了,导致原本页面顶部十分自然的HTML5进度条失效,而变为浏览器自身的“加载中”状态。
严重强迫症的我实在是受不了这个事实,于是开始研究怎样让它正常地展现那高大上的Ajax,于是想起了Google开发过一个叫SPDY的东西,而且IE等浏览器已经完美兼容,更别提开源的Chromium和Firefox。
图1:IE浏览器使用SPDY加载Google首页

我的网站使用Ubuntu 14.04 LTS+Nginx1.4.6+Apache2.4.7,Nginx负责处理80端口的反向代理而Apache处理443端口的,因此要对SSL动刀子肯定要从Apache下手。网上有很多安装mod_spdy的教程,Google官方也有。按照官方的来,首先SSH连接VPS,下载deb包,这些都没有问题,然而安装时提示依赖Apache2.2,显然是依赖关系有问题。
后来还是决定自己编译。为了确保能够在Apache2.4下工作,我选择了一个第三方的源代码(https://github.com/eousphoros/mod-spdy OpenSSL是1.0.1h版本,没有Heartbleed漏洞)

sudo su;  (以Root权限执行,省掉每一步的sudo)
apt-get -y install git g++ apache2 libapr1-dev libaprutil1-dev patch binutils make devscripts;
git clone https://github.com/eousphoros/mod-spdy.git;
cd mod-spdy/src;
./build_modssl_with_npn.sh;
chmod +x ./build/gyp_chromium;
make BUILDTYPE=Release;

8月3日更新:上述项目的master分支的Apache版本已经更新到2.4.10,但Ubuntu下还是2.4.7,因此需要将git clone的那一步改为git clone -b apache-2.4.7 https://github.com/eousphoros/mod-spdy.git;

这样一来就编译好了mod_ssllibmod_spdy,它们分别在mod-spdy/src/mod_ssl.somod-spdy/src/out/Release/libmod_spdy.so下,将它们复制到Apache2的modules目录(通过apt安装的应该在/usr/lib/apache2/modules/下),并启用module

echo "LoadModule spdy_module /usr/lib/apache2/modules/libmod_spdy.so" | tee /etc/apache2/mods-available/spdy.load;
echo "SpdyEnabled on" | tee /etc/apache2/mods-available/spdy.conf;
a2enmod spdy;
service apache2 restart;

再次访问SSL站点,就可以看到是以SPDY加载了。
图2:使用SPDY加载的Ghost博客

图3:使用SPDY加载的WordPress博客

图4:使用SPDY加载的Discourse论坛

实测:Ghost博客Ajax效果全部恢复正常,页面等待时间明显减少。

注意:我处理SSL使用的是apache作为反向代理(Ruby on Rails和node.js)或Web服务器(PHP),如果采用Nginx,方法是不同的,要下载Nginx的SPDY模块。