nginx是一个开源且高性能的HTTP服务器,可靠的HTTP中间件,代理服务。
HTTP服务
虚拟目录
反向代理
负载均衡
动静分离
资源缓存
单 nginx 官方统计并发量最高 5W
单 apache 官方统计并发量最高 2W
nginx 这得益于 I/O 模型
输入 输出 写 读
就好似磁盘 你往里放数据,是 I (输入)
你看磁盘里的电影就是 O (输出)
每次I/O,都要经由两个阶段
第一步:将数据从磁盘文件先加载至内核空间(缓冲区),等待数据准备完成,时间较长。
第二步:将数据从内核缓冲区复制到用户空间的进程的内存中,时间较短。
认识个单词 kernel 内核
同步
调用者等待被调用者返回消息,才能继续执行
例如: 老板布置你任务,一直向你询问 有没有完成,完成了老板做下一件事,这种通信机制成为同步。
异步
被调用者通知状态,通知或者回调机制主动通知被调用者的运行状态
例如:老板分配你任务,任务进度状态你会向老板汇报,老板做自己的事情,不会向你问询结果。
同步/异步 关注是被调用者消息通信机制
同步和异步的区别:
同步:被调用者不会返回任务的状态,需要调用者不停的询问
异步:被调用者会向调用者返回任务的状态,不需要调用者不停的询问
阻塞 Blocking
指 IO 操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起
例如:手洗衣服,没戏完之前你都是被占用的状态。
非阻塞 nobloking
指 IO 操作被调用后立刻返回一个用户状态,无需等IO操作彻底完成,最终的调用结果返回之前,调用者不会被挂起
例如:全自动洗衣机,不需要占用你时间,洗完会通知你,在期间你没有因为洗衣服被占用时间。
阻塞/非阻塞:关注调用者在等待结果返回之前的状态
同步阻塞型
即用户进程通过系统调用拿资源,因不确定是否拿到数据,所以会一次次的询问结果,这个过程是同步。
将数据从磁盘拷贝到内核空间,再将内核中的数据复制到应用的用户空间,这个过程进程不能做其他事,即阻塞。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HqtASmIb-1634528106847)(C:\Users\yyc\AppData\Roaming\Typora\typora-user-images\image-20210925163939591.png)]
同步非阻塞
即用户进程通过系统调用拿资源,因不确定是否拿到数据,所以会一次次的询问结果,这个过程是同步。
将数据从磁盘拷贝到内核空间,再将内核中的数据复制到应用的用户空间,这个过程进程可以做其他事,即非阻塞。
这个较同步阻塞没有改善,看似非阻塞,进程可以干其他事,但由于是同步,进程依旧在不断问询结果,反而更消耗资源。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ay3qKRd2-1634528106849)(C:\Users\yyc\AppData\Roaming\Typora\typora-user-images\image-20210925164015624.png)]
IO多路复用(select)异步阻塞
用户进程找一个代理select,而不直接与内核打交道,系统调用交于select进行处理。
用户进程收到资源从磁盘写入内核缓冲区信息后,将内核缓冲区内容复制到用户空间。
select接待用户进程不是一对一的方式,而是一对多。用户进程依旧阻塞于select调用。这个有点像吃饭,客人和服务员之间的关系,>客人不会和后厨打交道,交由服务员完成。
IO多路复用只能成为异步阻塞模型,因阻塞在IO调用那里,但一个select可以检测多个IO模型,相比与同步阻塞只能检测一个提高了cpu的利用率。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p4y2Advo-1634528106850)(C:\Users\yyc\AppData\Roaming\Typora\typora-user-images\image-20210925164119445.png)]
信号驱动型 (异步半阻塞)
即用户进程建立SIGIO的信号处理程序,复制数据从磁盘到内核空间,等处理完递交SIGIO告知用户进程,这个过程是不阻塞的状态。
用户进程从内核空间复制到用户应用空间,这个过程是阻塞的。
信号驱动并未完全解决问题,只是做到了一部分不阻塞,一部分阻塞。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aASysISR-1634528106853)(C:\Users\yyc\AppData\Roaming\Typora\typora-user-images\image-20210925164143938.png)]
异步IO模型 (异步非阻塞) (epoll)
用户进程不受阻塞,所有的请求,拿数据拷贝到应用空间都由内核完成,用户进程可以接收更多的用户请求。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KPp0dCg8-1634528106854)(C:\Users\yyc\AppData\Roaming\Typora\typora-user-images\image-20210925164218273.png)]
nginx高并发使用的是epoll的方式,提供给用户访问,复制数据的一些操作交由内核完成。自身做的事情越少接待的用户请求就越多。
epoll在linux2.6中增加了内存拷贝mmap机制,加速与内核空间的消息传递,即内存映射。
内存映射机制:磁盘中有数据,数据有对应的inode,在内存中映射一个相同的inode,大小也相同,下次拿数据不需要遍历inode,分析路径了。这样提高了效率。
例如:好似学使用字典的,你先查找它是什么音,查到后直接找对应的字。