Nginx代理功能详解,第1张

Nginx的代理功能与负载均衡功能是最常被用到的,关于nginx的基本语法常识与配置已在上篇文章中有说明,这篇就开门见山,先描述一些关于代理功能的配置,再说明负载均衡详细。

Nginx代理服务的配置说明

1、上一篇中我们在http模块中有下面的配置,当代理遇到状态码为404时,我们把404页面导向百度。

然而这个配置,细心的朋友可以发现他并没有起作用。

如果我们想让他起作用,我们必须配合着下面的配置一起使用

2、如果我们的代理只允许接受get,post请求方法的一种

3、设置支持的http协议版本

4、如果你的nginx服务器给2台web服务器做代理,负载均衡算法采用轮询,那么当你的一台机器web程序iis关闭,也就是说web不能访问,那么nginx服务器分发请求还是会给这台不能访问的web服务器,如果这里的响应连接时间过长,就会导致客户端的页面一直在等待响应,对用户来说体验就打打折扣,这里我们怎么避免这样的情况发生呢。这里我配张图来说明下问题。

如果负载均衡中其中web2发生这样的情况,nginx首先会去web1请求,但是nginx在配置不当的情况下会继续分发请求道web2,然后等待web2响应,直到我们的响应时间超时,才会把请求重新分发给web1,这里的响应时间如果过长,用户等待的时间就会越长。

5、如果使用upstream指令配置啦一组服务器作为被代理服务器,服务器中的访问算法遵循配置的负载均衡规则,同时可以使用该指令配置在发生哪些异常情况时,将请求顺次交由下一组服务器处理。

6、如果你想通过http获取客户的真是ip而不是获取代理服务器的ip地址,那么要做如下的设置。

关于X-Forwarded-For与X-Real-IP的一些相关文章我推荐一位博友的: HTTP 请求头中的 X-Forwarded-For ,这位博友对http协议有一系列的文章阐述,推荐大家去关注下。

7、下面是我的一个关于代理配置的配置文件部分,仅供参考。

上一篇中我说啦nginx有哪些中负载均衡算法。这一结我就给如果操作配置的给大家做详细说明下。

首先给大家说下upstream这个配置的,这个配置是写一组被代理的服务器地址,然后配置负载均衡的算法。这里的被代理服务器地址有2中写法。

然后,就来点实战的东西。

1、热备:如果你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。服务器处理请求的顺序:AAAAAA突然A挂啦,BBBBBBBBBBBBBB

upstream mysvr { server 127001:7878; server 19216810121:3333 backup; #热备 }

2、轮询:nginx默认就是轮询其权重都默认为1,服务器处理请求的顺序:ABABABABAB

upstream mysvr { server 127001:7878; server 19216810121:3333; }

3、加权轮询:跟据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置,则默认为1。下面服务器的请求顺序为:ABBABBABBABBABB

upstream mysvr { server 127001:7878 weight=1; server 19216810121:3333 weight=2;}

4、ip_hash:nginx会让相同的客户端ip请求相同的服务器。

upstream mysvr { server 127001:7878; server 19216810121:3333; ip_hash; }

5、如果你对上面4种均衡算法不是很理解,那么麻烦您去看下我上一篇配的,可能会更加容易理解点。

到这里你是不是感觉nginx的负载均衡配置特别简单与强大,那么还没完,咱们继续哈,这里扯下蛋。

关于nginx负载均衡配置的几个状态参数讲解。

down,表示当前的server暂时不参与负载均衡。

backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻 。

max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。

fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。

到这里应该可以说nginx的内置负载均衡算法已经没有货啦。如果你像跟多更深入的了解nginx的负载均衡算法,nginx官方提供一些插件大家可以了解下。

Nginx("engine x") 是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少,并发能力强,事实上 nginx 的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用 nginx 网站用户有:百度、京东、新浪、网易、腾讯、 淘宝等。

11 WEB 服务器

Nginx 可以作为静态页面的 web 服务器,同时还支持 CGI 协议的动态语言,比如 perl、php

等。但是不支持 java。Java 程序只能通过与 tomcat 配合完成。Nginx 专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率 ,能经受高负载的考验,有报告表明能支持高达 50000个并发连接数。

12 反向代理

1正向代理,代理客户端,客户端需要配置代理

2反向代理,代理服务端,客户端无感知

13 负载均衡

Nginx 的异步框架可以处理很大的并发请求,把这些并发请求 hold 住之后就可以分发给后台服务端(backend servers,也叫做服务池, 后面简称 backend)来做复杂的计算、处理和响应,这种模式的好处是相当多的:隐藏业务主机更安全,节约了公网 IP 地址,并且在业务量增加的时候可以方便地扩容后台服务器。

这时候集群的概念产生了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服器,也就是我们所说的负载均衡。

14 动静分离

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。

Nginx官网

21 相关安装包

pcre-837targz openssl-101ttargz zlib-128targz nginx-1111targz

22 安装流程

211安装 pcre 解压缩 pcre-xxtargz 包

进入解压缩目录,执行/configure

如果提示,需要提前安装 gcc++,进入安装光盘目录的软件包(/media/CentOSXX/Package)执行

rpm -ivh libstdc+ devel-447-17el6x86_64rpm

rpm -ivh gcc-c+ 447-17el6x86_64rpm

/configure 完成后,回到 pcre 目录下执行 make,再执行 make install

222安装 openssl

解压缩 openssl-xxtargz 包。

进入解压缩目录,执行/config

make && make install

223安装 zlib 解压缩 zlib-xxtargz 包。

进入解压缩目录,执行/configure。

make && make install

224安装 nginx

解压缩 nginx-xxtargz 包。

进入解压缩目录,执行/configure。

make && make install

查看开放的端口号

firewall-cmd --list-all

设置开放的端口号

firewall-cmd --add-service=http –permanent

sudo firewall-cmd --add-port=80/tcp --permanent

重启防火墙

firewall-cmd –reload

23 Nginx 启动

命令

启动命令:在/usr/local/nginx/sbin 目录下执行 /nginx

关闭命令: 在/usr/local/nginx/sbin 目录下执行 /nginx -s stop

重新加载命令: 在/usr/local/nginx/sbin 目录下执行 /nginx -s reload·

设置 nginx 为自启动服务

修改 linux 启动脚本/etc/rcd/rc

加入 :/usr/local/nginx/sbin/nginx

nginx 安装目录下,其默认的配置文件都放在conf 目录下,而主配置文件nginxconf 也在其中,后续对 nginx 的使用基本上都是对此配置文件进行相应的修改。

根据上述文件,我们可以很明显的将 nginxconf 配置文件分为三部分

第一部分:全局块

从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。

比如上面第一行配置的:worker_processes 1;

这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。

第二部分:events 块

events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。

上述例子就表示每个 work process 支持的最大连接数为 1024

这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。

第三部分:http 块

这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。

需要注意的是:http 块也可以包括 http 全局块、server 块。

http 全局块

http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。

server 块

这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。

每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。

而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。

全局 server 块

最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。

location 块

一个 server 块可以配置多个 location 块。

这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

案例配置如下:

location 指令说明

该指令用于匹配 URL,语法如下:

= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配

成功,就停止继续向下搜索并立即处理该请求。

~:用于表示 uri 包含正则表达式,并且区分大小写。

~:用于表示 uri 包含正则表达式,并且不区分大小写。

^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字

符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location

块中的正则 uri 和请求字符串做匹配。

注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~ 标识。

案例配置如下:

在 linux 下有 Nginx、LVS、Haproxy 等等服务可以提供负载均衡服务,而且 Nginx 提供了几种分配方式(策略):

轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。

weight

weight 代表权重,默认为 1,权重越高被分配的客户端越多指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。

ip_hash

每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。

fair(第三方)

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

动静分离从目前实现角度来讲大致分为两种:

1一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;

2另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。

通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码 200。

master-workers 的机制的好处

首先,对于每个 worker 进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,

同时在编程以及问题查找时,也会方便很多。其次,采用独立的进程,可以让互相之间不会

影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快启动新的

worker 进程。当然,worker 进程的异常退出,肯定是程序有 bug 了,异常退出,会导致当

前 worker 上的所有请求失败,不过不会影响到所有请求,所以降低了风险。

需要设置多少个 worker

Nginx 同 redis 类似都采用了 io 多路复用机制,每个 worker 都是一个独立的进程,但每个进

程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话

下。每个 worker 的线程可以把一个 cpu 的性能发挥到极致。所以 worker 数和服务器的 cpu

数相等是最为适宜的。设少了会浪费 cpu,设多了会造成 cpu 频繁切换上下文带来的损耗。

连接数 worker_connection

这个值是表示每个 worker 进程所能建立连接的最大值,所以,一个 nginx 能建立的最大连接数,应该是 worker_connections worker_processes。当然,这里说的是最大连接数,对于HTTP 请 求 本 地 资 源 来 说 , 能 够 支 持 的 最 大 并 发 数 量 是 worker_connections worker_processes,如果是支持 http11 的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是: worker_connections worker_processes /2,而如果是 HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections

worker_processes/4。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。

注意:此部分属于高级技术,近几日会将下面的知识点补充完毕。

81 Keepalived+Nginx 高可用集群(主从模式)

82 Keepalived+Nginx 高可用集群(双主模式)

为了更好的指导部署与测试艺术升系统nginx网站服务器高性能同时下安全稳定运行,需要对nginx服务进行调优与加固;

本次进行Nginx服务调优加固主要从以下几个部分:

本文档仅供内部使用,禁止外传,帮助研发人员,运维人员对系统长期稳定的运行提供技术文档参考。

Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx作为负载均衡服务器, Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务,也可以支持作为 HTTP代理服务器对外进行服务。

Nginx版本选择:

项目结构:

Nginx文档帮助: http://nginxorg/en/docs/

Nginx首页地址目录: /usr/share/nginx/html

Nginx配置文件:

localtion 请求匹配的url实是一个正则表达式:

Nginx 匹配判断表达式:

例如,匹配末尾为如下后缀的静态并判断是否存在该文件, 如不存在则404。

查看可用模块编译参数:http://nginxorg/en/docs/configurehtml

http_gzip模块

开启gzip压缩输出(常常是大于1kb的静态文件),减少网络传输;

http_fastcgi_module模块

nginx可以用来请求路由到FastCGI服务器运行应用程序由各种框架和PHP编程语言等。可以开启FastCGI的缓存功能以及将静态资源进行剥离,从而提高性能。

keepalive模块

长连接对性能有很大的影响,通过减少CPU和网络开销需要开启或关闭连接;

http_ssl_module模块

Nginx开启支持Https协议的SSL模块

Linux内核参数部分默认值不适合高并发,Linux内核调优,主要涉及到网络和文件系统、内存等的优化,

下面是我常用的内核调优配置:

文件描述符

文件描述符是操作系统资源,用于表示连接、打开的文件,以及其他信息。NGINX 每个连接可以使用两个文件描述符。

例如如果NGINX充当代理时,通常一个文件描述符表示客户端连接,另一个连接到代理服务器,如果开启了HTTP 保持连接,这个比例会更低(译注:为什么更低呢)。

对于有大量连接服务的系统,下面的设置可能需要调整一下:

精简模块:Nginx由于不断添加新的功能,附带的模块也越来越多,建议一般常用的服务器软件使用源码编译安装管理;

(1) 减小Nginx编译后的文件大小

(2) 指定GCC编译参数

修改GCC编译参数提高编译优化级别稳妥起见采用 -O2 这也是大多数软件编译推荐的优化级别。

GCC编译参数优化 [可选项] 总共提供了5级编译优化级别:

常用编译参数:

缓存和压缩与限制可以提高性能

NGINX的一些额外功能可用于提高Web应用的性能,调优的时候web应用不需要关掉但值得一提,因为它们的影响可能很重要。

简单示例:

1) 永久重定向

例如,配置 http 向 https 跳转 (永久)

nginx配置文件指令优化一览表

描述:Nginx因为安全配置不合适导致的安全问题,Nginx的默认配置中存在一些安全问题,例如版本号信息泄露、未配置使用SSL协议等。

对Nginx进行安全配置可以有效的防范一些常见安全问题,按照基线标准做好安全配置能够减少安全事件的发生,保证采用Nginx服务器系统应用安全运行;

Nginx安全配置项:

温馨提示: 在修改相应的源代码文件后需重新编译。

设置成功后验证:

应配置非root低权限用户来运行nginx服务,设置如下建立Nginx用户组和用户,采用user指令指运行用户

加固方法:

我们应该为提供的站点配置Secure Sockets Layer Protocol (SSL协议),配置其是为了数据传输的安全,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

不应使用不安全SSLv2、SSLv3协议即以下和存在脆弱性的加密套件(ciphers), 我们应该使用较新的TLS协议也应该优于旧的,并使用安全的加密套件。

HTTP Referrer Spam是垃圾信息发送者用来提高他们正在尝试推广的网站的互联网搜索引擎排名一种技术,如果他们的垃圾信息链接显示在访问日志中,并且这些日志被搜索引擎扫描,则会对网站排名产生不利影响

加固方法:

当恶意攻击者采用扫描器进行扫描时候利用use-agent判断是否是常用的工具扫描以及特定的版本,是则返回错误或者重定向;

Nginx支持webdav,虽然默认情况下不会编译。如果使用webdav,则应该在Nginx策略中禁用此规则。

加固方法: dav_methods 应设置为off

当访问一个特制的URL时,如"/nginxstatus",stub_status模块提供一个简短的Nginx服务器状态摘要,大多数情况下不应启用此模块。

加固方法:nginxconf文件中stub_status不应设置为:on

如果在浏览器中出现Nginx自动生成的错误消息,默认情况下会包含Nginx的版本号,这些信息可以被攻击者用来帮助他们发现服务器的潜在漏洞

加固方法: 关闭"Server"响应头中输出的Nginx版本号将server_tokens应设置为:off

client_body_timeout设置请求体(request body)的读超时时间。仅当在一次readstep中,没有得到请求体,就会设为超时。超时后Nginx返回HTTP状态码408(Request timed out)。

加固方法:nginxconf文件中client_body_timeout应设置为:10

client_header_timeout设置等待client发送一个请求头的超时时间(例如:GET / HTTP/11)。仅当在一次read中没有收到请求头,才会设为超时。超时后Nginx返回HTTP状态码408(Request timed out)。

加固方法:nginxconf文件中client_header_timeout应设置为:10

keepalive_timeout设置与client的keep-alive连接超时时间。服务器将会在这个时间后关闭连接。

加固方法:nginxconf文件中keepalive_timeout应设置为:55

send_timeout设置客户端的响应超时时间。这个设置不会用于整个转发器,而是在两次客户端读取操作之间。如果在这段时间内,客户端没有读取任何数据,Nginx就会关闭连接。

加固方法:nginxconf文件中send_timeout应设置为:10

GET和POST是Internet上最常用的方法。Web服务器方法在RFC 2616中定义禁用不需要实现的可用方法。

加固方法:

limit_zone 配置项限制来自客户端的同时连接数。通过此模块可以从一个地址限制分配会话的同时连接数量或特殊情况。

加固方法:nginxconf文件中limit_zone应设置为:slimits $binary_remote_addr 5m

该配置项控制一个会话同时连接的最大数量,即限制来自单个IP地址的连接数量。

加固方法:nginxconf 文件中 limit_conn 应设置为: slimits 5

加固方法:

加固方法:

解决办法:

描述后端获取Proxy后的真实Client的IP获取需要安装--with-http_realip_module,然后后端程序采用JAVA(requestgetAttribute("X-Real-IP"))进行获取;

描述: 如果要使用geoip地区选择,我们需要再nginx编译时加入 --with-http_geoip_module 编译参数。

描述: 为了防止外部站点引用我们的静态资源,我们需要设置那些域名可以访问我们的静态资源。

描述: 下面收集了Web服务中常规的安全响应头, 它可以保证不受到某些攻击,建议在指定的 server{} 代码块进行配置。

描述: 为了防止某些未备案的域名或者恶意镜像站域名绑定到我们服务器上, 导致服务器被警告关停,将会对业务或者SEO排名以及企业形象造成影响,我们可以通过如下方式进行防范。

执行结果:

描述: 有时你的网站可能只需要被某一IP或者IP段的地址请求访问,那么非白名单中的地址访问将被阻止访问, 我们可以如下配置;

常用nginx配置文件解释:

(1) 阿里巴巴提供的Concat或者Google的PageSpeed模块实现这个合并文件的功能。

(2) PHP-FPM的优化

如果您高负载网站使用PHP-FPM管理FastCGI对于PHP-FPM的优化非常重要

(3) 配置Resin on Linux或者Windows为我们可以打开 resin-319/bin/httpdsh 在不影响其他代码的地方加入:-Dhttpsprotocols=TLSv12, 例如

原文地址: https://blogweiyigeektop/2019/9-2-122html

Nginx的每个模块都基本符合单一职责原则

一般来说,Web服务器完成并行处理请求工作的三种方式有:多进程方式、多进程方式和异步方式

多进程方式是指,服务器每当接收到一个客户端时,就由服务器主进程生成一个子进程出来和该客户端建立连接进行交互,直到连接断开,该子进程就结束了

多进程方式的优点在于,设计和实现相对简单,各个子进程之间相对独立,处理客户端请求的过程彼此不受到干扰,并且当一个子进程产生问题时,不容易将影响蔓延到其他进程中,这保证了提供服务的稳定性。当子线程退出时,其占用资源会被操作系统回收,也不会留下任何垃圾。

其缺点是操作系统中生成一个子进程需要进行大量内存复制等操作,在资源和时间上会产生一定的额外开销。因此,如果Web服务器接收大量并发请求,就会对系统资源造成压力,导致系统性能下降。

Apache采用“预生成进程”方式,它将生成子进程的时机提前,在客户端请求还没有到来之前就预先生成好,当请求到来时,主进程分配一个子进程和该客户端进行交互,交互完成之后,该进程也不结束,而被主进程管理起来等待下一个客户端请求的到来

多线程方式是指当服务器每当接收到一个客户端时,会有服务器主进程派生一个线程出来和该客户端进行交互

由于操作系统产生一个线程的开销远远小于产生一个进程的开销,所以多线程方式在很大程度上减轻了Web服务器对系统资源的要求。该方式使用线程进行任务调度,开发方面可以遵循一定的标准,这相对来说比较规范和有利于协作。

多个线程位于同一进程内,可以访问同样的内存空间,彼此之间相互影响;同时,在开发过程中不可避免地要由开发者自己对内存进行管理,其增加了出错的风险

IIS服务器使用了多线程方式对外提供服务

同步机制:发送方发送请求之后,需要等待接收到接收方发回的响应后,才接着发送下一个请求

异步机制:发送方发送请求只有,不等待接收方响应这个请求,就继续发送下一个请求。

在同步机制中,所有的请求在服务器端得到同步,发送方和接收方对请求的处理步调是一致的;在异步机制中,所有来自发送方的请求形成一个队列,接收方处理完成后通知发送方

阻塞和非阻塞用来描述进程处理调用的方式,在网络通信中,主要指网络套接字Socket的阻塞和非阻塞方式,而Socket的实质也就是IO操作。

Socket的阻塞调用方式为,调用结果返回之前,当前线程从运行状态被挂起,一直等到调用结果返回之前,才进入就绪状态,获取CPU继续执行

Socket的非阻塞调用方式为,如果调用结果不能马上返回,当前线程也不会被挂起,而是立即返回执行下一个调用

Nginx结合多进程机制和异步机制对外提供服务。异步机制使用的是异步非阻塞方式

Nginx服务器启动后产生一个主进程和多个工作进程(可在配置文件中配置)。Ngnix服务器的所有工作进程都用于接收和处理客户端的请求。每个工作进程使用异步非阻塞方式,可以处理多个客户端的请求。当某个工作进程接收到客户端的请求以后,调用IO进行处理,如果不能立即得到返回,就去处理其他的请求;而客户端再次期间也无须等待响应,可以去处理其他的事情;当IO调用返回结果时,就会通知此工作进程;该进程得到通知,暂时挂起当前处理的事务,去响应客户端的请求

IO调用把状态通知给工作进程的两种方式:

select/poll/epoll/kqueue等这样的系统调用就是支撑第二种方案的。这种系统调用,也称为事件模型。IO调用完全由事件驱动模型来管理,事件准备好之后就通知工作进程事件已经就绪

事件驱动就是在持续事务管理过程中,由当前时间点上出现的事件引发的调动可用资源执行相关任务,解决不断出现的问题,防止事务堆积的一种策略

事件驱动模型一般由事件收集器、事件发送器和事件处理器三部分基本单元组成

事件收集器 专门负责收集所有的事件,包括来自用户的(鼠标、键盘事件等)、来自硬件的(时钟事件等)和来自软件的(操作系统、应用程序自身)。 事件发送器 负责将收集器收集到的事件分发到目标对象中。目标对象就是事件处理器所处的位置。 事件处理器 主要负责具体事件的响应工作,它往往要到实现阶段才完全确定

目标对象中事件处理器的几种方式:

大部分网络服务器都采用第三种方式,形成了事件驱动库。事件驱动库又被称为多路IO复用方法,最常见的伪:select、poll、epoll。Nginx服务器还支持rtsig、kqueue、dev/poll和eventport

各个版本Linux和Windows平台都支持的基本事件驱动模型

使用select库的一般步骤:

如果没有指定其他事件驱动模型,Nginx自动编译该库。

使用--with-select_module和--without-select_module强制Nginx是否编译该库

Linux平台的事件驱动模型,Windows不支持。

poll和select的基本使用方式是相同的,区别在于:select需要为读事件、写事件和异常事件都分别创建一个描述符集合,因此在最后轮询的时候,需要分别轮训这三个集合。而poss库只需要创建一个集合,在每个描述符对应的结构上分别设置读事件、写事件或异常事件,最后轮询的时候,可以同时检查这三种事件是否发生。poll库是select库的优化实现

如果没有指定其他事件驱动模型,Nginx自动编译该库。

使用--with-poll_module和--without-poll_module强制Nginx是否编译该库

epoll属于poll库的一个变种,最大的区别在于效率

epoll库通过相关调用通知内核创建一个有N个描述符的事件列表;然后,给这些描述符设置所关注的事件,并将它添加到内核的事件列表中。

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

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

使用rtsig模型时,工作进程会通过系统内核建立一个rtsig队列用于存放标记事件发生(在Nginx服务器应用中特指客户端请求发生)的信号。每一个事件发生时,系统内核就会发生一个信号存放到rtsig队列中等待工作进程的处理。

rtsig队列有长度限制,如果超过该长度就会发生溢出。默认情况下,Linux系统事件信号队列的最大长度设置为1024。在Liunx266-mm2之后的版本之前,通过修改内核参数/proc/sys/kernel/rtsig-max来自定义该长度设置。在Liunx266-mm2之后的版本中,该参数被取消,系统各个进程分别拥有各自的事件信号队列,这个队列的大小由Linux系统的RLIMIT_SIGPENDING参数定义,在执行setrlimit()系统调用时确定该大小。Linux提供了worker+rlimit_sigpending参数用于调节这种情况下的事件信号队列长度

当rtsig队列发生溢出时,Nginx将暂停使用rtsig模型,而调用poll库处理未处理的事件,直到rtsig信号队列全部清空,然后再次启动rtsig模型,以防止新的溢出发生

编译Nginx服务器时,使用-with-rtsig_module配置选项启用rtsig模型的编译

kqueue模型,主要用于FreeBSD41及以上版本、OpenBSD29及以上版本、NetBSD20及以上版本以及Mac OS X平台上。该模型也是poll库的一个变种,其和poll库的处理方式没有本质上的区别。该模型同时支持条件触发(只要满足条件就触发一个事件)和边缘触发(当状态发生改变触发一个事件)。在这些平台下,使用该模型用于请求处理,提高Nginx服务器性能

/dev/poll模型,主要用于Solaris7 11/99及以上版本、HP/US 1122及以上版本、IRIX6515及以上版本和Tru 64 UNIX 51A及以上版本。它使用了虚拟的/dev/poll设备,开发人员可以将要监视的文件描述符加入这个设备,然后通过ioctl()调用来获取事件通知。在以上平台中推荐使用

eventport模型,用于支持Solaris 10及以上版本。它可以有效防止内核崩溃等情况的发生

根据不同的部署平台,选择不同的事件驱动模型以提升Nginx服务器的处理性能

Nginx服务器启动后,产生一个主进程,主进程执行一系列工作后产生一个或者多个工作进程。

主进程主要进行Nginx配置文件解析、数据结构初始化、模块配置和注册、信号处理、网络监听生成、工作进程生成和管理等工作;

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

Nginx服务器将接收到的Web请求通过代理转发到后端服务器,由后端服务器进行数据处理和页面组织,然后将结果返回。

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

依赖于管道机制,交互的准备工作都是在工作进程生成时完成的

Run Loops,指的是进程内部用来不停地调配工作,对事件进行循环处理的一种模型。

该模型是一个集合,集合中的每一个元素称为一个Run-Loop。每个Run-Loop可运行在不同的模式下,其中可以包含它所监听的输入事件源、定时器以及在事件发生时需要通知的Run-Loop监听器。为了监听特定的事件,可以在Run Loops中添加相应的Run-Loop监听器。当被监听的事件发生时,Run-Loop会产生一个消息,被Run-Loop监听器捕获,从而执行预定的动作

Nginx服务器在工作进程中实现了Run-Loop事件处理循环的使用,用来处理客户端发送的请求事件

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » Nginx代理功能详解

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情