nginx集群系列(三):nginx集群中的负载均衡实现方式【六种负载方式的实现】

艺帆风顺 发布于 2025-04-02 17 次阅读


一、需求背景

    Nginx集群模式已经创建,需要配置负载均衡,使用户的请求被分配到俩台服务器访问。

    Master:192.168.1.137:80

    Slave:192.168.1.138:80

    统一负载访问入口:192.168.1.137:88

基础配置如下:

    user  root root;worker_processes 1;worker_rlimit_nofile 65535;error_log   /data/nginx/logs/error.log  warn;events {    worker_connections  1024;}http {    include       mime.types;    default_type  application/octet-stream;    sendfile        on;    upstream fz {        ip_hash;        fair;        server 192.168.1.137:80 weight=1;        server 192.168.1.138:80 weight=4;    }        server {            listen 88;            server_name  localhost;            location / {                proxy_pass http://fz;                         proxy_set_header Host $host;                     }        }    keepalive_timeout  65;    client_max_body_size 100M;    client_body_buffer_size 1M;    fastcgi_connect_timeout 300;    fastcgi_send_timeout 300;    fastcgi_read_timeout 300;    include /data/nginx/conf/*.conf;    proxy_connect_timeout       600;    proxy_send_timeout          600;    proxy_read_timeout          600;    send_timeout                600;}

    核心配置参数如下:

          upstream fz {        ip_hash;        fair;        server 192.168.1.137:80 weight=1;        server 192.168.1.138:80 weight=4;    }
                server {            listen 88;            server_name  localhost;            location / {                proxy_pass http://fz;                         proxy_set_header Host $host;                     }

        通过调整该配置中的upstream模块配置,实现各种不同方式的负载。

        二、默认RR(round-robin)简单轮询

             upstream fz {        server 192.168.1.137:80;        server 192.168.1.138:80;    }

              每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

          三、权重负载

                upstream fz {        server 192.168.1.137:80 weight=1;        server 192.168.1.138:80 weight=4;    }

                表示用户每访问5次,其中有4次访问到Server 192.168.1.138:80有1次访问到 Server 192.168.1.137:80。

                该方式指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

            四、IP-Hash负载

                上面俩种方式:程序如果采用了session保存数据,则会导致会话丢失,用户重新登陆等问题,故需要一个客户只访问一个服务器。

                 upstream fz {        ip_hash;        server 192.168.1.137:80 weight=1;        server 192.168.1.138:80 weight=4;    }

                  该方式实现了一个客户端IP,访问到一个服务端,会话Session不会因为刷新而改变

              五、Fair(第三方)负载均衡

              1、下载fair

                  官方下载地址:https://github.com/gnosek/nginx-upstream-fair

                  上传到//usr/local/目录下,并解压。

               2、编译添加该模块

                  因该服务器已经安装过nginx,故需要新增编译该模块。

                  首先使用nginx -V查看当前已经编译的模块,在后面新增该参数。

                  --add-module=/usr/local/nginx-upstream-fair-master  

                  进入nginx的编译目录,执行以下命令:

              ./configure --prefix=/usr/local/Yinling/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-http_random_index_module --with-http_gzip_static_module   --add-module=/usr/local/nginx-upstream-fair-master

               3、处理编译过程中的报错

              报错信息如下:

              ngx_http_upstream_srv_conf_t’没有名为‘default_port’的成员”

               报错解决方法为

              sed -ri "s/default_port/no_port/g" /usr/local/nginx-upstream-fair-master/ngx_http_upstream_fair_module.c

              4、编译后的nginx替换原Nginx

              cp nginx /usr/local/nginx/sbin/

              5、配置fair负载

                   upstream fz {        fair;        server 192.168.1.137:80;        server 192.168.1.138:80;    }

                    按响应时间来分配请求,响应时间短的优先分配,动态调整服务器的权重

                五、URL_Hash负载

                      upstream fz {        hash $request_uri consistent;        server 192.168.1.137:80;        server 192.168.1.138:80;    }

                      nginx 1.7.2版本后,已经集成了url hash功能,可直接使用,不需要再安装三方模块。

                      url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再此收到请求,就可以从缓存中读取

                      Consistent表示使用一致性hash算法。

                  六、least_conn调度负载

                       upstream fz {        least_conn;        server 192.168.1.137:80;        server 192.168.1.138:80;    }
                    least_conn调度算法:调度至客户端连接数最小的节点服务器。

                    假设∶

                    192.168.1.137:80节点有10个连接、192.168.1.138:80节点有5连接,此时新的连接进入会分发给b节点。