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