Nginx笔记(一)nginx的简介及工作原理

什么是 Nginx?

Nginx (engine x) 是一个高性能的HTTP反向代理服务器,也是一个IMAP/POP3/SMTP服务器Nginx 最初是作为一个 Web 服务器创建的,用于解决 C10k 的问题。作为一个 Web 服务器,它可以以惊人的速度为您的数据服务。但 Nginx 不仅仅是一个 Web 服务器,你还可以将其用作反向代理,与较慢的上游服务器(如:Unicorn 或 Puma)轻松集成。你可以适当地分配流量(负载均衡器)、流媒体、动态调整图像大小、缓存内容等等。

基本的 nginx 体系结构由 master 进程和其 worker 进程组成。master 读取配置文件,并维护 worker 进程,而 worker 则会对请求进行实际处理。

Nginx相较于Apache\lighttpd具有占有内存少,稳定性高等优势,并且依靠并发能力强,丰富的模块库以及友好灵活的配置而闻名。在Linux操作系统下,nginx使用epoll事件模型,得益于此,nginx在Linux操作系统下效率相当高。同时Nginx在OpenBSD或FreeBSD操作系统上采用类似于Epoll的高效事件模型kqueue。

代理服务器

正向代理

正向代理是一个位于客户端A和原始服务器(服务器B)之间的服务器(代理服务器Z),为了从原始服务器取得内容,用户A向代理服务器Z发送一个请求并指定目标(服务器B),然后代理服务器Z向服务器B转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。

Nginx笔记(一)nginx的简介及工作原理_第1张图片 

用途:在防火墙内的局域网客户端提供访问Internet的途径。还可以使用缓冲特性减少网络使用率。

反向代理

客户端(用户A)向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端。而客户端始终任务它访问的事原始服务器B而不是服务器Z。由于防火墙作用,只允许服务器Z进出,防火墙和反向代理共同作用保护了院子资源服务器B。

Nginx笔记(一)nginx的简介及工作原理_第2张图片 

用途:将防火墙后面的服务器提供给Internet用户访问。反向代理还可以为后端的多台服务器提供负载平衡或为后端较慢的服务器提供缓冲服务。

Nginx工作原理

Nginx管理进程、多进程设计

Nginx由一个master进程和多个worker进程组成,所有进程均是仅含有一个线程,并主要通过“共享内存”的机制实现进程间通信。主进程以root用户身份运行,而worker以非特权用户身份运行。master是通过fork系统调用子进程来实现和子进程的通信,worker进程是通过处理信号来实现和master通信的。

 Nginx笔记(一)nginx的简介及工作原理_第3张图片

 

信号的处理过程

master进程接收到信号后,会先重新加载配置文件,然后再启动新的进程,并向所有老的进程发送信号,告诉他们可以光荣退休了。新的进程在启动后,就开始接受新的请求,而老的进程在收到来自master信号后,就不再接收新的请求,并且在当前进程中的所有未处理完的请求处理完成后再退出。

worker进程之间是平等的,每个进程,处理请求的机会也是一样的。当我们提供80端口的http服务时,一个连接请求过来,每个进程都有可能处理这个连接,怎么做到的呢?首先,每个worker进程都是从master进程fork过来的,在master进程里面,先建立好需要listen的socket之后,然后再fork出多个worker进程,这样每个worker进程都可以去接受这个socket。一般来说,当一个连接进来后,所有在accept这个socket上面的进程都会收到通知,而只有一个进程可以接受这个连接,其他的则accept失败,这就是所谓的惊群现象。

那么为了解决这个问题,Nginx提供了一个accept_mutex(可选项,默认打开)。这是一个加在accept上的一把共享所。有了这把锁之后,同一时刻,就会只有一个进程在accept连接,这样就不会有惊群问题了。

当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接。一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。

这样设计的优点

1、利用多核系统的并发处理能力

现在操作系统都是多核CPU,如果一直是只有一个进程在工作,那么浪费资源,如果是worker进程间地位不平等势必造成进程瓶颈问题,Nginx为了避免这个问题,设计worker间进程平等。另外,worker数与cpu核数一致,则会达到CPU资源的充分利用,如果worker数多于cpu核数,势必造成资源的竞争;若小于cpu核数,势必造成资源浪费。提高网络性能,降低请求时延。

2、负载均衡

多个worker之间通过进程通信来实现负载均衡。即当一个请求到来时,更容易分配到负载较轻的worker进程中处理。这将降低请求的时延,并在一定程度上提高网络性能

3、管理进程负责监控工作进程的状态,并负责管理其行为

这样做的好处是:

  • 管理进程不会占用多少系统资源
  • 管理进程负责监控工作进程状态,如果某个工作进程死掉,管理进程负责创建出新的工作进程,避免系统性能下降。提高了系统的可靠性。
  • 管理进程支持Nginx服务运行中的程序升级、配置项修改等,使得动态可扩展性、动态定制性、动态进化性较容易实现。

你可能感兴趣的:(架构)