开启http2
首先从优化TLS 握手和延迟入手,在Nginx 中的 TLS 设置中开启 HTTP/2,HTTP/2 标准是从 Google 的 SPDY 上进行的改进技术,比 HTTP 1.1 提升更多的性能,在需要并行多个请求的时候可以减少延迟。一般情况下一个网页需要请求很多次,而在 HTTP 1.1 时代浏览器能做的就是开多个连接进行并行请求,而HTTP2可以在一个连接中进行并行请求。HTTP2原生支持多个并行请求减少了顺序执行的请求的往返过程。
如果你想自己看一下 HTTP 1.1 和 HTTP 2.0 的速度差异,可以试一下:https://www.httpvshttps.com/。
访问海阔中文网,网络测试下来 HTTP/2 比 HTTP 1.1 快了89%,如下图所示:
HTTP 1.1 与 HTTP 2.0 速度对比
在 Nginx 中开启 HTTP 2.0 非常简单,只需要增加一个 http2 标志即可:
listen 443 ssl;
# 更改为
listen 443 ssl http2;
注意:如果客户端不支持 HTTP2(例如Python 的 requests,暂时还不支持 HTTP 2),连接会自动降级为 HTTP1.1向后兼容。
如何确认你的网站或者 API 开启了 HTTP2?可以用chrome浏览器中的HTTP/2 and SPDY indicator 这个插件来看,如果是实蓝色的标记,则说明是开启并支持了http2
用 Chrome 确认 HTTP/2 已经打开
或者用 curl命令,返回的 status 前有HTTP2表示开启。
命令:curl --http2 -I https://moneyslow.com
调整挑选更新更快的 Cipher,有助于减少延迟
# 手动启用 cipher 列表
ssl_prefer_server_ciphers on; # prefer a list of ciphers to prevent old and slow ciphers
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
不使用 Let's Encrypt的证书,用其它证书,因为ocsp有时候国内访问不到
开启 OCSP Stapling
在 Nginx 中启用 OCSP Stapling:
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /path/to/moneyslow.com_full_chain.cer;
如何检测 OCSP Stapling 是否已经开启?
可以通过openssl命令查看ocsp
openssl s_client -connect www.moneyslow.com:443 -servername moneyslow.com -status -tlsextdebug < /dev/null 2>&1 | grep -i "OCSP response"来测试。如果结果为
OCSP response:
OCSP Response Data:
OCSP Response Status: successful (0x0)
Response Type: Basic OCSP Response
则表明开启。
调整ssl_buffer_size 4k;
启用 SSL Session 缓存
启用 SSL Session 缓存可以大大减少 TLS 的反复验证,减少 TLS 握手的 roundtrip。
虽然 session 缓存会占用一定内存,但是用 1M 的内存就可以缓存 4000 个连接,真到这个连接的时候,你的网站就很成功了。
例子: ssl_session_cache 设置为使用 50M 内存,以及 4 小时的连接超时关闭时间 ssl_session_timeout
# Enable SSL cache to speed up for return visitors
ssl_session_cache shared:SSL:50m; # speed up first time. 1m ~= 4000 connections
ssl_session_timeout 4h;