社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  NGINX

Nginx 开启 ssl 会话复用,能提升多少性能?

高效运维 • 5 年前 • 799 次点击  

之前专门写过如何优化你的 https,里面总结了几点 Nginx 下优化 HTTPS 的方法,最后有两点小的建议,没有详细说明,最近在群里看到朋友发的Nginx配置文件,只配置了证书和密钥部分,所以觉得有必要再把这些刨析一下

上图是 Nginx 官网文档中,关于ssl_session_cache的介绍,ssl_session_cache,就是缓存ssl会话状态的缓存,它有4种模式可选,分别是:
  • off:严格的禁止使用会话缓存
  • none:宽松的禁止使用会话缓存,即虽然nginx不说不允许使用会话缓存,但实际不会将会话缓存下来
  • builtin:openssl的内置缓存,只有一个工作进程可以使用该缓存,官方指出,内置缓存,会导致内存碎片
  • shared:共享缓存,所有worker进程共享
这条配置,能带来多大的性能提升?我们抓包看

首先实验环境 Nginx 只配置了证书和密钥,通过 wireshark 抓包查看不配置 ssl_session_cache 的完整连接过程

可以看到,三次握手完成后,开始建立TLS连接,交换证书、验证证书,详细的TLS连接过程可参考另外一篇文章《Wireshark抓包帮你理清HTTPS请求流程》,这里不多说了,总结完整建立TLS连接过程如下:

接着我们在Nginx开启ssl_session_cache,重新抓包

可以看到,简单的TLS握手包,完成3个TLS,就建立连接,传输数据,总结简短TLS链接过程如下:

可以看到,简短的TLS链接,比完整的TLS链接少了一个完整的往返,如果按照50ms的TTL,那么一次链接就可以节省100ms,效率提升40%

缓存如何实现的?

在 nginx 中设置ssl_session_cache之后,就开启了TLS缓存复用,整个过程如下:

客户端Client Hello的时候,会带一个Session ID,如果6769号包中

服务端和客户端协商建立连接,确认Session ID

然后客户端将Session ID保存在本地,再次发起连接的时候,Client Hello会带上这个ID

因为服务端开启了ssl_session_cache,则在缓存中查找对应的Session ID,如果存在则接受并恢复会话,返回相同的Session ID

如果在缓存中,未找到对应的Session ID,则转换成完整的TLS握手

缓存的时间由ssl_session_timeout决定,默认是5分钟

总结:

TLS通过复用ssl来优化TLS连接过程,tls的复用由服务端决定是否可复用,包括session的过期时间,在nginx中,通过开启ssl_session_cache来开启缓存和复用,性能提升40%。
来源:本文转自公众号运维研习社,点击查看原文
GOPS 全球运维大会 2021 · 深圳站精彩集锦,点击下方视频了解~
近期好文:

从一次 Kafka 宕机开始,引发的高可用思考

“高效运维”公众号诚邀广大技术人员投稿,

投稿邮箱:jiachen@greatops.net,或添加联系人微信:greatops1118.
点个“在看”,一年不宕机


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/115180