本文作者:心月

Nginx服务器负载均衡的配置方法

心月IT博客 10-13
Nginx服务器负载均衡的配置方法摘要:负载均衡(Load Balance)其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

        负载均衡(Load Balance)其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

        负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。同时,负载均衡也是解决高并发问题常用的策略。

负载均衡的实现图解

1、负载均衡的作用

①转发功能

        按照一定的算法【权重、轮询】,将客户端请求转发到不同应用服务器上,减轻单个服务器压力,提高系统并发量。

②故障移除

        通过心跳检测的方式,判断应用服务器当前是否可以正常工作,如果服务器期宕掉,自动将请求发送到其他应用服务器。

③恢复添加

        如检测到发生故障的应用服务器恢复工作,自动将其添加到处理用户请求队伍中。


2、负载均衡的实现策略

同样使用两个tomcat模拟两台应用服务器,端口号分别为8080 和8081

①Nginx的负载分发策略

      Nginx 的 upstream目前支持的分配算法: 
        1)、轮询 ——1:1 轮流处理请求(默认)

      每个请求按时间顺序逐一分配到不同的应用服务器,如果应用服务器宕掉,自动剔除,剩下的继续轮询。 
        2)、权重 ——you can you up
      通过配置权重,指定轮询几率,权重和访问比率成正比,用于应用服务器性能不均的情况。 
        3)、ip_哈希算法
      每个请求按访问ip的hash结果分配,这样每个访客固定访问一个应用服务器,可以解决session共享的问题。 

②配置Nginx的负载均衡与分发策略

      通过在upstream参数中添加的应用服务器IP后添加指定参数即可实现,如:

upstream my.com{  
    server 127.0.0.1:81 weight=3;  
    server 127.0.0.1:82;
} 

server {
        listen       80;
        server_name  nginx.com ;
        root   "D:\\PHP\WWW\\nginx.com";
         
        location / {
            index  index.html index.htm index.php;
            #autoindex  on;
            proxy_pass http://my.com;
        }
        location ~ \.php(.*)$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_param  PATH_INFO  $fastcgi_path_info;
            fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
            include        fastcgi_params;
        }
}

        通过以上配置,便可以实现,在访问nginx.com这个网站时,由于配置了proxy_pass地址,所有请求都会先通过nginx反向代理服务器,在服务器将请求转发给目的主机时,读取upstream为 my.com的地址,读取分发策略,配置tomcat1权重为3,所以nginx会将大部分请求发送给服务器上的tomcat1,也就是81端口;较少部分给tomcat2来实现有条件的负载均衡,当然这个条件就是服务器1、2的硬件指数处理请求能力。 


下面来看一个负载均衡配置实现的实例:

一台负载服务器,4台均衡服务器(由于是本地实验,所以这4台均衡服务器是通过指定不同的端口来模拟的,在实际项目中直接换成对应服务器的 ip 和端口号就可以了,结果和效果是一样的)

负载服务器的配置:

//my.com 可以自己任意命名,但需要跟proxy_pass 后面的域名保持一致
upstream my.com {  
    server 127.0.0.1:81;  
    server 127.0.0.1:82;
    server 127.0.0.1:83;
    server 127.0.0.1:84;
} 

server {
        listen       80;
        server_name  nginx.com ;
        root   "D:\\PHP\WWW\\nginx.com";
         
        location / {
            index  index.html index.htm index.php;
            #autoindex  on;
            proxy_pass http://my.com;
        }
        location ~ \.php(.*)$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_param  PATH_INFO  $fastcgi_path_info;
            fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
            include        fastcgi_params;
        }
}

4台负载服务器的配置:

#第一台负载服务器
server {
        listen       81;
        server_name  nginx1.com ;
        root   "D:\\PHP\WWW\\nginx1.com";
         
        location / {
            index  index.html index.htm index.php;
            #autoindex  on;
        }
        location ~ \.php(.*)$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_param  PATH_INFO  $fastcgi_path_info;
            fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
            include        fastcgi_params;
        }
}

#第二台负载服务器
server {
        listen       82;
        server_name  nginx2.com ;
        root   "D:\\PHP\WWW\\nginx2.com";
         
        location / {
            index  index.html index.htm index.php;
            #autoindex  on;
        }
        location ~ \.php(.*)$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_param  PATH_INFO  $fastcgi_path_info;
            fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
            include        fastcgi_params;
        }
}

#第三台负载服务器
server {
        listen       83;
        server_name  nginx3.com ;
        root   "D:\\PHP\WWW\\nginx3.com";
         
        location / {
            index  index.html index.htm index.php;
            #autoindex  on;
        }
        location ~ \.php(.*)$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_param  PATH_INFO  $fastcgi_path_info;
            fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
            include        fastcgi_params;
        }
}

#第四台负载服务器
server {
        listen       84;
        server_name  nginx4.com ;
        root   "D:\\PHP\WWW\\nginx4.com";
         
        location / {
            index  index.html index.htm index.php;
            #autoindex  on;
        }
        location ~ \.php(.*)$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_param  PATH_INFO  $fastcgi_path_info;
            fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
            include        fastcgi_params;
        }
}

nginx服务器的负载均衡配置就实现了,下面来看看实际效果:

(为了看负载均衡的效果,这里对每个负载均衡服务器设置的内容都不一样,在实际项目中把每台负载均衡服务器的内容同步就好了)

(从图中可以看到,每次刷新请求到的都是不同站点的内容,这里因为请求少,而且也没有对负载均衡服务器做特殊的处理,所以这里看到的效果是4个负载均衡服务器轮询出来的)

负载均衡实现效果

负载均衡服务器的其他配置参数:

1)down
    表示单前的server暂时不参与负载
2)weight
    默认为1.weight越大,负载的权重就越大。
3)max_fails
    允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
4)fail_timeout
    max_fails 次失败后,暂停的时间。
5)backup
    其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

例如:

upstream my.com {  
    server 127.0.0.1:81 weight=2;  
    server 127.0.0.1:82 down;
    server 127.0.0.1:83 backup;
    server 127.0.0.1:84;
}
文章版权及转载声明:

本文由 心月IT技术博客 博主整理于 10-13
若转载请注明原文及出处:http://www.xinyueseo.com/linux/393.html

分享到:
赞(
发表评论
快捷输入:

验证码

    评论列表 (有 0 条评论,人围观)参与讨论