声明:图片来自  github:https://github.com/russelltao/geektime-nginx

SSL协议握手时Nginx的性能瓶颈在哪里?
TLS通讯过程
通讯过程中双方主要想完成四个目的

  • 验证身份
  • 达成安全套件共识
  • 传递并生成密钥
  • 加密通讯

nginx能抗多少_nginx

  • ①浏览器向服务器发送Client Hello的消息
  • 因为我们的浏览器是非常多样化的,比如Firefox,IE,Chrome,而且浏览器的版本在不停地变更,所以不同的浏览器它所支持的安全套件,加密算法都是不同的。这一步告诉服务器我支持哪些算法。
  • ②Sever Hello 我们的Nginx它会有一个自己支持的加密算法的列表以及它倾向于使用哪一个加密算法套件,这里Nginx它会选择一套它最喜欢的加密套件发送给客户端
  • 如果我们想复用session也就是Nginx打开了session cache,希望在一天内端口连接的客户端不用再次协商秘钥,可以直接复用之前的秘钥
  • Sever Hello信息中主要发送究竟我们选择哪一个安全套件。
  • ③Nginx会把自己的公钥证书发送给浏览器
  • 这个公钥证书中是包含证书链的,所以浏览器可以找到自己的根证书库区验证证书是否是有效的
  • ④服务器会发送Sever Hello Done
  • 如果我们之前协商的安全套件,比如之前提到的椭圆曲线算法,这时需要在第三步和第四步之间把椭圆曲线的参数发送给客户端,方便我们在第六步生成最终加密加密所需的秘钥
  • ⑤客户端也需要根据椭圆曲线的公共参数生成自己的私钥以后,把公钥发送给服务器,
  • ⑥Key generation
  • 服务器有自己的私钥,把公钥发送给客户端,可以根据自己的私钥,和客户端的公钥共同生成双方加密的秘钥,这一步由服务器制作的,
  • 客户端根据服务器发来的公钥和自己的生成的私钥,也可以生成一个秘钥
  • 服务器和客户端各自生成的秘钥是相同的,这是由非对称加密算法保证的。
  • 接下来就可以用这一步生成的秘钥进行加密,进行数据通信。

从这个过程中,我们可以看到,TLS通讯主要在做两件事:

  • 第一件是交换秘钥
  • 第二是加密数据
  • 所以最消耗性能的也是这两点

Nginx是怎样优化它的性能?
这里我们主要看它的算法性能,Nginx在握手的时候,主要看它的椭圆加密算法和RSA非对称加密算法这样的性能
如下图,对于小文件,握手时主要影响它性能的主要指标

nginx能抗多少_客户端_02


如下图,对于大文件,就会考虑对称加密算法的性能,比如说AES,对称加密性能虽然很好,但是对于一个非常大的文件,我们去测吞吐量的时候,相对于其他算法,AES性能还是比较好的,它可以达到一个数据的极限

nginx能抗多少_nginx_03


Nginx的综合性能

nginx能抗多少_nginx能抗多少_04

  • 当以小文件为主时,主要考验的是Nginx的非对称加密的性能,比如说RSA
  • 当我们处理大文件时,主要考虑对称加密算法的性能,比如说AES。
  • 如果我们处于小文件比较多的情况下,重点可能就是优化椭圆曲线算法的一些密码强度是不是可以有所降低
  • 当我们面对大的文件处理的时候,可以考虑是否可将AES算法替换为更有效的算法或者把密码强度调的更小一些