一、Nginx简介
1、Nginx是2004年10月4日发布的一款轻量级的web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在BSD-like协议下发行。因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
2、特点:内存占用少,并发能力强。
3、优点:作为负载均衡器,系统资源开销相对较少,CPU使用效率高;结构模块化;配置非常简介;稳定性较强。
二、Nginx代理服务
无论是正向代理,还是反向代理,说到底,就是代理模式的衍生版本。
1、正向代理
(1)概念:很多时候我们上网的网速特别慢,或者说由于翻墙问题导致我们无法访问到国外的网站,通常这些情况我们会通过给浏览器配置一个网速快的、可以翻墙的代理ip及端口号来解决我们的问题,那么配置好之后,大概的请求流程如下图所示:
image.png
我们首先请求代理服务器,然后代理服务器帮我们去快速访问国外的网站,对于这种代理方式,我们就称之为正向代理。请记住,上面说到代理模式的两个角色中,我们当前的角色为 被代理者,也就是浏览器这个角色。更重要的是,正向代理的本质是我们去请求外部的资源,如果以生产者、消费者模式来区分,我们属于消费者。
总结:
- 正向代理,我们的角色是 被代理者
- 正向代理,我们不对外提供服务,反而是对外消费服务,属于消费者
(2)正向代理实例解析
nginx在正向代理方面的应用非常地少,因此,对于正向代理的相关配置指令也不多。
server {
resolver 192.168.1.1; ##指定DNS服务器IP地址
listen 8080; ##监听浏览器请求的端口号
location / {
proxy_pass http://$http_host$request_uri; ##设定代理服务器的协议和地址
}
}
2、反向代理
(1)概念:反向代理,很显然,就是和正向代理相反。
image.png
看完上面的图片,请你想象一下这么一个场景,假设你现在是某公司技术总监,你们公司需要对外提供一套web服务,那么你打算怎么做呢?
答案是可以通过反向代理来完成。通常你们公司拥有自己的IDC机房,机房通讯通常采用局域网交换机,internet网用户请求是无法直接访问到局域网内的web服务的,因此这个时候,你需要一台反向代理服务器来接收internet web请求,然后将请求分发到局域网中的不同主机上进行处理,处理完成之后再做出响应。因此,反向代理大概就是这么一个场景。请记住,反向代理中,我们的角色是 局域网 web服务。
总结:
- 反向代理,我们的角色是 局域网 web服务
- 反向代理,我们对外提供服务,属于服务提供者
(2)反向代理实例解析
server {
listen 80;
location /demo {
proxy_pass http:##127.0.0.1:8081;
}
location /demo1 {
proxy_pass http:##127.0.0.1:8082;
}
}
上面proxy_pass指令配置的url为http://127.0.0.1:8081,注意在该url后面不能使用/demo1后缀进行代替,否则就报错了。为什么呢?首先nginx会判断proxy_pass指令中配置的url地址是否包含uri,如果在proxy_pass指令中配置的url地址不包含uri,那么nginx将会使用请求路径的uri进行转发,如果在proxy_pass指令中配置的url地址包含uri,则nginx会忽略请求location中的uri,转而使用你在proxy_pass中配置的uri进行覆盖。
For Example:
假设请求地址为:http://localhost/demo/getServerInfo.json,location配置为/demo,proxy_pass配置为http://xxxx:port,则会使用http://xxxx:port/demo/getServerInfo.json进行转发,结果正确。如果proxy_pass配置为http://xxxx:port/demo1,则会使用http://xxxx:port/demo1进行转发,因为/demo1覆盖了/demo
三、Nginx的负载均衡
1、相对均衡策略
说到负载均衡,其实它天生就是不公平的。为什么这么说呢?请你想象这么一个场景,一块蛋糕切成5份,现在要将它分给A、B、C3个人,基于公平原则,我们说每个人正常可以分到5/3份,但是,5/3份很明显不好进行划分,诶碰巧这个时候A中午没有吃饭,能多吃几份,B、C肚子偏饱,1份即可,基于不公平原则,我们分给A3份蛋糕,B、C个一份,这样按照一定策略将资源进行划分的方式,是一种均衡的策略。
在web应用中,一个web应用(或者说某个服务)在生产环境中一般是集群部署,然后采用负载均衡硬件或者软件(nginx)将请求分发到不同的服务主机中进行处理,很明显,这里的蛋糕就相当于我们的web request,假设有5个request进来,基于一定的均衡策略,我们可能会将其中的3个request交给A服务器去处理,B、C服务器各处理1个request。下面我画张图片简单说明这个模型:
那么使用负载均衡有什么好处呢?首先优化资源利用率,最大化吞吐量,减少延迟,再者系统的伸缩性和可靠性也得到了相应的保障。
2、Nginx 负载均衡及相关策略介绍
负载均衡技术少不了相关的均衡策略,Nginx 中提供了 4 种均衡策略,我们可以根据具体的业务场景选择合适的均衡策略。下面分别介绍这 4 中均衡策略:
(1)基于轮询的均衡策略
顾名思义,就是说对进到nginx的request按照遍历的方式进行分发,如果request 1 分发到 Server A,那么request 2将被分发到 Server B......以此循环类推
- 这个是Nginx默认的均衡算法,如果你不进行相关的配置,默认会执行该策略,配置如下:
http {
//定义后端集群,集群实例名称myapp1
upstream myapp1 {
server srv1.example.com;//服务器1
server srv2.example.com;//服务器2
server srv3.example.com;//服务器3
}
server {
listen 80;//访问端口
//对于所有符合/的request,将会交给集群http://myapp1进行处理
location / {
proxy_pass http://myapp1;
}
}
}
缺点:不能防止某台Server出现负载过高的情况。因为如果有些请求执行时间过长,而系统的并发量却非常大,那么就可能导致某台Server出现request堆积,负载过高
(2)基于最少连接数的均衡策略:
最少连接,也就是说nginx会判断后端集群服务器中哪个Server当前的 Active Connection 数是最少的,那么对于每个新进来的request,nginx将该request分发给对应的Server.
- 该策略主要使用了least_conn指令,具体配置如下:
upstream myapp1 {
least_conn;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
该策略还是比较人性化的,可以按照机器的实际情况进行刚需分配。
(3)基于ip-hash的均衡策略:
我们都知道,每个请求的客户端都有相应的ip地址,该均衡策略中,nginx将会根据相应的hash函数,将每个请求的ip作为关键字,得到的hash值将会决定将请求分发给相应Server进行处理
- 当然了,如果我们想实现这样一个功能,我们想让对于相同客户端的请求每次都被分发到同一个Server进行处理,上面两种策略都是不做到。此策略可确保来自同一客户端的请求始终定向到同一服务器,但此服务器不可用时除外。相关配置如下:
upstream myapp1 {
ip_hash;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
既然相同客户端的请求能被同一台Server进行处理,那么相同客户端的会话Session就可以实现持久化了。
(4)基于加权轮询的均衡策略:
加权轮询,很显然这个策略跟我们开题引入的场景是一样的,nginx会给Server配置相应的权重,权重越大,接收的request数将会越多。
- 基于加权轮询的策略就不需要过多讲解了,就是在轮询的基础上加上个权重信息
upstream myapp1 {
server srv1.example.com weight=3;
server srv2.example.com;
server srv3.example.com;
}
这种策略适合Server机器处理能力有区别的情况。
注:本文转载于掘金网,作者:拥抱心中的梦想
网友评论