负载均衡(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;
} 