博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Nginx基础 - 01简述

Posted on 2023-03-05 09:53  Kingdomer  阅读(17)  评论(0编辑  收藏  举报
 
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的拷贝。