Nginx 相关介绍(Nginx是什么?能干吗?)

Nginx 相关介绍(Nginx是什么?能干吗?)

 
 
 
 
 
 
 
 
 
 
 

Nginx的产生

没有听过Nginx?那么必定听过它的"同行"Apache吧!Nginx同Apache同样都是一种WEB服务器。基于REST架构风格,以统一资源描述符(Uniform Resources Identifier)URI或者统一资源定位符(Uniform Resources Locator)URL做为沟通依据,经过HTTP协议提供各类网络服务。html

然而,这些服务器在设计之初受到当时环境的局限,例如当时的用户规模,网络带宽,产品特色等局限而且各自的定位和发展都不尽相同。这也使得各个WEB服务器有着各自鲜明的特色。nginx

Apache的发展时期很长,并且是毫无争议的世界第一大服务器。它有着不少优势:稳定、开源、跨平台等等。它出现的时间太长了,它兴起的年代,互联网产业远远比不上如今。因此它被设计为一个重量级的。它不支持高并发的服务器。在Apache上运行数以万计的并发访问,会致使服务器消耗大量内存。操做系统对其进行进程或线程间的切换也消耗了大量的CPU资源,致使HTTP请求的平均响应速度下降。web

这些都决定了Apache不可能成为高性能WEB服务器,轻量级高并发服务器Nginx就应运而生了。面试

俄罗斯的工程师Igor Sysoev,他在为Rambler Media工做期间,使用C语言开发了Nginx。Nginx做为WEB服务器一直为Rambler Media提供出色而又稳定的服务。算法

而后呢,Igor Sysoev将Nginx代码开源,而且赋予自由软件许可证。后端

因为:浏览器

  • Nginx使用基于事件驱动架构,使得其能够支持数以百万级别的TCP链接
  • 高度的模块化和自由软件许可证使得第三方模块层出不穷(这是个开源的时代啊~)
  • Nginx是一个跨平台服务器,能够运行在Linux,Windows,FreeBSD,Solaris,AIX,Mac OS等操做系统上
  • 这些优秀的设计带来的是极大的稳定性

因此,Nginx火了!缓存

Nginx的用武之地

Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP三、SMTP代理服务器;Nginx能够做为一个HTTP服务器进行网站的发布处理,另外Nginx能够做为反向代理进行负载均衡的实现。安全

关于代理

说到代理,首先咱们要明确一个概念,所谓代理就是一个表明、一个渠道;bash

此时就涉及到两个角色,一个是被代理角色,一个是目标角色,被代理角色经过这个代理访问目标角色完成一些任务的过程称为代理操做过程;如同生活中的专卖店~客人到adidas专卖店买了一双鞋,这个专卖店就是代理,被代理角色就是adidas厂家,目标角色就是用户。

正向代理

说反向代理以前,咱们先看看正向代理,正向代理也是你们最常接触的到的代理模式,咱们会从两个方面来讲关于正向代理的处理模式,分别从软件方面和生活方面来解释一下什么叫正向代理。

在现在的网络环境下,咱们若是因为技术须要要去访问国外的某些网站,此时你会发现位于国外的某网站咱们经过浏览器是没有办法访问的,此时你们可能都会用一个操做FQ进行访问,FQ的方式主要是找到一个能够访问国外网站的代理服务器,咱们将请求发送给代理服务器,代理服务器去访问国外的网站,而后将访问到的数据传递给咱们!

上述这样的代理模式称为正向代理,正向代理最大的特色是客户端很是明确要访问的服务器地址;服务器只清楚请求来自哪一个代理服务器,而不清楚来自哪一个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。来看个示意图(我把客户端和正向代理框在一块,同属于一个环境,后面我有介绍):

客户端必须设置正向代理服务器,固然前提是要知道正向代理服务器的IP地址,还有代理程序的端口。如图。

总结来讲:正向代理,"它代理的是客户端,代客户端发出请求",是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),而后代理向原始服务器转交请求并将得到的内容返回给客户端。客户端必需要进行一些特别的设置才能使用正向代理。

正向代理的用途:
(1)访问原来没法访问的资源,如Google
(2) 能够作缓存,加速访问资源
(3)对客户端访问受权,上网进行认证
(4)代理能够记录用户访问记录(上网行为管理),对外隐藏用户信息

反向代理

明白了什么是正向代理,咱们继续看关于反向代理的处理方式,举例如我大天朝的某宝网站,天天同时链接到网站的访问人数已经爆表,单个服务器远远不能知足人民日益增加的购买欲望了,此时就出现了一个你们耳熟能详的名词:分布式部署;也就是经过部署多台服务器来解决访问人数限制的问题;某宝网站中大部分功能也是直接使用Nginx进行反向代理实现的,而且经过封装Nginx和其余的组件以后起了个高大上的名字:Tengine,有兴趣的童鞋能够访问Tengine的官网查看具体的信息:http://tengine.taobao.org/。那么反向代理具体是经过什么样的方式实现的分布式的集群操做呢,咱们先看一个示意图(我把服务器和反向代理框在一块,同属于一个环境,后面我有介绍):

经过上述的图解你们就能够看清楚了,多个客户端给服务器发送的请求,Nginx服务器接收到以后,按照必定的规则分发给了后端的业务处理服务器进行处理了。此时~请求的来源也就是客户端是明确的,可是请求具体由哪台服务器处理的并不明确了,Nginx扮演的就是一个反向代理角色。

客户端是无感知代理的存在的,反向代理对外都是透明的,访问者并不知道本身访问的是一个代理。由于客户端不须要任何配置就能够访问。

反向代理,"它代理的是服务端,代服务端接收请求",主要用于服务器集群分布式部署的状况下,反向代理隐藏了服务器的信息。

反向代理的做用:
(1)保证内网的安全,一般将反向代理做为公网访问地址,Web服务器是内网
(2)负载均衡,经过反向代理服务器来优化网站的负载

项目场景

一般状况下,咱们在实际项目操做时,正向代理和反向代理颇有可能会存在在一个应用场景中,正向代理代理客户端的请求去访问目标服务器,目标服务器是一个反向单利服务器,反向代理了多台真实的业务处理服务器。具体的拓扑图以下:

两者区别

截了一张图来讲明正向代理和反向代理两者之间的区别,如图。

图解:

在正向代理中,Proxy和Client同属于一个LAN(图中方框内),隐藏了客户端信息;

在反向代理中,Proxy和Server同属于一个LAN(图中方框内),隐藏了服务端信息;

实际上,Proxy在两种代理中作的事情都是替服务器代为收发请求和响应,不过从结构上看正好左右互换了一下,因此把后出现的那种代理方式称为反向代理了。

负载均衡

咱们已经明确了所谓代理服务器的概念,那么接下来,Nginx扮演了反向代理服务器的角色,它是以依据什么样的规则进行请求分发的呢?不用的项目应用场景,分发的规则是否能够控制呢?

这里提到的客户端发送的、Nginx反向代理服务器接收到的请求数量,就是咱们说的负载量。

请求数量按照必定的规则进行分发到不一样的服务器处理的规则,就是一种均衡规则。

因此~将服务器接收到的请求按照规则分发的过程,称为负载均衡。

负载均衡在实际项目操做过程当中,有硬件负载均衡和软件负载均衡两种,硬件负载均衡也称为硬负载,如F5负载均衡,相对造价昂贵成本较高,可是数据的稳定性安全性等等有很是好的保障,如中国移动中国联通这样的公司才会选择硬负载进行操做;更多的公司考虑到成本缘由,会选择使用软件负载均衡,软件负载均衡是利用现有的技术结合主机硬件实现的一种消息队列分发机制。

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软件包。

 几种经常使用web服务器对比

对比项\服务器 Apache Nginx Lighttpd
Proxy代理 很是好 很是好 通常
Rewriter 很是好 通常
Fcgi 很差 很是好
热部署 不支持 支持 不支持
系统压力 很大 很小 比较小
稳定性 很是好 很差
安全性 通常 通常
静态文件处理 通常 很是好
反向代理 通常 很是好 通常

浅析负载均衡的6种算法,Ngnix的5种算法。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处连接和本声明。
本文连接: https://blog.csdn.net/youanyyou/article/details/78990133

常见的几种负载均衡算法

一、轮询法

将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的链接数和当前的系统负载。

二、随机法

经过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。由几率统计理论能够得知,随着客户端调用服务端的次数增多,

其实际效果愈来愈接近于平均分配调用量到后端的每一台服务器,也就是轮询的结果。

三、源地址哈希法

源地址哈希的思想是根据获取客户端的IP地址,经过哈希函数计算获得的一个数值,用该数值对服务器列表的大小进行取模运算,获得的结果即是客服端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。

四、加权轮询法

不一样的后端服务器可能机器的配置和当前系统的负载并不相同,所以它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,下降其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。

五、加权随机法

与加权轮询法同样,加权随机法也根据后端机器的配置,系统的负载分配不一样的权重。不一样的是,它是按照权重随机请求后端服务器,而非顺序。

六、最小链接数法

最小链接数算法比较灵活和智能,因为后端服务器的配置不尽相同,对于请求的处理有快有慢,它是根据后端服务器当前的链接状况,动态地选取其中当前

积压链接数最少的一台服务器来处理当前的请求,尽量地提升后端服务的利用效率,将负责合理地分流到每一台服务器。

Nginx的5种负载均衡算法

一、轮询(默认)

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

二、weight

指定轮询概率,weight和访问比率成正比,用于后端服务器性能不均的状况。

例如:

upstream bakend {  
  server 192.168.0.14 weight=10; server 192.168.0.15 weight=10; }
  • 1
  • 2
  • 3
  • 4

三、ip_hash

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

例如:

upstream bakend {  
  ip_hash;  
  server 192.168.0.14:88; server 192.168.0.15:80; }
  • 1
  • 2
  • 3
  • 4
  • 5

四、fair(第三方)

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

upstream backend {  
  server server1; server server2; fair; }
  • 1
  • 2
  • 3
  • 4
  • 5

五、url_hash(第三方)

按访问url的hash结果来分配请求,使每一个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

例:在upstream中加入hash语句,server语句中不能写入weight等其余的参数,hash_method是使用的hash算法。

upstream backend {  
  server squid1:3128; server squid2:3128; hash $request_uri; hash_method crc32; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

tips:

upstream bakend{#定义负载均衡设备的Ip及设备状态 ip_hash; server 127.0.0.1:9090 down; server 127.0.0.1:8080 weight=2; server 127.0.0.1:6060; server 127.0.0.1:7070 backup; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在须要使用负载均衡的server中增长

proxy_pass http://bakend/;
  • 1

每一个设备的状态设置为:

1.down 表示单前的server暂时不参与负载 
2.weight 默认为1.weight越大,负载的权重就越大。 
3.max_fails :容许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误 
4.fail_timeout:max_fails次失败后,暂停的时间。 
5.backup: 其它全部的非backup机器down或者忙的时候,请求backup机器。因此这台机器压力会最轻。

nginx支持同时设置多组的负载均衡,用来给不用的server来使用。

client_body_in_file_only:设置为On,能够讲client post过来的数据记录到文件中用来作debug。

client_body_temp_path:设置记录文件的目录,能够设置最多3层目录。

location:对URL进行匹配,能够进行重定向或者进行新的代理,负载均衡。

推荐阅读

干货:2TB架构师四阶段视频教程

面经:史上最全Java多线程面试题及答案

面经:史上最全阿里高级Java面试题

面经:史上最全Spring面试题

教程:最全Spring Boot全套视频教程

书籍:进阶Java架构师必看的15本书

工具:推荐一款在线创做流程图、思惟导图软件

相关文章
相关标签/搜索