nginx

利用多种方式优化Nginx的HTTPS性能延迟

开启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%,如下图所示:

/var/folders/p_/kldbymz97vlcbcn1r7hq4k2m0000gn/T/se.razola.Glui2/44713C72-E38C-47EE-87BF-F76745B59F5B-23592-0000BAC98540F70C/2021-01-02 at 12.13 PM.png

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

/var/folders/p_/kldbymz97vlcbcn1r7hq4k2m0000gn/T/se.razola.Glui2/E5ABC6C4-6488-46D4-AEFB-5401D780F565-23592-0000BAE5E04551B8/2021-01-02 at 12.15 PM.png

用 Chrome 确认 HTTP/2 已经打开

或者用 curl命令,返回的 status 前有HTTP2表示开启

命令:curl –http2 -I https://moneyslow.com

/var/folders/p_/kldbymz97vlcbcn1r7hq4k2m0000gn/T/se.razola.Glui2/4C8F314E-8805-4D5D-AD19-4F73A106B3E2-23592-0000BB1831BF7425/2021-01-02 at 12.18 PM.png

调整挑选更新更快的 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;