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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ER图(实体-联系图)「建议收藏」

    ER图(实体-联系图)「建议收藏」概念E-R图也称实体-联系图(EntityRelationshipDiagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型。构成ER图有实体(entity)、属性(attribute)、关系(relationship)三部分。用“矩形框”表示实体型,矩形框内写明实体名称;用“椭圆框”表示实体的属性,将属性名记入框中;用”菱形框“表示实体型之间的关系,在菱形…

    2022年9月22日
    4
  • Mac安装 yarn

    Mac安装 yarnMac安装yarnMac安装yarn一、按照提示安装gcc二、解决gcc错误的方法三、安装yarn四、配置VPN后,再次安装yarn五、下载yarn的tar.gz包,进行离线安装。Mac安装yarnMac升级到10.15.4之后,Xcode也升级到Version11.4.1(11E503a),终端下执行brewinstallyarn进行yarn安装,最后报错gcc错误。…

    2022年5月9日
    733
  • 电视处理器a53和a55哪个厉害(cortexa55处理器好吗)

    小编语:手机处理器从32位向64位的迁移过程中,功耗增加以及给手机厂商带来的散热成为一个很大的问题。目前Cortex-A57已经是64位手机处理器芯片的主流内核,它的功耗不降下来,更多手机功能的开发可能受限于系统总功耗而无法实现,ARM这次推出的Cortex-A35显然在这方面下了不少功夫,究竟能给手机厂商带来多少实惠,还要等终端产品推出后才见分晓……64位元处理器应用版图…

    2022年4月13日
    751
  • 图遍历问题

    图遍历问题图遍历问题分为四类遍历完所有的边而不能有重复,即所謂“一笔画问题”或“欧拉路径”;遍历完所有的顶点而没有重复,即所谓“哈密尔顿问题”。遍历完所有的边而可以有重复,即所谓“中国邮递员问题”;遍历完所有的顶点而可以重复,即所谓“旅行推销员问题”。对于第一和第三类问题已经得到了完满的解决,而第二和第四类问题则只得到了部分解决。第一类问题就是研究所谓的欧拉图的性质,而第二类问题则是…

    2022年6月4日
    77
  • charles抓包教程(微信7以上如何抓包)

    APP抓包和微信小程序抓包-Charles的精简使用教程目标教程一、安装Charles二、Charles简介(1)Charles欢迎页面(2)基础功能按钮(3)抓包内容显示方式(4)过滤抓包内容三、手机配置Charles代理四、解决配置Charles代理之后手机无法上网的问题五、手机APP抓包(1)对“花生地铁”APP进行抓包。六、微信小程序抓包(1)安装SSL…

    2022年4月12日
    956
  • 并发编程面试题(2020最新版)「建议收藏」

    文章目录基础知识并发编程的优缺点为什么要使用并发编程(并发编程的优点)并发编程有什么缺点并发编程三要素是什么?在Java程序中怎么保证多线程的运行安全?并行和并发有什么区别?什么是多线程,多线程的优劣?线程和进程区别什么是线程和进程?进程与线程的区别什么是上下文切换?守护线程和用户线程有什么区别呢?如何在Windows和Linux上查找哪个线程cpu利用率最高?什么是线程死锁形成死锁的…

    2022年4月18日
    41

发表回复

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

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