Nginx的一些心得

综合了网上几篇比较简短的博文,自己进行了整理。加入了自己的体会,以后自己再看就比较明白了~

Nginx能做些什么?

1、正向代理

2、反向代理

3、负载均衡

4、Http server(包含动静分离)[这个还没理解]

 

正向代理和反向代理

 

正向代理:举个栗子,我是生活在天朝的一名大学生,有一天我想要上油管上面找些视频材料剪辑好穿到b站上去,但是由于天朝强大无比的“墙”技术,我没法直接通过域名找到网站。于是我找了一个天朝可以访问的一个外国服务器,而这个服务器是可以上油管的。于是我向这个服务器发送请求说我要上油管,这个服务器人很好,就帮我登上了油管,并把浏览器下载下来的资源传给了我(当然了这个过程我和这个服务器一直是保持着连接的,不然的话我看视频有可能就会一卡一卡的)。在这个过程中,我的身份是客户端,油管的身份是目标服务器,我找到的服务器就被称为代理服务器。

在上面这个例子中,客户端不能访问目标服务器,但是可以访问代理服务器,而代理服务器是可以访问目标服务器的,于是客户端通过向代理服务器发送请求来让代理服务器替自己获取目标服务器的内容。这个过程就叫做正向代理。

 

反向代理:再举个栗子,假设我是米忽悠公司的边缘技术人员,我知道公司的数据保存在很多台服务器中,这些服务器中有A、B、C、D。我现在只知道其中一台服务器A的地址,B、C、D三台服务器的地址被放在了老板的保险箱里,而我却想要拿到C服务器中的制作蟹黄堡的秘方,这可愁死我了,怎么办呢?幸好,公司内部的内奸章鱼哥告诉我,A服务器的权限很大,可以从其他服务器拿数据。我很开心,于是就连上了A服务器,通过它去获取C服务器中的秘方。一番折腾以后,章鱼哥告诉我,其实A服务器里面也有秘方。

在上面这个栗子中,客户端(我)想要去获取不知道域名、或者说被防火墙(保险箱)保护着的目标服务器中的数据,由于我无法直接访问,所以我需要通过一台有权限获取目标服务器中数据的代理服务器去获取我想要的数据。这个过程叫做反向代理。

 

那海绵宝宝就要问了,为什么都是通过代理服务器去获取数据,上面的栗子就是正向代理,下面的栗子就是反向代理呢?

我的想法是,虽然我们所需要的数据都是在我们无法直接访问的目标服务器上,但是正向代理是知道该服务器的地址的,而反向代理是不知道目标数据所在的地址的。可能还是没有说清楚,再举个栗子,正向代理就像是处于防火墙中的你访问外界你知道地址却无法访问的服务器,而反向代理是你在防火墙外,而防火墙内部的服务器处于安全考量不会把所有的服务器地址都暴露给你,只会把其中一台的地址告诉你,让你通过这台服务器来访问其他防火墙内部的服务器。话已至此,懂不懂就看天意了。

 

负载均衡

负载均衡,顾名思义,就是将服务器上的负载进行均衡处理,不至于让所有请求都跑到一台服务器上,导致一台服务器cpu占用率居高不下而其他服务器一直空闲的状况。在收到请求时,nginx会根据规则随机的将请求发送到指定的服务器上去处理(看了很多资料这里都说是随机,其实是不严谨的,应该说是按照均衡策略来发送指定服务器。但如果真的是随机分配,那就值得商榷了,看看是不是能够对其进行改进),其实看到这里就会发现这和我们上面提到的利用反向代理来访问目标服务器的过程连接上了。的确,在nginx进行负载均衡配置时,一般需要同时进行反向代理配置,通过反向代理来跳转到负载均衡。

上面提到了均衡策略,目前Nginx自带了3种负载均衡策略,还有2种第三方策略,我们来讨论讨论:

1、轮询(RR)(默认)

每个请求按照时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。比如说我们有四台服务器ABCD,然后收到了四个请求,这四个请求会按请求时间的先后分别分配给ABCD,第五个请求到来,又分配给A,如此继续。这种策略优点是简单且方便,但是缺点也很明显,可靠性不高,易造成负载分配不均衡。比如第一个请求需要消耗50%的cpu,二三四个请求每个只消耗10%的cpu,当第五个请求到来时,你再分配给A,这显然不合适。

2、指定权重

该策略可以指定轮询的几率,权重weight和访问比率成正比。这种情况适合于服务器之间性能不均的情况,比如服务器A有30个核,服务器BCD分别只有10个核,显然我们应该增大A的权重,以此来增大分配给A请求的几率,达到充分利用资源的目的。

3、ip_hash

首先说一下这种策略的原理,然后再来说一下这么做的原因。在Nginx收到请求后,利用请求的ip地址进行哈希结果分配,然后该ip地址的请求都使用该哈希值地址的服务器。那我们为什么要这么做呢?或者说什么情况下我们才需要这么做呢?当我们的程序不是无状态的时候,比如,我们在一个网站进行操作的时候,网站需要我们的登陆信息,登陆信息全都保存在session中,保存在我们此时所在的服务器上。如果我们发送另一个请求时,该请求自动分配给了别的服务器,这时候别的服务器又没有我们的登录信息,于是就会出现问题。因此我们需要设置一个访客固定访问某台服务器的策略。

4、fair(第三方)

按后台服务器的响应时间来分配请求,响应时间短的优先分配。简单来说就是服务器谁响应的快,就分配给谁,先到先得。虽然不满足均衡性,但是这种自适应性确保了在复杂的环境下能够物尽其用,需要在具体的环境中做好工作。

5、url_hash(第三方)

按访问url的hash结果来分配请求,使每个url对应到一台服务器上。后端服务器为缓存时比较有效(这句话啥意思?)

 

Http Server

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

你可能感兴趣的:(Nginx)