01.Nginx基本简述
Nginx基本简述
Nginx是一个开源且高性能、可靠的HTTP中间件、代理服务。
开源: 直接获取源代码
高性能: 支持海量并发
常见的HTTP服务
1.HTTPD -> Apache基⾦会
2.IIS -> 微软
3.GWS -> Google
4.openrestry
5.tengline -> 淘宝基于Nginx开发
Nginx应⽤用场景
静态处理
反向代理
负载均衡
资源缓存
Nginx优秀特性
Nginx基于IO多路复用
IO复用解决的是并发性的问题,Socket作为复⽤。
image.png
IO复用(串行,产生阻塞)
image.png
IO复用(多线程, 消耗大)
image.png
IO多路复用(主动上报)
image.png
多个描述符的I/O操作都能在一个线程内并发交替地顺序完成,这就叫I/O多路路复用,这里的 "复用"指的是复用同⼀个线程。
IO多路复用的实现方式有select、poll、Epool
什么是select
image.pngselect缺点
1.能够监视文件描述符的数量存在最大限制
2.线性遍历扫描效率低下
epool模型
1.每当FD就绪,采用系统的回调函数之间将fd放入,效率更高
2.最大连接无限制
轻量级
1.功能模块少
2.代码模块化
CPU亲和(affinity)
将CPU核心和Nginx工作进程绑定方式,把每个worker进程固定在一个cpu上执行,减少切换cpu的 cache miss ,获得更好的性能。
image.png
sendfile
传统文件传输, 在实现上其实是比较复杂的, 其具体流程细节如下:
1.调用read函数,文件数据被复制到内核缓冲
2.read函数返回,文件数据从内核缓冲区复制到用户缓冲区
3.write函数调用,将文件数据从⽤用户缓冲区复制到内核与socket相关的缓冲区。
4.数据从socket缓冲区复制到相关协议引擎。
传统⽂文件传输数据实际上是经过了四次复制操作:
硬盘—>内核buf—>用户buf—>socket缓冲区(内核)—>协议引擎
也就是说传统的文件传输需要经过多次上下文的切换才能完成拷贝或读取, 效率不高。
image.png
sendfile文件传输是在内核中操作完成的, 函数直接在两个文件描述符之间传递数据, 从而避免了内核缓冲区数据和用户缓冲区数据之间的拷贝, 操作效率很高, 被称之为零拷贝。
1.系统调用sendfile函数通过 DMA 把硬盘数据拷⻉贝到 kernel buffer,
2.数据被 kernel 直接拷贝到另外一个与 socket 相关的 kernel buffer。
3.DMA把数据从kernel buffer直接拷贝给协议栈。
这里没有用户空间和内核空间之间的切换,在内核中直接完成了了从一个buffer到另一个buffer的拷贝。
image.png