下载APP
登录
关闭
讲堂
算法训练营
Python 进阶训练营
企业服务
极客商城
客户端下载
兑换中心
渠道合作
推荐作者
当前播放: 17 | SSL协议握手时Nginx的性能瓶颈在哪里?
00:00 / 00:00
标清
  • 标清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看

Nginx核心知识100讲

共155讲 · 155课时,约1300分钟
18530
免费
01 | 课程综述
免费
02 | Nginx适用于哪些场景?
免费
03 | Nginx出现的历史背景
免费
04 | 为什么用Nginx:它的 5 ...
免费
05 | Nginx的四个主要组成部分
06 | Nginx的版本发布历史
07 | 选择哪一个Nginx发行版本...
08 | 编译出适合自己的Nginx
09 | Nginx配置文件的通用语法...
10 | Nginx命令行及演示:重载...
11 | 用Nginx搭建一个可用的静...
12 | 用Nginx搭建一个具备缓存...
13 | 用GoAccess实现可视化并实...
14 | 从网络原理来看SSL安全协...
15 | 对称加密与非对称加密各自...
16 | SSL证书的公信力是如何保...
17 | SSL协议握手时Nginx的性能...
18 | 用免费SSL证书实现一个HTT...
19 | 基于OpenResty用Lua语言...
20 | Nginx的请求处理流程
21 | Nginx的进程结构
22 | Nginx的进程结构实例演示
23 | 使用信号管理Nginx的父子...
24 | reload重载配置文件的真相
25 | 热升级的完整流程
26 | 优雅地关闭worker进程
27 | 网络收发与Nginx事件间的...
28 | Nginx网络事件实例演示
29 | Nginx的事件驱动模型
30 | epoll的优劣及原理
31 | Nginx的请求切换
32 | 同步&异步、阻塞&非阻塞...
33 | Nginx的模块究竟是什么?
34 | Nginx模块的分类
35 | Nginx如何通过连接池处理...
36 | 内存池对性能的影响
37 | 所有worker进程协同工作的...
38 | 用好共享内存的工具:Slab...
39 | 哈希表的max_size与bucke...
40 | Nginx中最常用的容器:红...
41 | 使用动态模块来提升运维效...
免费
42 | 第三章内容介绍
43 | 冲突的配置指令以谁为准?
44 | Listen指令的用法
免费
45 | 处理HTTP请求头部的流程
46 | Nginx中的正则表达式
47 | 如何找到处理请求的server...
48 | 详解HTTP请求的11个阶段
49 | 11个阶段的顺序处理
50 | postread阶段:获取真实客...
51 | rewrite阶段的rewrite模块...
52 | rewrite阶段的rewrite模块...
53 | rewrite阶段的rewrite模块...
54 | find_config阶段:找到处...
55 | preaccess阶段:对连接做...
56 | preaccess阶段:对请求做...
57 | access阶段:对ip做限制的...
58 | access阶段:对用户名密码...
59 | access阶段:使用第三方做...
60 | access阶段的satisfy指令
61 | precontent阶段:按序访问...
62 | 实时拷贝流量:precontent...
63 | content阶段:详解root和a...
64 | static模块提供的3个变量
65 | static模块对url不以斜杠...
66 | index和autoindex模块的用...
67 | 提升多个小文件性能的conc...
68 | access日志的详细用法
69 | HTTP过滤模块的调用流程
70 | 用过滤模块更改响应中的字...
71 | 用过滤模块在http响应的前...
72 | Nginx变量的运行原理
73 | HTTP框架提供的请求相关的...
74 | HTTP框架提供的其他变量
75 | 使用变量防盗链的referer...
76 | 使用变量实现防盗链功能实...
77 | 为复杂的业务生成新的变量...
78 | 通过变量指定少量用户实现...
79 | 根据IP地址范围的匹配生成...
80 | 使用变量获得用户的地理位...
81 | 对客户端使用keepalive提...
82 | 反向代理与负载均衡原理
83 | 负载均衡策略:round-rob...
84 | 负载均衡哈希算法:ip_has...
85 | 一致性哈希算法:hash模块
86 | 最少连接算法以及如何跨wo...
87 | upstream模块提供的变量
88 | proxy模块处理请求的流程
89 | proxy模块中的proxy_pas...
90 | 根据指令修改发往上游的请...
91 | 接收用户请求包体的方式
92 | 与上游服务建立连接
93 | 接收上游的响应
94 | 处理上游的响应头部
95 | 上游出现失败时的容错方案
96 | 对上游使用SSL连接
97 | 用好浏览器的缓存
98 | Nginx决策浏览器过期缓存...
99 | 缓存的基本用法
100 | 对客户端请求的缓存处理...
101 | 接收上游响应的缓存处理...
102 | 如何减轻缓存失效时上游...
103 | 及时清除缓存
104 | uwsgi、fastcgi、scgi指...
105 | memcached反向代理的用法
106 | 搭建websocket反向代理
107 | 用分片提升缓存效率
108 | open file cache提升系...
109 | HTTP/2协议介绍
110 | 搭建HTTP/2服务并推送资...
111 | gRPC反向代理
112 | stream四层反向代理的7个...
113 | proxy protocol协议与r...
114 | 限并发连接、限IP、记日...
115 | stream四层反向代理处理S...
116 | stream_preread模块取出S...
117 | stream proxy四层反向...
118 | UDP反向代理
119 | 透传IP地址的3个方案
120 | 性能优化方法论
121 | 如何高效使用CPU
122 | 多核间的负载均衡
免费
123 | 控制TCP三次握手参数
免费
124 | 建立TCP连接的优化
125 | 滑动窗口与缓冲区
126 | 优化缓冲区与传输效率
127 | 慢启动与拥塞窗口
128 | TCP协议的keepalive功能
129 | 减少关闭连接时的time_wa...
130 | lingering_close延迟关闭...
131 | 应用层协议的优化
免费
132 | 磁盘IO的优化
133 | 减少磁盘读写次数
134 | 零拷贝与gzip_static模...
135 | 用tcmalloc优化内存分配
136 | 使用Google PerfTools分...
137 | 使用stub_status模块监控...
138 | 第三方模块源码的阅读
139 | Nginx的启动流程
140 | HTTP第三方模块的初始化
141 | if指令是邪恶的吗?
142 | 解读Nginx的核心转储文件
143 | 通过debug日志定位问题
144 | OpenResty概述
145 | OpenResty中的Nginx模块...
146 | 如何在Nginx中嵌入Lua代...
147 | OpenResty中Lua与C代码...
148 | 获取、修改请求与响应的S...
149 | 工具类型的SDK
150 | 同步且非阻塞的底层SDK:...
151 | 基于协程的并发编程SDK
152 | 定时器及时间相关的SDK
153 | share.DICT基于共享内存...
154 | 子请求的使用方法
155 | 基于OpenResty的WAF防火...

精选留言(20)

  • 2019-01-27
    分享TLS加密过程,自己的总结:

    HTTPS采用混合加密算法,即共享秘钥加密(对称加密)和公开秘钥加密(非对称加密)。
    通信前准备工作:
    A、数字证书认证机构的公开秘钥(CA公钥)已事先植入到浏览器里;
    B、数字证书认证机构用自己的私有密钥对服务器的公开秘钥做数字签名,生成公钥证书,并颁发给服务器。

    1、client hello
    握手第一步是客户端向服务端发送 Client Hello 消息,这个消息里包含了一个客户端生成的随机数 Random1、客户端支持的加密套件(Support Ciphers)和 SSL Version 等信息。

    2、server hello
    服务端向客户端发送 Server Hello 消息,这个消息会从 Client Hello 传过来的 Support Ciphers 里确定一份加密套件,这个套件决定了后续加密和生成摘要时具体使用哪些算法,另外还会生成一份随机数 Random2。注意,至此客户端和服务端都拥有了两个随机数(Random1+ Random2),这两个随机数会在后续生成对称秘钥时用到。

    3、Certificate
    这一步是服务端将自己的公钥证书下发给客户端。

    4、Server Hello Done
    Server Hello Done 通知客户端 Server Hello 过程结束。

    5、Certificate Verify
    客户端收到服务端传来的公钥证书后,先从 CA 验证该证书的合法性(CA公钥去解密公钥证书),验证通过后取出证书中的服务端公钥,再生成一个随机数 Random3,再用服务端公钥非对称加密 Random3生成 PreMaster Key。

    6、Client Key Exchange
    上面客户端根据服务器传来的公钥生成了 PreMaster Key,Client Key Exchange 就是将这个 key 传给服务端,服务端再用自己的私钥解出这个 PreMaster Key 得到客户端生成的 Random3。至此,客户端和服务端都拥有 Random1 + Random2 + Random3,两边再根据同样的算法就可以生成一份秘钥,握手结束后的应用层数据都是使用这个秘钥进行对称加密。为什么要使用三个随机数呢?这是因为 SSL/TLS 握手过程的数据都是明文传输的,并且多个随机数种子来生成秘钥不容易被破解出来。
    展开
    1
    13
  • 2018-11-07
    视频里第一个图表,怎么看出来握手是影响性能的指标的?

    作者回复: 要做个推理,前提:1、0,1,10K的线,随着文件增大,RPS没多少下降。100K和1M时下降才明显;2、文件增大,一定会导致对称加密算法的耗时增加,对称加密主要是异或操作;3、SSL耗时主要由握手和对称加密构成。 推论:0到1K到10K,每次AES应该有10倍耗时增加的,但RPS没什么下降。所以,文件小的时候,耗时主要在握手上。

    9
  • 2018-11-06
    打卡

    作者回复: (+﹏+)

    2
  • 2019-11-20
    老师您好,请教问题,
    1,您说,nginx在向浏览器发送证书时,会发送2个证书(先发送主证书,再发送二级证书),因为根证书是操作系统或浏览器内置的。浏览器会自动认证二级证书的签发机构,和根证书是否有效。

    又在评论里看到,客户端收到服务端传来的公钥证书后,先用CA公钥去解密公钥证书,“取出证书中的服务端公钥,去验证其证书链,颁发机构是否可信。”

    证书验证这里好懵哇。。。
    可以稍微解释一下,浏览器拿到服务端的公钥后,是如何验证证书链的,
    是浏览器自己从根证书中查找验证证书链吗,如果是,那这个服务器的公钥有啥用。。

    2,在评论区看到,您说:第6步生成的密钥仅用来作本次对称加密使用,后续任何数据都需要用它来加解密后再传输。

    这个“本次”和“后续任何数据都”如何理解?
    是指后续的所有应用层数据都使用这个密钥进行加解密传输吗?

    展开

    作者回复: 1、有些浏览器使用操作系统内置的根证书,有些浏览器则自己内置根证书。当收到Nginx发来的证书链后,用根证书的公钥验证身份证的合法性。
    你可以看下《Web协议详解与抓包实战》第76课。
    2、是的。本次、后续都是指在这个TLS会话内。

    1
  • 2019-08-19
    第六步中,server 用client的公钥和自己的私钥生成的密钥与client 用server 的公钥和自己的私钥生成的密钥是一样的?两者都使用非对称加密算法

    作者回复: 完全一样。DH详细过程请参考我的《Web协议详解与抓包实战》第77课,ECDH椭圆曲线交换请参考78、79课。

    1
  • 2019-04-29
    老师,您好,这几个图的横坐标表示的是什么能具体讲一下吗?

    作者回复: 你是想问RSA/AES speed test*cores是什么意思吧?你看下“上邪忘川”的问题,那里我做了回答

  • 2019-04-07
    老师您好,接上条回复,那么客户端用dhce算法和公共参数如何生成公私钥呢,能简单讲一下吗

    作者回复: 椭圆曲线涉及大量数学知识,请参考:https://zh.wikipedia.org/wiki/%E6%A4%AD%E5%9C%86%E6%9B%B2%E7%BA%BF%E5%AF%86%E7%A0%81%E5%AD%A6。
    我建议你先弄清楚RSA的过程,再对比椭圆曲线可以省掉大量阅读数学公式的时间:-)

  • 2019-04-07
    老师您好,tls握手的步骤中,客户端用dhce算法结合服务器发送的公共参数生成一对公私钥是么,如果是这样,那中间人是不是也可以伪造一对公私钥来欺骗服务器呢

    作者回复: 不可以,因为中间人无法欺骗客户端,它无法伪造出私钥证书,进而不能通过签名等方式告诉持有公钥的客户端 相信它的身份。

  • 2019-03-16
    通讯中非对称加密和对称加密算法同时存在么? 大文件考虑对称加密算法的性能、小文件考虑非对称加密性能?

    作者回复: 对

  • 2019-02-06
    老师,第六步中服务器重新生成的秘钥与第七步客户端生成的秘钥,是用来做之后消息传递的对称加解密的吗?还是有其它作用?

    作者回复: 第六步生成的密钥仅用来作本次对称加密使用,后续任何数据都需要用它来加解密后再传输,没有其他作用。

  • 2019-01-31
    rsa不是椭圆曲线吧,没看到文中提到ecc,dh,rsa,dsa,ecc中好似能对明文加密然后解密的只有rsa,dh一般只做密钥协商,ecc和dsa虽然也叫非对称加密,但是只能验证签名是否篡改,无法解密出原文。

    作者回复: RSA不是,ECDHE是的,也是当下主流的算法。第96课中通过$ssl_curves能取到当下用的是哪条椭圆曲线。

  • 讲的真好 配合书看 之前不懂的地方 现在也越来清楚 唯一的缺憾就是没有实际项目来锻炼自己所学
  • 2019-01-19
    老师,客户端验证身份如何验证?我能理解是服务器端返回数字证书,我根据CA提供公钥进行解密得到公钥,拿到公钥如何去验证

    作者回复: 验证公钥的证书链、颁发机构是否可信

  • 2019-01-14
    老师,您好!请问下这节课图中的RSA/AES speed test*cores,主要是指什么?或者说它的单位是什么?是指算法的强度么,还是说加密所消耗的时间。

    作者回复: 指1、2、4、8等不同CPU核心下每秒执行AES等算法的速度(每秒处理请求数或者流量)。它是指算法执行所消耗的时间。

  • 2018-12-12
    老师,这个tls加密过程是,先是利用非对称算法,然后其实正式通信的时候,是通过对称加密的是吧?
    但是在生成这个对称加密秘钥的时候,我看了一些文章,他们是这样讲的,就是在客户端验证了数字签名证书之后,浏览器生成随机数R,并通过网站给的公钥进行加密,然后传给服务器,服务器用自己的私钥解密得到R,然后他们之间就以R为这个对称秘钥进行加密进行传输,这儿是算法不一样么,还是理解的有问题?

    作者回复: 这是早期的安全套件,目前新版本的浏览器以及服务器间不采用这种通讯方式,安全级别不高,包括一旦服务器私钥被攻破,前期抓到的包都可以破解,可以参考思诺登事件。

  • 2018-12-02
    非对称加密技术保证:双方生成的新密钥是一致的

    这个结论是怎么得出来的呢? 能验证下吗?

    作者回复: 你可以看下椭圆曲线加密的数学证明过程,或者看下RSA的原理验证,网上有很多,不过理解前者需要非常好的数学基础,后者比较简单,可以用来入门。

  • 2018-11-20
    加密这块听得有点懵;需要多看几遍

    作者回复: 这块确实比较复杂,不过底层知识很容易迁移学习的。

  • 2018-11-19
    老师统计QPS的图表用的是什么工具

    作者回复: 呃,这个图表不是我做的

  • 2018-11-19
    老师的tls流程是最复杂的吧,一般客户端不需要自己的证书密钥,除非银行客户端之类
    一般网站类,浏览器只是拿服务端公钥加密随机数发给服务端这样吧~

    作者回复: 不是的,我这里的例子是当前最主流的TLS安全套件交互流程,你用firefox、chrome等访问大多数ssl站点,交互流程都是这样的。这些复杂性,其实都被浏览器、nginx悄悄地完成了,所以我们感知不到:-)

  • 2018-11-18
    老师,tls一直没有捋特别清楚。视频中tls通信过程第五部不是很明白?客户端也生成秘钥对,再把公钥发给服务器端吗?那客户端的私钥的作用是什么呢?印象中非对称阶段是服务器端的秘钥对起作用。

    作者回复: 非对称加密在TLS中有两个用途,1、CA颁发的公私钥,用于身份验证及客户端对服务器的单向消息加密。2、由客户端和服务器各自生成公私钥,并把自己的公钥发给对方,结合对方的公钥和自己的私钥生成新的密钥。非对称加密技术保证:双方生成的新密钥是一致的。