文章目录

  • 简介:
  • 一、工作原理
  • Nginx的模块从结构上分为:
  • Nginx的模块从功能上分为:
  • Nginx模块处理流程:
  • Nginx请求处理流程:
  • Nginx进程模型
  • 二、功能
  • 正向代理
  • 反向代理
  • 负载均衡
  • 自带策略
  • 第三方策略
  • HTTP服务器
  • 三、优点



简介:

Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强。
由俄罗斯的码农lgor Sysover所开发,最初供俄国大型的入口网站及搜寻引擎Rambler使用。其特点是占用内存少,并发能力强(用于解决C10K问题,现在可轻松处理C100K),事实上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的模块从功能上分为:

Core : 核心模块;构建nginx基础服务、管理其他模块。
Handlers: 处理器模块;此类模块直接处理请求,并进行输出内容和修改headers信息等操作。Handlers处理器模块一般只能有一个。
Filters : 过滤器模块;此类模块主要对其他处理器模块输出的内容进行修改操作,最后由Nginx输出。
Proxies : 代理类模块;此类模块是Nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如FastCGI等进行交互,实现服务代理和负载均衡等功能。

Nginx的核心模块:主要负责建立nginx服务模型、管理网络层和应用层协议、以及启动针对特定应用的一系列候选模块。
其他模块负责分配给web服务器的实际工作:
(1) 当Nginx发送文件或者转发请求到其他服务器,由Handlers(处理模块)或Proxies(代理类模块)提供服务;
(2) 当需要Nginx把输出压缩或者在服务端加一些东西,由Filters(过滤模块)提供服务。

Nginx模块处理流程:

1.客户端发送HTTP请求

2.Nginx基于配置文件中的位置选择一个合适的处理模块

3.负载均衡模块选择一台后端服务器 (如果有)

4.处理模块进行处理并把输出缓冲放到第一个过滤模块上

5.第一个过滤模块处理后输出给第二个过滤模块

6.然后第二个过滤模块又到第三个

7.依此类推,最后把响应发给客户端。

nginx 负载均衡返回了upstream地址 nginx负载均衡原理简介_服务器

Nginx请求处理流程:

Nginx在启动时会以daemon形式在后台运行,采用多进程+异步非阻塞IO事件模型来处理各种连接请求。多进程模型包括一个master进程,多个worker进程,一般worker进程个数是根据服务器CPU核数来决定的。master进程负责管理Nginx本身和其他worker进程。

1.操作系统提供的机制(例如 epoll, kqueue 等)产生相关的事件。
2.接收和处理这些事件,如是接收到数据,则产生更高层的 request 对象。
3.处理 request 的 header 和 body。
4.产生响应,并发送回客户端。
5.完成 request 的处理。
6.重新初始化定时器及其他事件。

Nginx进程模型

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

nginx 负载均衡返回了upstream地址 nginx负载均衡原理简介_负载均衡_02

二、功能

Nginx能做: 正向代理 反向代理 负载均衡 HTTP服务器(包含动静分离)
正向代理:针对客户端而言,代理服务器代理客户端,转发请求,并将获得的内容返回给客户端。
反向代理:针对客户端而言,代理服务器就像是原始服务器,代理集群的web节点服务器返回结果。

正向代理

正向代理(Forward Proxy):通常都被简称为代理,就是在用户无法正常访问外部资源,在客户端和原始服务器(origin server)之间的建立服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。

正向代理的工作原理就像一个跳板,比如:我访问不了google.com,但是我能访问一个代理服务器A,A能访问google.com,于是我先连上代理服务器A,告诉他我需要google.com的内容,A就去取回来,然后返回给我。从网站的角度,只在代理服务器来取内容的时候有一次记录,有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站。

nginx 负载均衡返回了upstream地址 nginx负载均衡原理简介_服务器_03

反向代理

反向代理(Reverse Proxy):是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

举个例子,比如我想访问 http://www.roguek.com/frist,但www.roguek.com上并不存在frist页面,于是他是偷偷从另外一台服务器上取回来,然后作为自己的内容返回用户,但用户并不知情。这里所提到的 www.rogue.com 这个域名对应的服务器就设置了反向代理功能。

反向代理服务器对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间中的内容发送普通请求,接着反向代理服务器将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。

nginx 负载均衡返回了upstream地址 nginx负载均衡原理简介_服务器_04

负载均衡

负载均衡也是Nginx常用的一个功能,负载均衡其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。简单而言就是当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。Nginx目前支持自带3种负载均衡策略,还有2种常用的第三方策略。

自带策略

轮询(rr)
按照轮询(默认)方式进行负载,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。虽然这种方式简便、成本低廉。但缺点是:可靠性低和负载分配不均衡。
权重(weight)
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

upstream westos{
	server 172.16.12.101:80  weight=2;
    server 172.16.12.102:80  weight=5;
    server 172.16.12.103:80  weight=3;
}

ip哈希(ip_hash)
上面的2种方式都有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用ip_hash了,ip_hash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
ip_hash: 来自同一个IP的请求会分发到相同的后端服务器。

upstream westos{
	ip_hash;
	server 172.16.12.101:80;
    server 172.16.12.102:80;
    server 172.16.12.103:80;
}

第三方策略

fair
按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream backend{
	fair;
	server 172.16.12.101:80;
    server 172.16.12.102:80;
    server 172.16.12.103:80;
}

url_hash
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。

upstream backend{
	hash $request_uri; 
    hash_method crc32; 
	server 172.16.12.101:80;
    server 172.16.12.102:80;
    server 172.16.12.103:80;
}

HTTP服务器

Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,同时现在也很流行动静分离,就可以通过Nginx来实现,动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路。

三、优点

支持高并发
官方测试Nginx能够支撑5万并发连接,实际生产环境中可以支撑2~4万并发连接数。原因主要是Nginx使用了最新的epoll(Linux2.6内核)和kqueue(freeBSD)网路I/O模型,而Apache使用的是传统的Select模型,其比较稳定的Prefork模式为多进程模式,需要经常派生子进程,所以消耗的CPU等服务器资源,要比Nginx高很多。
内存消耗少
Nginx+PHP(FastCGI)服务器,在3万并发连接下,开启10个Nginx进程消耗150MB内存,5MB10=150MB,开启的64个PHP-CGI进程消耗1280内存,20MB64=1280MB,加上系统自身消耗的内存,总共消耗不到2GB的内存。如果服务器的内存比较小,完全可以只开启25个PHP-CGI进程,这样PHP-CGI消耗的总内存数才500MB。
成本低廉
购买F5BIG-IP、NetScaler等硬件负载均衡交换机,需要十多万到几十万人民币,而Nginx为开源软件,采用的是2-clause BSD-like协议,可以免费试用,并且可用于商业用途。
BSD开源协议是一个给使用者很大自由的协议,协议指出可以自由使用、修改源代码、也可以将修改后的代码作为开源或专用软件再发布。
配置简单
网络和程序一样通俗易懂,即使,非专用系统管理员也能看懂。
支持Rewrite重写
Rewrite:重定向;能够根据域名、URL的不同,将http请求分到不同的后端服务器群组。
内置健康检查
如果NginxProxy后端的某台Web服务器宕机了,不会影响前端的访问。
节省带宽
支持GZIP压缩,可以添加浏览器本地缓存的Header头。
支持热部署
Nginx支持热部署,它的自动特别容易,并且,几乎可以7天*24小时不间断的运行,即使运行数个月也不需要重新启动,还能够在不间断服务的情况下,对软件版本进行升级。