Nginx是一个中间件

在搞明白Nginx是什么之前,先来了解一下“中间件”的概念。
在我们的网站后台,往往存在着很多应用服务,操作系统驱动硬件为我们提供对应的服务。那么,应用与应用之间的调用或者应用直接与操作系统/硬件的交互,这样会导致一个问题——我们在很多的应用情况下,层次化的应用不够隔离,代码耦合层度高。我们需要一个东西来为我们代理和处理对应的请求,让应用只负责业务的逻辑,这样的话就出现了一个“中间件”。
中间件可以直接调用操作系统,也可以调用应用,分发给对应的应用进行相应的逻辑处理。如此整个网站,承上启下,层次性的作用越好。
中间件可以直接接受web请求,并把请求直接给操作系统返回给web请求;
也可以把请求给应用A,起到一个“代理分发”的作用,然后应用A再去请求操作系统;
还有一种情况,应用往往不是独立的,而是需要依赖别的应用,这个时候应用A也可以先请求中间件,然后让中间件区分发给对应的应用。这样的话,在大型的网站之中,有了一个个中间件的串联,使得网站层次性更高,可维护性更高。
image.png
中间件还能做得更多,比如说负载均衡、对http请求的缓存服务、对安全应用防护的设置等等。

Nginx是一个开源且高性能、可靠的中间件、代理服务。

Nginx的优点

一、I/O多路复用epoll

多个描述符的I/O操作都能在一个线程内并发交替地顺序完成,这就是I/O多路复用,这里的复用指的是复用同一个线程。
epoll模型每当fd就绪,采用系统的回调函数直接将fd放入,效率更高。
epoll模型没有最大连接限制

fd全称是file descriptor,是进程独有的文件描述符表的索引

epoll、poll和select是Linux下面常见的内核的IO多路复用的模型,最早的是select。
关于这三者的区别与联系,详见👉https://www.yuque.com/dunteng/oy4s68/gggcoe

二、轻量级

功能模块少,代码模块化。
nginx是一个足够轻量级的web服务,为了充分考虑性能有师6,nginx源代码只保留了和http和相关核心功能的代码,一些不够核心的或者可以作为插件进行安装的功能不会被集成进去,这样保证了代码的轻量级。其不足是不如apache全面。

三、CPU亲和(affinity)

nginx利用了CPU亲和来提升它的并发处理能力,减少不必要的性能损耗。

CPU亲和是一种把CPU核心和nginx工作进程绑定的方式,把每个worker进程固定到一个CPU上执行,减少切换CPU的cache miss,获得更好的性能。
image.png

四、sendfile机制

nginx在处理静态文件方面的效率是非常有优势的,原因是其采用了sendfile的工作机制。

下面来对比一下原来的 http server的服务👇
image.png
当请求一个文件的时候,请求要经过操作系统的内核空间(kernel space)和用户空间,最终到达socket,通过socket再传递responses给用户。对于一台服务器而言,它要经过内核空间到用户空间,也即是要发生多次的切换。对于静态文件而言是不需要经过用户空间的逻辑处理,直接就可以通过内核空间进行传输,所以sendfile正是利用到了这种模式,就是Linux的零拷贝传输模式。
这种文件请求直接通过内核空间传递的方式,在CDN、动静分离等场景时,nginx的性能更佳。
image.png