3、Nginx原理解析

Nginx原理解析

1、反向代理

工做流程

  1. 用户经过域名发出访问Web服务器的请求,该域名被DNS服务器解析为反向代理服务器的IP地址;
  2. 反向代理服务器接受用户的请求;
  3. 反向代理服务器在本地缓存中查找请求的内容,找到后直接把内容发送给用户;
  4. 若是本地缓存里没有用户所请求的信息内容,反向代理服务器会代替用户向源服务器请求一样的信息内容,并把信息内容发给用户,若是信息内容是缓存的还会把它保存到缓存中。

优势

  1. 保护了真实的web服务器,保证了web服务器的资源安全

一般的代理服务器,只用于代理内部网络对Internet外部网络的链接请求,客户机必须指定代理服务器,并将原本要直接发送到Web服务器上的http请求发送到代理服务器中。不支持外部网络对内部网络的链接请求,由于内部网络对外部网络是不可见的。当一个代理服务器可以代理外部网络上的主机,访问内部网络时,这种代理服务的方式称为反向代理服务。此时代理服务器对外就表现为一个Web服务器,外部网络就能够简单把它看成一个标准的Web服务器而不须要特定的配置。不一样之处在于,这个服务器没有保存任何网页的真实数据,全部的静态网页或者CGI程序,都保存在内部的Web服务器上。所以对反向代理服务器的攻击并不会使得网页信息遭到破坏,这样就加强了Web服务器的安全性。nginx

  1. 节约了有限的IP地址资源

企业内全部的网站共享一个在internet中注册的IP地址,这些服务器分配私有地址,采用虚拟主机的方式对外提供服务。web

  1. 减小WEB服务器压力,提升响应速度

反向代理就是一般所说的web服务器加速,它是一种经过在繁忙的web服务器和外部网络之间增长一个高速的web缓冲服务器来下降实际的web服务器的负载的一种技术。反向代理是针对web服务器提升加速功能,做为代理缓存,它并非针对浏览器用户,而针对一台或多台特定的web服务器,它能够代理外部网络对内部网络的访问请求。后端

反向代理服务器会强制将外部网络对要代理的服务器的访问通过它,这样反向代理服务器负责接收客户端的请求,而后到源服务器上获取内容,把内容返回给用户,并把内容保存到本地,以便往后再收到一样的信息请求时,它会把本地缓存里的内容直接发给用户,以减小后端web服务器的压力,提升响应速度。所以Nginx还具备缓存功能。数组

2、Nginx工做原理

Nginx由内核和模块组成。浏览器

  Nginx自己作的工做实际不多,当它接到一个HTTP请求时,它仅仅是经过查找配置文件将这次请求映射到一个location block,而此location中所配置的各个指令则会启动不一样的模块去完成工做,所以模块能够看作Nginx真正的劳动工做者。一般一个location中的指令会涉及一个handler模块和多个filter模块(固然,多个location能够复用同一个模块)。handler模块负责处理请求,完成响应内容的生成,而filter模块对响应内容进行处理。缓存

用户根据本身的须要开发的模块都属于第三方模块。正是有了这么多模块的支撑,Nginx的功能才会如此强大。安全

Nginx的模块从结构上分为核心模块、基础模块和第三方模块:服务器

  • 核心模块:HTTP模块、EVENT模块和MAIL模块
  • 基础模块:HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块,
  • 第三方模块:HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块。

Nginx的模块从功能上分为以下三类:网络

  • Handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改headers信息等操做。Handlers处理器模块通常只能有一个。
  • Filters (过滤器模块)。此类模块主要对其余处理器模块输出的内容进行修改操做,最后由Nginx输出。
  • Proxies (代理类模块)。此类模块是Nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务好比FastCGI等进行交互,实现服务代理和负载均衡等功能。

3、Nginx进程模型

Nginx默认采用多进程工做方式,Nginx启动后,会运行一个master进程和多个worker进程。其中master充当整个进程组与用户的交互接口,同时对进程进行监护,管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。worker用来处理基本的网络事件,worker之间是平等的,他们共同竞争来处理来自客户端的请求。并发

nginx的进程模型如图所示:

img

在建立master进程时,先创建须要监听的socket(listenfd),而后从master进程中fork()出多个worker进程,如此一来每一个worker进程多能够监听用户请求的socket。通常来讲,当一个链接进来后,全部在Worker都会收到通知,可是只有一个进程能够接受这个链接请求,其它的都失败,这是所谓的惊群现象。nginx提供了一个accept_mutex(互斥锁),有了这把锁以后,同一时刻,就只会有一个进程在accpet链接,这样就不会有惊群问题了。

先打开accept_mutex选项,只有得到了accept_mutex的进程才会去添加accept事件。nginx使用一个叫ngx_accept_disabled的变量来控制是否去竞争accept_mutex锁。ngx_accept_disabled = nginx单进程的全部链接总数 / 8 -空闲链接数量,当ngx_accept_disabled大于0时,不会去尝试获取accept_mutex锁,ngx_accept_disable越大,因而让出的机会就越多,这样其它进程获取锁的机会也就越大。不去accept,每一个worker进程的链接数就控制下来了,其它进程的链接池就会获得利用,这样,nginx就控制了多进程间链接的平衡。

每一个worker进程都有一个独立的链接池,链接池的大小是worker_connections。这里的链接池里面保存的其实不是真实的链接,它只是一个worker_connections大小的一个ngx_connection_t结构的数组。而且,nginx会经过一个链表free_connections来保存全部的空闲ngx_connection_t,每次获取一个链接时,就从空闲链接链表中获取一个,用完后,再放回空闲链接链表里面。一个nginx能创建的最大链接数,应该是worker_connections * worker_processes。固然,这里说的是最大链接数,对于HTTP请求本地资源来讲,可以支持的最大并发数量是worker_connections * worker_processes,而若是是HTTP做为反向代理来讲,最大并发数量应该是worker_connections * worker_processes/2。由于做为反向代理服务器,每一个并发会创建与客户端的链接和与后端服务的链接,会占用两个链接。

相关文章
相关标签/搜索