• 关于Nginx负载均衡理解与相应配置。


    1.先说一下为什么要用Nginx服务器。

    一个访问量小的Web工程项目。tomcat服务器就足够了 。但是如果访问量达到了几千甚至上万那tomcat服务器反应就很慢了。

    就比如某大学的服务器,最高同时在线也就1000多人。每每到了学校进行选课的时候服务器总是瘫痪。

    那我们怎么解决这个问题呢?

    有人说多买个服务器不就好了。

    是,不错,方法虽然很直接但是很有用。

    如果领导不批准呢?你怎么办?说你解决不了?

    硬件不同意,那就来软件呗。

    不错,接下来我们来了解一下另一款web服务器。

    Nginx(其他还有 HAProxy、LVS、Apache 可以先自己去了解。我先讨论一下Nginx)

    下载了Nginx之后先进入他的根目录(这里说的是linux服务器下的操作方式)

    1 cd /usr/local/nginx/
    2 cd conf/
    3 vi nginx.conf

    然后在配置文件下找到server节点

    listen: 9090; #是我们代理后要访问的端口
    server_name: localhost; #指定访问的连接
    location / {
    root html; #这里配置我们要访问的根目录
    index index.html; #这里配置我们自己的反向代理。
    }

    location /test {
    proxy_pass http://192.168.1.105:8086/;
    proxy_redirect http://host:8086 http://$host:$server_port
    }

    关于proxy_pass的详解可以链接:https://blog.csdn.net/zhongzh86/article/details/70173174

    关于proxy_redirect的详解可以链接:https://blog.csdn.net/bjsunwei/article/details/73481359

    2.接下来写内置负载策略

    负载策略就是我们的拿手好戏。也是使用Nginx的目的。

    之前我们说:要解决访问量较大而导致的服务器响应时间变长的问题。

    细细分析主要是所有请求都堆积到一个服务器甚至一个端口导致的。

    知道了问题那就想想解决办法呗:

    1.把服务分摊到多个服务器。

    此时问题又来了:我怎么分摊?

    用计算机思维就是遇到什么情况我进行分摊?

    举个例子:

    我可以想方法弄到访问每个服务器的次数,然后看谁最少我再把请求分发给哪个服务器。

    接下来介绍Nginx的解决方法:

    • 轮循(默认)
      Nginx根据请求次数,将每个请求均匀分配到每台服务器
    • 最少连接
      将请求分配给连接数最少的服务器。Nginx会统计哪些服务器的连接数最少。
    • IP Hash
      绑定处理请求的服务器。第一次请求时,根据该客户端的IP算出一个HASH值,将请求分配到集群中的某一台服务器上。后面该客户端的所有请求,都将通过HASH算法,找到之前处理这台客户端请求的服务器,然后将请求交给它来处理。

    第一个叫轮循,也是Nginx默认的

    http {
    
        # ... 省略其它配置
    
        upstream tomcats {
            server 192.168.0.100:8080;
            server 192.168.0.101:8080;
            server example.com:8080;
        }
    
        server {
            listen 80;
    
            location / {
                proxy_pass http://tomcats;
            }
        }
    
        # ... 省略其它配置
    }

    proxy_pass http://tomcats:表示将所有请求转发到tomcats服务器组中配置的某一台服务器上。

    upstream模块:配置反向代理服务器组,Nginx会根据配置,将请求分发给组里的某一台服务器。tomcats是服务器组的名称。

    upstream模块下的server指令:配置处理请求的服务器IP或域名,端口可选,不配置默认使用80端口。通过上面的配置,Nginx默认将请求依次分配给100,101,102来处理,可以通过修改下面这些参数来改变默认的分配策略。

    • weight 默认为1,将请求平均分配给每台server。
    1 upstream tomcats {
    2     server 192.168.0.100:8080 weight=2;  # 2/6次
    3     server 192.168.0.101:8080 weight=3;  # 3/6次
    4     server 192.168.0.102:8080 weight=1;  # 1/6次
    5 }

    上例配置,表示6次请求中,100分配2次,101分配3次,102分配1次。

    • max_fails

      默认为1。某台Server允许请求失败的次数,超过最大次数后,在fail_timeout时间内,新的请求将不会分配给这台机器。如果设置为0,Nginx会将这台Server置为永久无效状态,然后将请求发给定义了proxy_next_upstream, fastcgi_next_upstream, uwsgi_next_upstream, scgi_next_upstream, and memcached_next_upstream指令来处理这次错误的请求。

    • fail_timeout

      默认为10秒。某台Server达到max_fails次失败请求后,在fail_timeout期间内,nginx会认为这台Server暂时不可用,不会将请求分配给它。

    1 upstream tomcats {
    2     server 192.168.0.100:8080 weight=2 max_fails=3 fail_timeout=15;
    3     server 192.168.0.101:8080 weight=3;
    4     server 192.168.0.102:8080 weight=1;
    5 }

    192.168.0.100这台机器,如果有3次请求失败,nginx在15秒内,不会将新的请求分配给它。

    • backup 备份机,所有服务器挂了之后才会生效。
    1 upstream tomcats {
    2     server 192.168.0.100:8080 weight=2 max_fails=3 fail_timeout=15;
    3     server 192.168.0.101:8080 weight=3;
    4 
    5     server 192.168.0.102:8080 backup;
    6 }

    在100和101都挂了之前,102为不可用状态,不会将请求分配给它。只有当100和101都挂了,102才会被启用。

    • down 标识某一台server不可用。可能能通过某些参数动态的激活它吧,要不真没啥用。
    复制代码
    1 upstream tomcats {
    2     server 192.168.0.100:8080 weight=2 max_fails=3 fail_timeout=15;
    3 
    4     server 192.168.0.101:8080 down;
    5 
    6     server 192.168.0.102:8080 backup;
    7 }
    复制代码

    表示101这台Server为无效状态,不会将请求分配给它。

    • max_conns 限制分配给某台Server处理的最大连接数量,超过这个数量,将不会分配新的连接给它。默认为0,表示不限制。注意:1.5.9之后的版本才有这个配置。
    1 upstream tomcats {
    2     server 192.168.0.100:8080 max_conns=1000;
    3 }

    表示最多给100这台Server分配1000个请求,如果这台Server正在处理1000个请求,nginx将不会分配新的请求给到它。假如有一个请求处理完了,还剩下999个请求在处理,这时nginx也会将新的请求分配给它。

    • resolve 将server指令配置的域名,指定域名解析服务器。需要在http模块下配置resolver指令,指定域名解析服务。
    复制代码
    1 http {
    2     resolver 10.0.0.1;
    3 
    4     upstream u {
    5         zone ...;
    6         ...
    7         server example.com resolve;
    8     }
    9 }
    复制代码

    表示example.com域名,由10.0.0.1服务器来负责解析。

    第二个叫fair也叫最少链接

    根据服务器的响应时间来分配请求,响应时间短的优先分配,即负载压力小的优先会分配。

    由于fair模块是第三方提供的,所以在编译nginx源码的时候,需要将fair添加到nginx模块中。

    解压后的目录名为:nginx-upstream-fair-master

    重新编译nginx,将fair模块添加到编译参数
    我的nginx源码目录在/opt/nginx-1.10.0

    1 cd /opt/nginx-nginx-1.10.0
    2 ./configure --prefix=/opt/nginx --add-module=/opt/nginx-upstream-fair-master
    3 make

    将新编译的nginx可执行程序拷贝到/opt/nginx/sbin/目录下,覆盖之前安装的nginx
    编译后的nginx执行程序,放在nginx源码的objs目录下

    1 ps -aux | grep nginx
    2 kill -9 nginx进程ID  # 停止nginx服务
    3 cp /opt/nginx-1.10.0/objs/nginx /opt/nginx/sbin/  # 覆盖旧的nginx
    4 nginx # 启动服务

    配置使用fair负载策略模块:

    1 upstream tomcats {
    2     fair;
    3     server 192.168.0.100:8080;
    4     server 192.168.0.101:8080;
    5     server 192.168.0.102:8080;
    6 }
     
    第三个叫url_hash,也就是IP hash

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

    1 upstream tomcats {
    2     server 192.168.0.100:8080;
    3     server 192.168.0.101:8080;
    4     server 192.168.0.102:8080;
    5     hash $request_uri;
    6 }

    文献来源:https://blog.csdn.net/xyang81/article/details/51702900

    中国男儿当自强不息,厚德载物。
  • 相关阅读:
    默认使用什么序列化框架,你知道的还有哪些?
    一般使用什么注册中心?还有别的选择吗?
    Dubbo 的整体架构设计有哪些分层?
    Java 中是如何支持正则表达式操作的?
    Dubbo 集群容错有几种方案?
    Dubbo 推荐用什么协议?
    说说核心的配置有哪些?
    Dubbo 如何优雅停机?
    Dubbo 必须依赖的包有哪些?
    服务上线怎么兼容旧版本?
  • 原文地址:https://www.cnblogs.com/zhznb/p/9280939.html
Copyright © 2020-2023  润新知