欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

三、Nginx原理解析

程序员文章站 2024-02-05 15:37:22
Nginx原理解析 一、反向代理 工作流程 1. 用户通过域名发出访问Web服务器的请求,该域名被DNS服务器解析为反向代理服务器的IP地址; 2. 反向代理服务器接受用户的请求; 3. 反向代理服务器在本地缓存中查找请求的内容,找到后直接把内容发送给用户; 4. 如果本地缓存里没有用户所请求的信息 ......

nginx原理解析

一、反向代理

工作流程

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

优点

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

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

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

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

  1. 减少web服务器压力,提高响应速度

反向代理就是通常所说的web服务器加速,它是一种通过在繁忙的web服务器和外部网络之间增加一个高速的web缓冲服务器来降低实际的web服务器的负载的一种技术。反向代理是针对web服务器提高加速功能,作为代理缓存,它并不是针对浏览器用户,而针对一台或多台特定的web服务器,它可以代理外部网络对内部网络的访问请求。

反向代理服务器会强制将外部网络对要代理的服务器的访问经过它,这样反向代理服务器负责接收客户端的请求,然后到源服务器上获取内容,把内容返回给用户,并把内容保存到本地,以便日后再收到同样的信息请求时,它会把本地缓存里的内容直接发给用户,以减少后端web服务器的压力,提高响应速度。因此nginx还具有缓存功能。

二、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等进行交互,实现服务代理和负载均衡等功能。

三、nginx进程模型

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

nginx的进程模型如图所示:

三、Nginx原理解析

在创建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。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。