Nginx-使用以及几种负载均衡算法

Nginx-使用以及几种负载均衡算法文章目录Nginx(enginex)Nginx能做什么?1.正向代理2.反向代理3.HTTP服务器(动静分离等)4.负载均衡负载均衡模块-upstreamupstream负载均衡算法:轮询(roundrobin)加权轮询(WeightedRoundRobin)IP_Hashfair(第三方)url_hash(第三方)Nginx配置文件Nginxlocation匹配规则Nginx(enginex)是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

Nginx (engine x)

是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。

Nginx 能做什么?

1. 正向代理

正向代理服务器是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。

比较典型的例子就是VPN服务器,用户可以利用代理用户器穿过防火墙来访问外部网络,如下图:

内部Client1

VPN服务器

内部Client2

内部Client3

防火墙外的网站资源

通俗来说就是:用户通过BOSS直聘平台来直接跟BOSS聊,找工作,相当于BOSS直聘这个平台是代理服务器,而BOSS则是后端服务器

2. 反向代理

反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。

同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。

Client1

反向代理服务器

Client2

Client3

Server1

Server2

Server3

真实服务器地址不能被外界所访问,所以需要通过一台代理服务器来访问内部资源,相当于外界提供的一个接口

3. HTTP 服务器(动静分离等)

Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以用Nginx来做服务器。就像现在比较流行的动静分离,将动态资源和静态资源根据一定的规则来区分开,这样我们就可以根据静态资源特点来对它进行缓存。

对于静态资源比如图片,js,css等文件,我们则在反向代理服务器nginx中进行缓存。这样浏览器在请求一个静态资源时,代理服务器nginx就可以直接处理,无需将请求转发给后端服务器tomcat。

若用户请求的动态文件,比如servlet,jsp则转发给Tomcat服务器处理,从而实现动静分离。这也是反向代理服务器的一个重要的作用。

Client1

反向代理服务器

Client2

Client3

JSP

JS-CSS-JPG

Tomcat

静态资源

4. 负载均衡

将请求通过某些负载均衡算法来分摊到某个指定的服务器上进行处理

负载均衡模块-upstream

用于从”upstream”指令定义的后端主机列表中选取一台主机。
nginx先使用负载均衡模块找到一台主机,再使用upstream模块实现与这台主机的交互。

关于upstream的关键词:

1.down 表示单前的server暂时不参与负载

2.weight 默认为1.weight越大,负载的权重就越大。

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

4.fail_timeout:max_fails次失败后,暂停的时间。

5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
ip_hash;
server 192.168.0.12:9090 down; (down 表示单前的server暂时不参与负载)
server 192.168.0.12:8080 weight=2; (weight 默认为1.weight越大,负载的权重就越大)
server 192.168.0.12:6060;
server 192.168.0.12:7070 backup; (其它所有的非backup机器down或者忙的时候,请求backup机器) 

    #负载均衡
    upstream sunsite{ 
   
        server 192.168.0.12:80;
        server 192.168.0.12:81;
    }
    
	server { 
   
            server_name 192.168.1.102;
            #反向代理
            location /main/ { 
   
                    #配置upstream名称
                    proxy_pass http://sunsite/;
            }
    }
upstream 负载均衡算法:

负载均衡服务器的实现可以分成两个部分:

1、根据负载均衡算法和web服务器的IP列表来计算得到集群中某一台服务器的IP

2、将请求数据发送到该地址对应的服务器;

轮询(round robin)

默认按照轮询(Round Robin)的方式进行负载均衡,每个请求按照IP顺序分配到不同的后端服务器,会维护一个服务器列表,如果后端服务器down掉,可以将down掉的服务器剔除。

Nginx 会进行服务器健康状态监测,如果某台服务器挂掉了,用户请求就不会再跳转到挂掉的服务器上,避免了出现影响使用的情况

    upstream sunsite{ 
   
        server 192.168.0.12:80;
        server 192.168.0.12:81;
    }

缺点是可靠性低,和负载分配不均衡(如果后端服务器性能不一致的话)

加权轮询(Weighted Round Robin)

针对每台后端服务器性能不一致的情况,可以对性能较好的服务器进行侧重分配用户请求,对性能不高的服务器分配少一些用户请求:

    upstream sunsite{ 
   
        server 192.168.0.12:80 weight=7;
        server 192.168.0.12:81 weight=3;
    }

指定轮询几率,权重为 7 的A服务器访问几率会比权重为 3 的B服务器大

大概是10次 会访问7次A,剩下的3次才访问B

IP_Hash

根据请求来源的IP地址进行Hash计算,得到后端服务器,这样来自同一个IP的请求总是会落到同一台服务器上处理,以致于可以将请求上下文信息存储在这个服务器上,

同一个会话周期内共享使用(共享Session),实现会话粘滞

    upstream sunsite{ 
   
        ip_hash
        server 192.168.0.12:80;
        server 192.168.0.12:81;
    }
fair(第三方)

The Nginx fair proxy balancer enhances the standard round-robin load balancer provided
with Nginx so that it will track busy back end servers (e.g. Thin, Ebb, Mongrel)
and balance the load to non-busy server processes.

GitHub

fair采用的不是内建负载均衡使用的轮换的均衡算法,而是可以根据页面大小、加载时间长短智能的进行负载均衡。,也就是根据后端服务器时间来分配用户请求,响应时间短的优先分配。具体没研究过

    upstream sunsite { 
    
        fair; 
        server 192.168.0.12;
        server 192.168.0.12;
    } 
url_hash(第三方)

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

Nginx 配置文件

worker_processes  1; # 工作进程数,一般情况下可以和CPU核心数保持一致
error_log # nginx的错误日志
pid #启动的PID

events { 
   
    worker_connections  1024; # 每个进程的最大连接数
}

http { 
   
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;  # 高效率传输文件的模式 
    keepalive_timeout  65; # 客户端请求超时时间

    server { 
   
        listen       80;    #默认访问的端口80
        server_name  localhost;  #地址

        #优先级,优先匹配符合最高的,次优先级 ^~ /a,第三优先级为正则表达式,第四优先级为/
        location / { 
           
            root   html;
            index  index.html index.htm;
        }
        
        #当访问/a的时候,优先匹配/a,当访问/a/b的时候,优先匹配/
        location =/a { 
   
            root   html;
            index  index.html index.htm;
        }

        #当访问/a的时候,优先匹配/a,当访问/a/b的时候,优先匹配^~ /a
        location ^~ /a { 
           
            root   html;
            index  index.html index.htm;
        }   
        
        #当访问/a的时候,优先匹配/a,当访问/a/b的时候,优先匹配^~ /a,当访问/b的时候,优先匹配~ /\w 
        #PS:/w匹配的是数字、字母、下划线 3种类型
        location ~ /\w { 
           
            root   html;
            index  index.html index.htm;
        }     
        
        #当访问/a的时候,优先匹配/a,当访问/a/b的时候,优先匹配^~ /a,当访问/b的时候,优先匹配~ /\w 
        #PS:当有两条匹配规则都能匹配上的时候,写在前面的会先匹配
        location ~ /[a-z] { 
        
            root   html;
            index  index.html index.htm;
        }
        
        error_page   500 502 503 504  /50x.html; #错误页面,当出现以上错误状态码的时候,转到50.html
        location = /50x.html { 
   
            root   html;
        }

    }
    #负载均衡
    upstream sunsite{ 
   
        server 192.168.0.12:80 weight=1;
        server 192.168.0.12:81 weight=1;
    }
    
	server { 
   
            server_name 192.168.1.102;
            #反向代理
            location /main/ { 
   
                    proxy_pass http://sunsite/;
            }
    }
}

Nginx location匹配规则

  • location = /uri

= 表示精确匹配,只有完全匹配上才能生效

  • location ^~ /uri

^~ 开头对URL路径进行前缀匹配,并且在正则之前。

  • location ~ pattern

开头表示区分大小写的正则匹配

  • location ~* pattern

开头表示不区分大小写的正则匹配

  • location /uri

不带任何修饰符,也表示前缀匹配,但是在正则匹配之后

  • location /

通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default

在这里插入图片描述
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/184012.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java缓存设置_缓存数据可以清除吗

    java缓存设置_缓存数据可以清除吗1、@Cacheable(key="#vo.toString()",value="licence")//载入缓存2、@CacheEvict(key="#vo.toString()",value="licence")//清除缓存3、缓存设置在service层生效4、config目录下建ehcache.xml5、ehcache.xml配置如下<ehcachex…

    2022年10月4日
    2
  • stm32蓝牙模块控制小车_51单片机蓝牙控制小车

    stm32蓝牙模块控制小车_51单片机蓝牙控制小车STM32库函数开发系列文章目录第一篇:STM32F103ZET6单片机双串口互发程序设计与实现第二篇:最简单DIY基于STM32单片机的蓝牙智能小车设计方案文章目录STM32库函数开发系列文章目录前言一、最简单DIY基于STM32单片机的蓝牙智能小车设计方案是什么?二、使用步骤1.准备硬件2.准备一个串口通信的代码3.修改源码三、运行与调试总结前言    daodanjishui物联网核心原创技术之最简单DIY基于STM32单片机的蓝牙智能小车设计方案。    市面上有各种开源STM3

    2022年10月10日
    2
  • @RequestBody的使用[通俗易懂]

    @RequestBody的使用[通俗易懂]提示:建议一定要看后面的@RequestBody的核心逻辑源码以及六个重要结论!本文前半部分的内容都是一些基本知识常识,可选择性跳过。声明:本文是基于SpringBoot,进行的演示说明。基础知识介绍:@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);GET方式无请求体,所以使用@RequestBo…

    2022年4月27日
    74
  • GridView编辑删除操作

    GridView编辑删除操作

    2021年11月28日
    49
  • 知识图谱(二)——知识推理

    知识图谱(二)——知识推理知识推理是知识图谱中很重要的一部分,主要用于推理暗含的知识(丰富知识图谱),检查知识库的不一致(知识清洗)知识推理分类演绎推理从一般到特殊的过程.从一般性的前提出发,通过推导,得到具体描述或个别结论(三段论),结论已经蕴含一般性知识中,只是通过演绎推理揭示出来,不能得到新知识.归纳推理从特殊到一般的推理过程.从一类事物的大量特殊事例出发,去推出该类事物的一般性结论(数学归纳法)…

    2022年6月1日
    62
  • Maven pom.xml

    Maven pom.xml

    2021年8月29日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号