这两天,关于 Google 对 HTTPS 站点的庇护可算是越来越厉害了,没有加密的网页排名活跃度就没有加密的强....
最近发现小站的速度明显慢了很多,估计就是这个 SSL 搞得....找了点优化方法,顺便修了几个洞洞....
由于小站使用 Nginx 作为服务端,所以以下的内容均针对 Nginx 进行说明。
SPDY
首先,你需要知道 SPDY 协议对于 https 有很强的促进作用, SPDY 基于 http 协议,提供更高的性能。
Nginx 1.4 的版本就已经加入了对 SPDY 的支持。只是 chrome 不认而已,原因很简单, chrome 不支持 SPDY/2 的版本,索性直接换 SPDY/3 。
Nginx 最新稳定版 1.6.2 已经支持 SPDY/3.1 而且内置了 SPDY 引擎,所以可以直接更新。更新方法很简单
1.复制当前的编译指令
1
|
nginx -V
|
2.使用wget命令下载 Nginx 1.6.2 ,解压缩并进入目录
1
2
3
|
wget http://nginx.org/download/nginx-1.6.2.tar.gz
tar zxvf nginx-1.6.2.tar.gz
cd nginx-1.6.2
|
3.修改编译指令(粘贴原来的指令,并在最后添加)
1
|
./configure [...] --with-http_spdy_module
|
4.make
1
|
make
|
如果你是默认安装,则可以直接
1 make install
5.覆盖原版bin文件(具体安装目录请自行修改)
1
|
mv objs/nginx /usr/local/nginx/sbin/
|
6.重启 Nginx
1
|
service nginx restart
|
到此, SPDY 的安装完成了,接下来是启用。
前往你的 Nginx vhost 配置文件(需要哪个就开那个)
1
|
vim [your-domain-file].conf
|
在 Server 字段做出如下修改
1
2
3
4
5
6
7
8
9
|
server
{
[...]
listen 443 spdy;
ssl on;
ssl_certificate /[location]/[your-domain].crt;
ssl_certificate_key /[location]/[your-domain].pem;
[...]
}
|
添加了 spdy 字样即可。
之后,重启 Nginx 。
至此,站点的 SPDY 也开启了。如果你想试试看,你可以到 spdycheck.org 去查看:
SPDYCheck.org
对于 WordPress 来说,添加一个301重定向可以让你的博客完全支持 ssl ,添加301的方法请参见:
【可完整跳轉鏈接】在Nginx中實現301、302跳轉之方法
均衡负载
SSL 操作需要消耗 CPU 资源,所以在多处理器的系统,需要启动多个工作进程,而且数量需要不少于可用 CPU 的个数。
最消耗 CPU 资源的 SSL 操作是 SSL 握手,有两种方法可以将每个客户端的握手操作数量降到最低:
- 保持客户端长连接,在一个 SSL 连接发送多个请求
- 在并发的连接或者后续的连接中重用 SSL 会话参数,这样可以避免SSL握手的操作。
会话缓存用于保存SSL会话,这些缓存在工作进程间共享,可以使用 ssl_session_cache 指令进行配置。1M 缓存可以存放大约 4000 个会话。默认的缓存超时是 5 分钟,可以使用 ssl_session_timeout 加大它。下面是一个针对4核系统的配置优化的例子,使用 10M 的共享会话缓存(修改 Nginx.conf):
1
2
3
4
5
6
7
8
9
|
[...]
worker_processes 4;
[...]
http {
[...]
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
[...]
}
|
合并HTTP/HTTPS主机(双协议共行)
如果 HTTP 和 HTTPS 虚拟主机的功能是一致的,可以配置一个虚拟主机,既处理 HTTP 请求,又处理 HTTPS 请求(当然我个人不建议这么做)。 配置的方法是删除 ssl on的指令,并在 *:443 端口添加参数 ssl:
1
2
3
4
5
6
7
8
9
|
server {
[...]
listen 80;
listen 443 ssl;
server_name [your-domain];
ssl_certificate /[location]/[your-domain].crt;
ssl_certificate_key /[location]/[your-domain].pem;
[...]
}
|
TLS / SNI(多域名多证书支持)
关于主机名指示,在一个 IP 上运行多个 HTTPS 主机的更通用的方案是 TLS主机名指示扩展(SNI,RFC6066),它允许浏览器和服务器进行 SSL 握手时,将请求的主机名传递给服务器,因此服务器可以知道使用哪一个证书来服务这个连接。但 SNI 只得到有限的浏览器的支持。下面列举支持SNI的浏览器最低版本和平台信息:
- Opera 8.0
- MSIE 7.0(仅在Windows Vista操作系统及后续操作系统)
- Firefox 2.0和使用Mozilla平台1.8.1版本的其他浏览器
- Safari 3.2.1(Windows版需要最低Vista操作系统)
- Chrome(Windows版需要最低Vista操作系统)
通过 SNI 只能传递域名,但是当请求中包含可读的 IP 地址时,某些浏览器将服务器的 IP 地址作为服务器的名字进行了传送。这是一个错误,大家不应该依赖于这个。
为了在 Nginx 中使用 SNI ,那么无论是在编译 Nginx 时使用的 OpenSSL 类库,还是在运行 Nginx 时使用的 OpenSSL 运行库,都必须支持 SNI 。从 0.9.8f 版本开始, OpenSSL 通过 “--enable-tlsext” 配置选项加入 SNI 支持,从 0.9.8j 版本开始,此选项成为默认选项。当 Nginx 被编译成支持 SNI 时,在使用 “-V” 选项运行时会显示如下信息:
为了在 Nginx 中使用 SNI ,那么无论是在编译 Nginx 时使用的 OpenSSL 类库,还是在运行 Nginx 时使用的 OpenSSL 运行库,都必须支持 SNI 。从 0.9.8f 版本开始, OpenSSL 通过 “--enable-tlsext” 配置选项加入 SNI 支持,从 0.9.8j 版本开始,此选项成为默认选项。当 Nginx 被编译成支持 SNI 时,在使用 “-V” 选项运行时会显示如下信息:
1
2
3
|
...
TLS SNI support enabled
...
|
但是,当开启 SNI 支持的 nginx 被动态链接到不支持 SNI 的 OpenSSL 库上时, nginx 会显示如下警告:
1
2
3
|
nginx was built with SNI support, however, now it is linked
dynamically to an OpenSSL library which has no tlsext support,
therefore SNI is not available
|
这时就需要重新修改 openssl 的编译指令,重新连接类库了。
至此,加速篇就差不多了。有需要补充的地方还请在下方评论区中留下您的观点。
接下来会介绍有关 SSL 安全方面的内容。请参照后文:SSL 安全篇
沒有留言:
張貼留言