一文初步认识Nginx(原理与实践)


本文章是本人在学习Nginx过程中,参考很多资料汇总而成的学习笔记,参考资料如下:《Nginx高性能Web服务器详解》,《跟老男孩学Linux运维-web集群篇》,尚硅谷的Linux运维视频。如有侵权请联系本人删除


目录

第一部分:理论篇

一.Nginx基本介绍
二.Nginx的功能特性
三.Nginx服务器架构探索

第二部分:实践篇

一.Nginx服务器的基础配置
二.Nginx服务器的Rewrite功能
三.Nginx服务器的反向代理和负载均衡功能
四.Nginx服务器的服务优化


第一部分

一.Nginx基本介绍

Nginx是一款高性能的Web服务器软件,除此之外,他还可以充当邮件服务器,代理服务器,缓存服务器,依托于他的架构和实现方式,其特点是占用内存少,并发能力强

二.Nginx的功能特性

我们可以将Nginx的服务基本大体规划为以下三个部分,分别是基本HTTP服务,高级HTTP服务,邮件服务

(1)Nginx提供基本HTTP服务,可以作为HTTP代理服务器和反向代理服务,支持通过缓存加速访问,可以完成简单的负载均衡和容错,支持包过滤功能,支持SSL等
(2)Nginx提供高级HTTP服务,可以进行自定义配置,支持虚拟主机,支持URL重定向,支持网络监控,支持流媒体传输等
(3)Nginx作为邮件代理服务器,支持IMAP/POP3代理服务功能,支持内部SMTP代理服务功能

1.基本HTTP服务
·处理静态文件(如HTML静态网页的请求)
·打开并自行管理文件描述符(FD,File Descriptor,内核用文件描述符来对打开文件进行操作,详情见Linux中的文件描述符
·提供反向代理服务,并且可以使用缓存加速反向代理,同时完成简单负载均衡以及容错
·提供远程FastCGI服务的缓存机制,加速访问,同时完成简单的负载均衡以及容错
·使用Nginx的模块化特性提供过滤器功能,Nginx基本过滤器包括gzip压缩,ranges支持等
·支持HTTP下的安全套接层安全协议SSL

2.高级HTTP服务
·支持基于域名和IP的虚拟主机设置
·支持重新加载配置以及在线升级,无须中断正在处理的请求
·自定义访问日志格式
·提供3xx~5xx错误代码的重定向功能
·支持重写(Rewrite)模块扩展
·支持FLV流和MP4流传播
·支持网络监控,包括基于客户端IP地址和HTTP基本认证机制的访问控制,速度限制,来自同一地址的同时连接数或请求限制等
·支持嵌入Perl语言
3.邮件代理服务
·支持使用外部HTTP认证服务器重定向用户到IMAP/POP3后端,并支持IMAP认证和POP3认证方式
·支持使用外部HTTP认证服务器认证用户重定向连接到内部SMTP后端,并支持SMTP认证方式
·支持邮件代理服务下的安全套接层安全协议SSL

常用的主要功能
1.HTTP代理和反代理
代理服务和反向代理服务是Nginx服务的主要功能之一,尤其是反向代理服务,是应用非常广泛的功能。它可以根据正则表达式来配置转发策略,并可以探测到后端的服务器状态,如果服务器状态出现了问题,那么还会将用户请求再转发到另一台主机。与HTTP反向代理常常搭配使用的就是Nginx另一个非常重要的功能,负载均衡!

2.负载均衡
负载均衡,一般包含两方面的含义,一方面是将同一任务分成若干个小任务,并分配给不同的服务器,这类负载均衡集群一般称为高性能计算集群。另一类是,将很多相同的多个任务,分配给不同的网络节点,从而实现高并发,并减少用户的前端响应时间。我们在这里所说的Nginx的负载均衡指的就是后者。其主要实现的功能是高并发(访问和流量分流)和缩短用户请求的响应时间
关于负载均衡的策略,可以阅读笔者的其他相关博客

3.Web缓存
关于缓存,相信大家第一时间想到的都是Squid,他是在Web领域一款相当流行的开源代理服务器和Web缓存服务器。作为网页服务器的前端缓存服务器,在很多站点中,它被用以缓存前端请求,从而提高Web服务器的性能,除此之外,它还可以缓存域名系统等。
Nginx在0.7.48版本开始,也支持了类似Squid的缓存功能。Nginx服务器的WEB缓存服务主要由Proxy_Cache相关指令集和FastCGI_Cache相关之指令集构成(后续会提到)。其中Proxy_Cache主要用于在Nginx服务器提供反向代理服务时,对后端服务器的返回内容进行URL缓存(静态页面);FastCGI_Cache主要用于对FastCGI的动态程序(动态页面)进行缓存。此外还有用于清除Nginx服务器上的URL缓存的ngx_cache_purge第三方模块
Nginx服务器对多核CPU的调度要传统的Squid性能要好,而在反向代理,负载均衡等其他方面,Nginx也不逊于Squid,这使得Nginx完全可以同时充当缓存服务器和负载均衡服务器

三.Nginx服务器架构探索

一.Nginx的模块化结构
简单讲,Nginx的各个功能都是由不同的功能模块来实现的。模块化在当下很多的架构中都非常的常见,无论是程序的设计,还是架构的开发!模块化可以很好的完成整个系统的分工和调度

在Ngxin中,我们习惯的将Nginx分为五个模块。分别是:核心模块,标准HTTP模块,可选HTTP模块,邮件服务模块以及第三方模块五大类

(1)核心模块:提供了Nginx最基本的核心服务,进程管理,权限控制,错误日志记录等

(2)标准HTTP模块:提供Nginx的标准HTTP功能

(3)可选HTTP模块:用于扩展标准的HTTP功能,使其能够处理一些特殊的HTTP请求

(4)邮件服务模块:主要用于支持Nginx的邮件服务

(5)第三方模块:为了扩展Nginx服务器应用,完成特殊功能而由第三方机构或者个人编写的可以编译到Nginx中的模块

核心模块和标准的HTTP模块,在编译之后,就包含在Nginx中了

二.Nginx服务器的Web请求处理机制
一般Web服务器的服务架构是一对多的模式,Web服务器必须有能力同时为多个客户提供服务(应答客户提出的请求),这就要求web服务器要有一个机制来应对客户的Web请求。一般的,完成并行处理请求工作有三种方式可供选择:多进程方式,多线程方式,异步方式

1.多进程方式
多进程方式是指,服务器每当收到来自用户的请求后,就为其创建一个单独的子进程来和用户进行交互,直到连接断开,该子进程就结束了

多进程优点:实现方式简单,各个进程间隔离性较好,不会因为某个进程出现问题而影响到其他进程。比较稳定

多进程缺点:消耗的系统资源比较多,因为系统生成一个子进程需要内存的复制等操作,在资源和时间上都会产生一定的额外开销,因此在接收高并发量的请求时,就会对系统造成压力,导致系统性能的下降

早期Apache就采用这种的处理方式(后续Apache推出了多进程和多线程结合的处理方式,在笔者的关于Apache的博客中会进行介绍),应对高并发量的问题他会预先创建多个进程,这样当请求来到时就会直接给他分配已经预创建好的进程,而不是等请求来到了再创建进程,这样在一定程度上缓解了高并发的问题,但当并发量到达一定量时,多线程的处理方式的弊端还是会暴露出来

2.多线程方式
多线程的方式和多线程类似,它是指,服务器每当接受到一个客户端时,会由服务器主进程派生出一个线程来和该客户交互
优点:派生一个线程的开销要远远小于派生一个进程
缺点:由于多线程共同使用同一进程下的资源,当某一线程出现问题时,整个进程就会出现问题,即多线程的稳定性会差一点

3.异步方式
异步方式和多进程方式及多线程方式是完全不同的一种处理客户端请求的方式
首先我们先看一下同步,异步,堵塞,非堵塞的概念

同步和异步是描述网络中通信模式的概念
(1)同步:进行交互的双方步调必须一致,即发送方发送数据A给接收方后,必须收到来自接收方对数据A的确认之后,才会再发送数据B
(2)异步:进行交互的双方步调不是必须一致,即发送方发送数据A给接收方后,不必收到接收方对数据A的确认即可发送数据B

可见异步通信的效率要高于同步通信,因为异步通信的发送方端不需要等待确认之后再发送后续数据

阻塞和非阻塞用来描述进程处理调用的方式,在网络通信中主要指网络套接字Socket的阻塞和非阻塞方式,而Socket的实质也就是I/O操作
(3)Socket阻塞调用方式:调用结果返回之前,当前线程从运行状态被挂起(挂起,这个线程就没法用了),一直到调用结果返回之后,才进入就绪状态,获取CPU后进入执行态执行
(4)Socket非阻塞调用方式:如果调用结果不能马上返回,当前线程也不会挂起,而是立即返回执行下一个调用

什么是阻塞:就是线程在执行IO操作获取数据时,这个IO可能会需要一定的时间才能等到数据返回,然后才能接着执行下面的命令。那么,此时,这个线程的等待状态我们就把它称为阻塞。没有充分利用起cpu的资源。
什么是非阻塞:还是这个线程在进行 IO操作时,无需等待数据的返回,可以接着往下执行代码命令。cpu资源一直在充分利用。

下面将列举同步阻塞,同步非阻塞,异步阻塞,异步非阻塞的例子
同步与异步可看作是端到端,用户到服务器的交互,阻塞和非阻塞则是服务器端的行为
(1)同步阻塞:
顾客来前台结账,顾客(发送方)向收银员(接收方)付款(发送请求),付款之后,顾客什么都不能做,只能等待找零(同步),收银员操作机器让机器找零(I/O操作),此时收银员什么都无法干(阻塞),只能等待机器将零钱取出(I/O完成),再将零钱找给顾客(对请求的应答)

发送方发送请求后,什么也不能干必须等待接收方返回的结果,接受方根据请求方的要求进行调用,在等待调用返回的过程中,接收方也什么都不能做,只有等到调用结束,接收方获得调用结果,再将调用结果返回给发送方

(2)同步非阻塞:
发送方发送请求后,什么也不能干,必须等待接收方作出应答,接受方根据请求方的要求进行调用,如果无法立马得到调用结果,就立即返回,去做其他事情,一直等到I/O操作结束之后,接收方获得调用结果,再将调用结果返回给发送方
实际中不适用这种方式

(3)异步阻塞:
发送方发送请求后,不等待接收方的返回结果,可以去做其他事,接受方根据请求方的要求进行调用,在此期间接收方也什么都不能做,只有等到调用结束,接收方获得调用结果,再将调用结果返回给发送方
实际中不适用这种方式

(4)异步非阻塞
顾客来前台结账,顾客(发送方)向收银员(接收方)付款(发送请求),付款之后,顾客可以立马做其他事情比如打电话(异步),收银员操作机器让机器找零(I/O操作),此时收银员可以干一些其他的事(用户的其他要求,或者其他用户的请求)比如将物品打包(非阻塞),机器将零钱取出(I/O完成)后再将零钱找给顾客(对请求的应答)

发送方发送请求后,不等待接收方的返回结果,可以去做其他事,接受方根据请求方的要求进行调用,在等到结果返回的期间接收方可以处理其他请求,调用结束,接收方获得调用结果,再将调用结果返回给发送方

这种方式是四种方式中发送方和通信方通信效率最高的一种方式

4.Nginx服务器处理请求的方式
Nginx服务器的一个显著优势是能够同时处理大量并发请求。他结合多进程机制和异步机制对外提供服务。异步机制使用的是异步非阻塞方式

Nginx启动后,可以产生一个主进程(master process)和多个工作进程(work process),其中可以在配置文件中指定产生的工作进程数量,Nginx服务器的所有工作进程都用于接收和处理客户端的请求。这类似于Apache使用的改进的多进程机制,预先生成多个工作进程

每个工作进程使用了异步非阻塞方式,可以处理多个客户端请求。当某个工作进程收到客户端的请求后,调用I/O进行处理,如果不能立即得到结果,就去处理其他的请求,而客户端在此期间也无需等待响应,可以处理其他的事情,当I/O调用返回结果时,就会通知此工作进程;该进程得到通知,暂时挂起当前处理的事务,去对客户端的请求作出回应

客户端请求数量增长,网络负载繁重时,Nginx服务器使用多进程能够保证不增长对系统资源的压力,同时使用异步非阻塞的方式减少了工作进程在I/O调用上的阻塞延迟,保证了不降低对请求的处理能力

5.Nginx服务器的事件处理机制
在上文中我们讨论了Nginx如何处理客户的请求,在最后一步,当I/O操作完成之后,Nginx要将处理结果返回给用户。其实这里是存在一个问题的,Nginx怎么才知道I/O操作以及完成了呢!即I/O调用如何把自己的状态通知给其他工作进程呢?

这个过程实际就关系到事件处理机制

其实有两种方式可以获取IO执行的状态
第一种,进程定时的去查询I/O的运行状态,如果有完成了的I/O操作就去响应客户端,如果没有,就继续现在的工作

第二种,I/O调用在完成后能主动通知工作进程

第一种方式,虽然在查询的过程中,工作进程还在做其他的事情(没有等待I/O结束),但是查询的这个过程也会造成性能的损失,所以第二种方式的性能是比较好的

具体来说,select/poll/epoll/kqueue这些系统调用,也常被称为事件驱动模型,他们提供了一种机制,让进程可以同时处理多个并发请求,不用关心I/O调用的具体状态,I/O调用完全由事件驱动模型来管理,事件准备好之后,就通知工作进程事件已经准备就绪

三.Nginx服务器的事件驱动模型(I/O,查看I/O状态,并返回给进程信息)

1.事件驱动模型的组成
事件驱动模型包含以下三个部分
(1)事件收集器:负责收集所有的事件,包括来自用户的(单机鼠标,键盘输入等),来自硬件的(时钟事件等),和来自软件的(操作系统,应用程序本身)
(2)事件发送器:负责将收集器收集到的信息发送给目标对象中,目标对象就是事件处理器所在的地方
(3)事件处理器:事件处理器主要负责具体事件的响应工作

2.Nginx中的事件驱动模型
Nginx服务器响应和处理Web请求的过程,就是基于事件驱动模型的,他也包含事件收集器,事件发送器,和事件处理器这三个部分。
下面我们着重介绍以下事件处理器
当我们在编写服务器处理模型的程序时,基于事件驱动模型,“目标对象”中的事件处理器可以有以下几种实现办法:
(1)“事件发送器”每传递过来一个请求,“目标对象”就创建一个新的进程,调用“事件处理器”来处理该请求
(2)“事件发送器”每传递过来一个请求,“目标对象”就创建一个新的线程,调用“事件处理器”来处理该请求
(3)“事件发送器”每传递过来一次请求,“目标对象”就将其放入一个特定的待处理事件列表,使用非阻塞I/O方式调用“事件处理器”来处理该请求

可以简单的做以下理解
Nginx中的事件收集器是master主进程(收集来自外部的请求,再转发给work-process进程),事件发送器是work-process进程(请求由work-process具体处理,再交给后端的事件处理器做具体的响应),事件处理器就是具体处理用户请求的部件

上述三种方法,第一种性能比较差。第二种实现比较复杂,稳定性不好。大多数网络服务都采取了第三种方式,逐渐形成了”事件驱动处理库“

事件驱动处理库又被称为多路I/O复用方法,其中最常见的包括以下三种,select模型,poll模型,epoll模型

可以简单理解为:
创建待处理事件列表,交由内核,或者由进程定时遍历列表,或者由内核来监控列表

select库
使用select库的步骤一般是:
首先,创建所关注事件(I/O操作的具体文件)的描述符集合。对于一个描述符,可以关注其上面的读(read)事件,写(write)事件以及异常发生(Exception)事件,所以要创建三类事件描述符集合,分别用来收集读事件的描述符,写事件的描述符,和异常事件的描述符
其次调用底层的select()函数,等待事件发生。然后轮询所有事件描述符集合种的每一个事件描述符,检查是否有相应的事件发生,如果有就进行处理

为每个I/O请求创建描述符集合,包含三种类型,然后定时遍历这些集合,一旦有I/O的完成就将调用结果返回给work-process进程

poll库
poll与select的基本工作方式是相同的,都是先创建一个关注事件的描述符集合,再去等待这些事件发生,然后再轮询描述符集合,检查有没有事件发生,如果有就处理,没有就不处理

poll库与select的主要区别在于,select库需要为读事件,写事件,异常事件分别创建一个描述符集合,因此在最后轮询的时候,需要分别轮询这三个集合,而poll库只需要创建一个集合,在每个描述符对应的结构上分别设置读事件,写事件或者异常事件,最后轮询的时候可以同时检查这三种事件是否发生,可以说,poll库是select库的优化实现

epoll库
epoll库是Nginx服务器支持的高性能事件驱动库之一,epoll库的效率非常的高

select库,polo库的处理方式都是创建一个待处理事件列表,然后把这个列表发给内核,返回的时候,再去轮询检查这个列表,以判断事件是否发生。这样当描述符较多的时候效率就显的非常低下了

一种比较好的做法是,把描述符列表的管理交给内核负责,一旦有某种事情发生,内核把发生事件的描述符列表通知给进程,这样就避免了轮询整个描述符列表,epoll库就是这样的一种模型

首先epoll库通过相关调用通知内核创建一个具有N个描述符的事件列表,然后,给这些描述符设置所关注的事件,并把它添加到内核的事件列表中去,在具体的编码过程中,也可以通过相关调用对事件列表中的描述符进行修改和删除

完成设置之后,epoll库就开始等待内核通知事件发生了,某一事件发生后,内核将发生事件的描述符列表上报给epoll库。得到事件列表的epoll库,就可以进行事件处理了

epoll库在Linux平台上是高效的,它支持一个进程打开大数目的事件描述符,上限是系统可以打开文件的最大数目,同时epoll库的I/O效率不随描述符数目增加而线性下降,因为它只会对内核上报的“活跃”的描述符进行操作

四.Nginx服务器架构
一.Nginx服务器架构

Nginx服务器启动后,产生一个主进程(master process),主进程执行一系列工作后产生一个或多个工作进程(work process)。主进程主要进行Nginx配置文件的解析,数据结构初始化,模块配置和注册,信号处理,网络监听生成,工作进程生成和管理等工作

工作进程主要进行进程初始化,模块调用和请求处理等工作,是Nginx服务器提供服务的主题

在客户端请求动态站点的过程中,Nginx服务器还涉及和后端服务器的通信。Nginx服务器将接收到的Web请求通过代理转发到后端服务器,由后端服务器进行数据处理和页面组织,然后将结果返回

另外,Nginx服务器为了提高对请求的响应效率,进一步降低网络压力,采用了缓存机制,将历史应答数据缓存到本地。在每次Nginx服务器启动后的一段时间内,会启动专门的进程对本地缓存内容重建索引,保证对缓存文件的快速访问

根据上面的分析,我们可以将Nginx服务器的结构大致分为主进程,工作进程,后端服务器和缓存等部分
在这里插入图片描述
二.Nginx服务器的进程
Nginx服务器的三大类进程:主进程,工作进程,用于为缓存文件建立索引的进程
1.主进程(master process)
Nginx服务器启动时运行的主要进程。他的主要功能是与外界通信和对内部其他进程进行管理
(1)读取Nginx配置文件并验证其有效性和正确性
(2)建立,绑定,和关闭socket
(3)按照配置生成,管理和结束工作进程
(4)接收外界指令,比如重启,升级以及退出服务器等指令
(5)不中断服务,实现平滑重启,应用新配置
(6)不中断服务,实现平滑升级,升级失败进行回滚处理
(7)开启日志文件,获取文件描述符
(8)编译和处理Perl脚本
2.工作进程(work process)
由主进程生成,生成数量可以通过Nginx配置文件指定
(1)接收客户端请求
(2)将请求依次送入各个功能模块进行过滤处理
(3)I/O调用,获取响应数据
(4)与后端服务器通信,接收后端服务器处理结果
(5)数据缓存,访问缓存索引,查询和调用缓存数据
(6)发送请求结果,响应客户端请求
(7)接受主程序指令,比如重启,升级和退出等指令

3.缓存索引重建及管理进程(Cache Loader&Cache Manager)
Cache模块主要有缓存索引重建(Cache Loader)和缓存索引管理(Cache Manager)两类进程完成工作
缓存索引重建进程是在Nginx服务启动一段时间之后(默认是一分钟)由主进程生成,在缓存源数据重建完成之后就自动退出
缓存索引管理进程一般存在于主进程的整个生命周期,负责对缓存索引进行管理

第二部分


以下操作均在Centos7的系统上完成!

Nginx服务器的基础配置

一.Nginx服务的启停控制
1.在Nginx服务的启停办法中,有一类时通过信号机制来实现的,通过不同的信号可以传达给Nginx不同的讯号,Nginx根据信号进行后续的一些操作

先介绍一下Nginx服务可以接受的信号

信号 作用
TERM或INT 快速停止Nginx服务
QUIT 平缓停止Nginx服务
HUP 使用新的配置文件启动进程,之后平缓停止原有进程,即平滑重启
USR1 重新打开日志文件,常用于日志切割
USR2 使用新版本的Nginx文件启动服务,之后平缓停止原有Nginx进程,也就是所谓的“平滑升级”
WINCH 平缓停止worker process,用于Nginx服务器平滑升级

使用方法:

kill [信号] [PID]
kill -HUP 24031    ####nginx的PID

二.Nginx服务的配置文件
Nginx配置文件可以看作五个块组成,下面我们来分别介绍一下这四个块
1.全局块
全局块时默认配置文件从开始到events块之间的一部分内容,主要设置一些影响Nginx服务器整体运行的配置指令,因此指令的作用域就是Nginx服务器全局
通常包括了运行Nginx服务器的用户,运行生成的worker process数,Nginx进程PID,存放路径,日志的存放路径和类型以及配置文件的引入等
2.events块
events块涉及的指令主要影响Nginx服务器与用户的网络连接,常用到的设置包括是否开启多work process下的网络连接进行序列化,是否允许同时接受多个网络连接,选取哪种事件驱动模型处理连接请求,每个work process可以同时支持的最大连接数量
3.http块
http块时Nginx服务器配置中的重要部分,代理,缓存和日志定义等绝大多数的功能和第三方模块的配置都可以放在这个模块上。HTTP模块中有server块,http块也有自己的全局块
4.server块
server块用来实现虚拟主机,每个http块,可以包含多个server块,即一个http块中可以有多个虚拟主机,server块中可以同时包含location块,在server全局块中,最常见的两个配置是本虚拟主机的监听配置和本虚拟主机的名称或IP配置
5.location块
每个server块中可以包含多个location块。从严格意义上讲,location其实是server块的一个指令,location块的主要作用是,基于Nginx服务器接收到的请求字符串,对除虚拟主机名称之外的字符串进行匹配,对特定的请求进行处理。地址定向,数据缓存和应答控制等功能都是在location模块提供的

###全局块
user nginx;                              ####用于配置运行Nginx服务器用户
worker_processes auto;                   ####开启的work process进程数量
error_log /var/log/nginx/error.log;      ####错误日志的存放
pid /run/nginx.pid;                      ####PID存放路径
include /usr/share/nginx/modules/*.conf; ####引入的配置文件    

###event块
events {
    worker_connections 1024;            ###配置一个workprocess进程可以连接的用户的数量
    accept_mutex on     ###设置网络连接的序列化,开启之后,将会对多个Nginx进程接受连接进行序列化,方式多个进程对连接的争抢”惊群“
}

###http块
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
                                                 ##日志格式
    access_log  /var/log/nginx/access.log  main; ##日志存放位置

    sendfile            on;    ###发送数据量的大小
    tcp_nopush          on;    ###
    tcp_nodelay         on;
    keepalive_timeout   65;    ###连接超时事件
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    include /etc/nginx/conf.d/*.conf;
  ###server块
    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;          ###虚拟主机,可以是基于域名,也可以是基于IP
                                 ###基于IP的话,需要在接口上设置IP别名
        root         /usr/share/nginx/html;
                                 ###根目录,当访问到这个站点时的第一个page
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;  ###网站错误页面的设置
            location = /40x.html {
        }       ###如果是404错误,就重定向到40x.html这个界面

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }


}

Nginx服务器的Rewrite功能

Rewrite功能是大多数Web服务器支持的一项功能,其在提供重定向服务时起到主要作用,Nginx服务器的Rewrite功能是比较完善的,并且在配置上灵活自由,定制性非常高

一.Rewrite功能的配置
Rewrite是Nginx提供的一个重要的基本功能,其在Web服务器产品中几乎是必备的功能,用于实现URL的重写。URL重写是非常有用的功能,比如它可以让我们网站结构改变之后,将原来的URL,定向到新的URL,使得用户不必更改书签,就可以访问到原来的内容

Nginx服务器的Rewrite功能的实现依赖于PCRE的支持

1.if指令
该指令用来支持条件判断,并根据条件判断选择不同的Nginx配置,可以在Server块或location块中配置该命令,语法结构

if (condition) {    #花括号代表一个作用域,形成一个if配置块,是条件为真时的Nginx配置
    ...
    ... }

2.rewrite
该指令通过正则表达式的使用来改变URL,可以同时存在一个或者多个指令,按照顺序依次对URL进行匹配和处理

server {
 listen 80 ;
 server_name www.fuxiangyu.com;
 rewrite ^/ http://www.myweb.inof/;    ###如果要访问www.fuxiangyu.com这个网页。将
                                       ###会被定向到http://www.myweb.inof/
                                       ###有关正则表达式的问题,大家自行学习
server {
 listen 80 ;
 server_name www.fuxiangyu.com;
 if ($host ~ myweb\.info)   ###如果()内为真,则执行下面的语句
 {
   rewrite ^(.*) http://www.baidu.com;
 }
 

Nginx服务器的反向代理服务和负载均衡

一.Nginx的负载均衡简述
严格来说,Nginx仅仅是作为反向代理使用的,因为反向代理的功能可以表现出负载均衡的效果,所以常说Nginx可以实现负载均衡。
与传统的负载均衡不同,传统的负载均衡,比如LVS,他本质是将包进行转发,即整个过程其实就只有客户端和真实服务器建立连接,而Nginx不同,Nginx是接收到包后,打开包查看包中的信息,然后先自己与客户端建立连接,然后Nginx再去请求后端服务器,这一过程其实是建立了两个连接(一是客户端与Nginx代理服务器之间建立一个连接,另一个是Nginx代理服务器和后端的真实服务器建立连接)

二.Nginx实现负载均衡组件的说明

Nginx http模块 模块说明
ngx_http_proxy_moudle nginx代理模块,用于把请求后抛给服务器节点或upstream服务器池
ngx_http_upstream_moudle 负载均衡模块,可以实现网站的负载均衡功能及节点的健康检查

三.Nginx负载均衡核心介绍-----Upstream
1.Nginx的upstream模块
ngx_http_upstream_moudle模块允许Nginx定义一组或多组节点服务器组,使用时可以通过proxy_pass代理方式把网站的请求发送到事先定义好的对应Upstream组的名字上,具体写法为“proxy_pass http://www.server_pools”,其中www_server_pools就是一个Upstream节点服务器组的名字
2.Nginx的upstream模块的配置案例

upstream server_pool { ###创建了一个集群,叫做server_pool
 server 192.168.10.10 max_fails=3,weight=10; #设置失败次数,和权重
 #ip_hash   #开启hash,ip_hash不可以与权重同时存在
 keepalive 100;   #允许集群同时建立的连接数为100
 }

3.upstream模块中server标签参数说明

upstream模块内参数 参数说明
server < ip address>< port > 负载均衡后面的RS配置,可以是IP地址+端口,也可以是域名+端口(高并发场景下,可以使用域名,然后通过DNS做负载均衡)
weight=< value > 服务器权重,权重越大,被访问的几率越大
max_fails Nginx尝试连接后端主机失败的次数,这个数值配合proxy_next_upstream,fastcgi_next_upstream和memcached_next_upstream这三个参数来使用,当Nginx接收后端服务器返回这三个参数定义的状态码时,会将请求发送给正常的后端服务器
backup 热备配置。即配置了该参数的服务器,作热备份机,如果主服务器宕机了,那么备份机就会立即启用。注:如果调度算法是ip_hash的话,后端服务器在负载均衡中的调度不可以是weight和backup
fail_timeout 在max_fails次数到数之后,每隔这个时间间隔就重新询问一下,服务器是否恢复正常,如果没有恢复正常,就再等待这个时间之后再进行询问
down 标志着该服务器不可使用,这个参数可以配合ip_hash使用

4.upstream模块调度算法
调度算法一般分为两类
·第一类为静态调度算法,即负载均衡服务器按照本地设置的规则进行分配,不需要考虑后续服务器的状态,如rr,wrr,ip_hash等都属于静态调度算法
·第二类为动态调度算法,即负载均衡服务器会根据后端节点的状态来决定是否分配请求。例如,连接数少的优先获得请求,相应时间短的优先获得请求,如least_conn,fair等都属于常见的动态调度算法

下面介绍几种常见的调度算法
1.rr(轮询算法,静态)
按客户端请求顺序把客户端的请求,逐一分配到不同的后端服务器
2.wrr(加权轮询,静态)
在rr算法的基础上,加上了权重,即为权重轮询算法,当使用该算法时,权重和用户访问成正比,即权重越大的,分担的访问压力就越大
3.ip_hash(针对IP的哈希,静态)
每个请求按客户端的IP哈希结果进行分配,当新的请求到达时,先将客户端IP通过哈希算法得出来一个值,在随后的客户端请求中,客户IP的哈希值只要相同,就会分配至同一台服务器,这样的调度算法可以解决动态网页的session问题,但有时会导致请求分配不均,即无法保证1:1的负载均衡
4.fair(响应时间,动态)
此算法会根据后端节点服务器的响应时间来分配请求,响应时间短的优先分配,此算法可以根据页面大小和加载时间长短来智能地进行负载均衡,也就是根据后端的响应时间,响应时间短的优先被分配,nginx本身不支持这个算法,如果想使用,需要下载有关模块upstream_fair
5.least_conn(最少连接,动态)
根据后端节点的连接数来决定是否分配情况,哪个机器连接数少就进行分发
6.url_hash(针对URL的哈希,动态)
与ip_hash类似,这个算法是根据URL进行哈希,当后端服务器为缓存服务器时,有非常好的效果,可以提高缓存的命中率,Nginx本身不支持这种算法,需要下载对应的hash模块包
7.一致性hash(动态)
一致性hash算法一般用于代理后端业务为缓存服务(如squid,Memcached)的场景,通过将用户请求的URI或者指定字符串进行计算,然后调度到后端的服务器中,此后任何用户查找同一个URI或者指定字符串都会被调度到这一台服务器上,因此后端的每个节点的缓存内容都是不同的。一致性hash算法可以实现后端某个或某几个节点宕机后,缓存的数据动荡最小

三.Nginx负载均衡核心介绍-----http_proxy——moudle模块
1.proxy_pass指令
http_proxy——moudle模块可以将请求转发到另一台服务器上,在实际的反向代理工作中,会通过location功能匹配指定的URI,然后把接收到的符合匹配URI的请求通过proxy_pass抛给定义好的upstream节点池

location /name/{
   proxy_pass http://127.0.0.1/remote/;
   }
   ###上述语句的意思是将匹配URI为name的请求抛给http://127.0.0.1/remote/

2.http proxy模块参数
Nginx的代理功能是通过http proxy模块来实现的,此处详细介绍了http_proxy参数

有关反向代理和负载均衡的具体实现请查看笔者相关博客!!!!!

企业级Nginx Web服务优化

笔者整理的企业级NginxWeb服务优化涉及以下方面
一.Nginx的基本安全优化
二.Nginx服务性能优化
三.Nginx日志相关的优化
四.Nginx的访问控制优化

详细的讲解请查看笔者的其他博客!!!
企业级Nginx Web服务优化

发布了24 篇原创文章 · 获赞 10 · 访问量 2368

猜你喜欢

转载自blog.csdn.net/flat0809/article/details/103095024