软件测试 | 测试开发 | Nginx反向代理及内部模型简述
Nginx是什么?
Nginx功能丰富,可作为HTTP服务器、反向代理服务器和邮件服务器。Nginx支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。并且支持很多第三方的模块扩展。
Nginx特点是占用内存少,并发能力强。
Nginx常用功能
01
Http代理,反向代理
正向代理把客户端发送的请求转交到客户端指定的服务器,然后将获得的内容返回给客户端,客户端必须设置正向代理服务器的IP地址,还有代理程序的端口。
反向代理在接收到客户端的请求后,把请求分发给具体的服务器进行处理,然后再将服务器的响应结果返回给客户端。客户端不需要进行任何特别的设置。
正向代理和反向代理图示:
正向代理主要用来访问原来无法访问的资源
反向代理主要用于服务器集群分布式部署的场景,来保证内网的安全,并可实现负载均衡。
Nginx在做反向代理时,提供性能稳定,并且能够提供配置灵活的转发功能。Nginx可以根据不同的正则匹配,采取不同的转发策略,比如图片文件结尾的走文件服务器,动态页面走web服务器。并且Nginx对返回结果进行错误页跳转,异常判断等。如果被分发的服务器存在异常,它可以将请求重新转发给另外一台服务器,然后自动去除异常服务器。
通常情况下,在实际项目中,正向代理和反向代理很有可能会存在在一个应用场景中,正向代理服务器代理客户端的请求去访问目标服务器,目标服务器是一个反向代理服务器,反向代理了多台真实的业务处理服务器。
如图所示:
02
负载均衡
反向代理服务器把接收到的请求按照规则分发的过程,称为负载均衡。
Nginx支持的负载均衡调度算法方式如下:
**1.weight轮询(默认):**接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,Nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。
如下图:
**2.ip_hash:**每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。
如下图:
**3.fair:**智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是Nginx默认不支持fair算法,如果要使用这种调度算法,需要安装upstream_fair模块。
**4.url_hash:**按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在Nginx作为静态服务器的情况下提高缓存效率。同样要注意Nginx默认不支持这种调度算法,要使用的话需要安装Nginx的hash软件包。
Nginx的内部(进程)模型
读取并验证配置文件nginx.conf;管理worker进程;
每一个Worker进程都维护一个线程(避免线程切换),处理连接和请求;注意Worker进程的个数由配置文件决定,一般和CPU个数相关(有利于进程切换),配置几个就有几个Worker进程。
模型要点:
1.nginx在启动后,会有一个master进程和多个worker进程。master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控 worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。而基本的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致,这里面的原因与nginx的进程模型以及事件处理模型是分不开的。
2.Master接收到命令以后怎样进行处理(./nginx -s reload热重启)?首先master进程在接到信号后,会先重新加载配置文件,然后再启动新的进程,并向所有老的进程发送信号,告诉他们可以光荣退休了。新的进程在启动后,就开始接收新的请求,而老的进程在收到来自 master的信号后,就不再接收新的请求,并且在当前进程中的所有未处理完的请求处理完成后,再退出 。
- Worker进程又是如何处理请求的呢?我们前面有提到,worker进程之间是平等的,每个进程,处理请求的机会也是一样的。当我们提供80端口的http服务时,一个连接请求过来,每个进程都有可能处理这个连接,怎么做到的呢?首先,每个worker进程都是从master 进程fork(分配)过来,在master进程里面,先建立好需要listen的socket之后,然后再fork出多个worker进程,这样每个worker进程都可以去accept这个socket(当然不是同一个socket,只是每个进程的这个socket会监控在同一个ip地址与端口,这个在网络协议里面是允许的)。一般来说,当一个连接进来后,所有在accept在这个socket上面的进程,都会收到通知,而只有一个进程可以accept这个连接,其它的则accept失败,这是所谓的惊群现象。当然,nginx也不会视而不见,所以nginx提供了一个accept_mutex这个东西,从名字上,我们可以看这是一个加在accept上的一把共享锁。有了这把锁之后,同一时刻,就只会有一个进程在accpet连接,这样就不会有惊群问题了。accept_mutex是一个可控选项,我们可以显示地关掉,默认是打开的。当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。我们可以看到,一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。
4.nginx采用这种进程模型有什么好处呢?采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快重新启动新的worker进程。当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。
Nginx是如何处理一个请求
1、nginx在启动时,会解析配置文件,得到需要监听的端口与ip地址,然后在nginx的master进程里面,先初始化好这个监控的socket(创建socket,设置addrreuse等选项,绑定到指定的ip地址端口,再listen),然后再fork(一个现有进程可以调用fork函数创建一个 新进程。由fork创建的新进程被称为子进程 )出多个子进程出来,然后子进程会竞争accept新的连接。此时,客户端就可以向nginx发起连接了。当客户端与nginx进行三次握手,与nginx建立好一个连接后,此时,某一个子进程会accept成功,得到这个建立好的连接的 socket,然后创建nginx对连接的封装,即ngx_connection_t结构体。接着,设置读写事件处理函数并添加读写事件来与客户端进行数据的交换。最后,nginx或客户端来主动关掉连接,到此,一个连接就寿终正寝了。
2、nginx也是可以作为客户端来请求其它server的数据的(如upstream模块),此时,与其它server创建的连接,也封装在ngx_connection_t中。作为客户端,nginx先获取一个ngx_connection_t结构体,然后创建socket,并设置socket的属性(比如非阻塞)。然后再通过添加读写事件,调用connect/read/write来调用连接,最后关掉连接,并释放ngx_connection_t。
3、nginx在实现时,是通过一个连接池来管理的,每个worker进程都有一个独立的连接池,连接池的大小是worker_connections。这里的连接池里面保存的其实不是真实的连接,它只是一个worker_connections大小的一个ngx_connection_t结构的数组。并且,nginx会通过一个链表free_connections来保存所有的空闲ngx_connection_t,每次获取一个连接时,就从空闲连接链表中获取一个,用完后,再放回空闲连接链表里面。
4、worker_connections这个参数不是nginx所能建立连接的最大值。这个值是表示每个worker进程所能建立连接的最大值,所以,一个nginx能建立的最大连接数,应该是worker_connections * worker_processes。当然 ,这里说的是最大连接数,对于HTTP请求本地资源来说,能够支持的最大并发数量是worker_connections * worker_processes,而如果是HTTP作为反向代理来说,最大并发数量应该是worker_connections * worker_processes/2。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。
软件测试 | 测试开发 | Nginx反向代理及内部模型简述相关推荐
- 微信公众号开发---nginx反向代理
nginx反向代理网上资料也很多,最主要的是proxy_set_header Host 设置 和 proxy_pass 设置,这里设置为natapp分配的域名(免费域名当天有效,所以每天都要重启并重 ...
- Nginx 反向代理实现微信开发完美线上测试环境
成文时间: 2018-11-29 11:18:10 环境说明 Ubuntu 16.04 LTS Nginx version: nginx/1.10.3 (Ubuntu) PHP 7.1.18 Lara ...
- MacOS开发必备工具brew,安装nginx反向代理,替代linux工具 apt-get和 yum...
Mac os开发者必备工具 brew,替代Linux系统中的 apt-get和yum工具,本文介绍Mac电脑安装Homebrew,并下载安装软件nginx反向代理过程. 1.安装Homebrew 在苹 ...
- Nginx 反向代理测试
实现效果 使用nginx反向代理,访问www.zxg.com 直接跳转 localhost:8080 tomcat安装 使用Docker启动Tomcat容器步骤 效果如下: 修改本机host文件 位置 ...
- 2022年4月10日记:Linux服务器开发,King,Nginx反向代理与系统参数配置conf原理
Nginx反向代理与系统参数配置conf原理 前言 nginx成功开源的原因: nginx三个可控入口: 惊群 总结 前言 今天学习Nginx反向代理,可以说是慕名而来.从整体上看,我对Nginx的了 ...
- Nginx反向代理以及负载均衡配置
一 .nginx 的优缺点: nginx 相对 apache 的优点: 轻量级,同样起web 服务,比apache 占用更少的内存及资源 抗并发,nginx 处理请求是异步非阻塞的,而apache 则 ...
- Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解(1)
大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...
- nginx反向代理缓存服务器构建
博主QQ:819594300 博客地址:http://zpf666.blog.51cto.com/ 有什么疑问的朋友可以联系博主,博主会帮你们解答,谢谢支持! 代理服务可简单的分为正向代理和反向代理: ...
- Nginx反向代理 实现Web负载均衡
实现负载均衡的方式有很多种,DNS.反向代理.LVS负载均衡器(软件实现).F5(负载均衡器,硬件,非常昂贵)这里我们只提到基于DNS,以及反向代理的方式来实现负载均衡Web服务 DNS服 ...
最新文章
- java spark persist,hadoop – 我的sparkDF.persist(DISK_ONLY)数据存储在哪里?
- Tomcat6(含Tomcat6)之后默认没有common,server和shared文件夹,如何配置
- redis 自减命令_Redis 实战 —— 04. Redis 数据结构常用命令简介
- c语言判断一个月有多少天程序,【0320】C语言编写的小程序,算算自己已经活了多少天...
- 企业为什么需要网络流量分析
- Linux正則表達式-定位元字符
- 网络爬虫框架Webmagic
- Java修饰符:public,protected,private,不加修饰符的区别
- .NET Core 使用 HttpClient SSL 请求出错的解决办法
- icom对讲机写频线定义_小米对讲机Lite体验:小米全新5公里无网络免费通话神器...
- 【简介】操作系统概念
- 如何在Mac OS X 10.6.4上卸载Python 2.7?
- javascript作用域链详解
- 凯撒密码加密算法python_想偷WiFi?万能钥匙不行?试试python一键破解!|wifi|python|profile|算法|无线网卡...
- 计算机基础教材编写委员,大学计算机基础论文关于凸现应用型人才培养的大学计算机基础教材建设论文范文参考资料...
- 2022新轻量级个人免签支付源码+手动审核邮件短信推送
- 高可用架构篇:【2】ActiveMQ高可用+负载均衡集群的安装、配置、高可用(多节点)
- JavaScript基础知识学习
- Github推荐--PC端下载bilibili视频
- 3y开发都不的不写单元测试,然后被被批了