Nginx负载均衡

一、工具
  nginx-1.8.0(我用的是1.12.2版本)
  apache-tomcat-6.0.33(我用的是7.0.70版本)
二、目标
实现高性能负载均衡的Tomcat集群: 
在这里插入图片描述
三、步骤
1、首先下载Nginx,要下载稳定版:
在这里插入图片描述
2、然后解压两个Tomcat,分别命名为apache-tomcat-6.0.33-1和apache-tomcat-6.0.33-2:
在这里插入图片描述
3、然后修改这两个Tomcat的启动端口,分别为18080和28080,下面以修改第一台Tomcat为例,打开Tomcat的conf目录下的server.xml:
在这里插入图片描述
共需修改3处端口:
在这里插入图片描述
当然第二台Tomcat也一样,如下图: 
在这里插入图片描述
4、然后启动两个Tomcat,并访问,看是否正常: 
在这里插入图片描述
在这里插入图片描述

5、然后修改上面两个Tomcat的默认页面(为了区分下面到底访问的是那一台Tomcat,随便改一下即可): 
在这里插入图片描述
改完以后,进行访问,如下图: 
在这里插入图片描述
在这里插入图片描述

6、OK,现在我们可以开始配置Nginx来实现负载均衡了,其实非常的简单,只需要配置好Nginx的配置文件即可: 
在这里插入图片描述
配置如下(这里只进行了简单的配置,实际生产环境可以进行更详细完善配置):
worker_processes 1;#工作进程的个数,一般与计算机的cpu核数一致

events {
worker_connections 1024;#单个进程最大连接数(最大连接数=连接数*进程数)
}

http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream;#默认文件类型

sendfile        on;#开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。  
  
keepalive_timeout  65; #长连接超时时间,单位是秒  

gzip  on;#启用Gizp压缩  
  
#服务器的集群  
upstream  netitcast.com {  #服务器集群名字   
    server    127.0.0.1:18080  weight=1;#服务器配置   weight是权重的意思,权重越大,分配的概率越大。  
    server    127.0.0.1:28080  weight=2;  
}     

#当前的Nginx的配置  
server {  
    listen       80;#监听80端口,可以改成其他端口  
    server_name  localhost;##############   当前服务的域名  

location / {  
        proxy_pass http://netitcast.com;  
        proxy_redirect default;  
    }  
      

    error_page   500 502 503 504  /50x.html;  
    location = /50x.html {  
        root   html;  
    }  
}  

}
核心配置如下: 
在这里插入图片描述
到此配置完成,下面开始演示负载均衡。
7、首先,我们启动Nginx: 
在这里插入图片描述
8、然后我们即可输入:localhost/index.jsp查看运行状况了
第一次访问,发现访问的是Tomcat2上的程序: 
在这里插入图片描述
然后刷新,访问的还是Tomcat2上的程序: 
在这里插入图片描述
再刷新,发现变为了Tomcat1上的程序: 
在这里插入图片描述
再刷新,发现又变为了Tomcat2上的程序: 
在这里插入图片描述
到此,我们利用Nginx已经实现了负载均衡的Tomcat集群。我们不断的刷新,发现访问Tomcat2的概率大概是Tomcat1的2倍,这是因为我们在Nginx中配置的两台Tomcat的权重起的作用,如下图:
在这里插入图片描述

一、内置负载策略
Nginx负载均衡是通过upstream模块来实现的,内置实现了三种负载策略,配置还是比较简单的。官网负载均衡配置说明:http://nginx.org/en/docs/http/load_balancing.html
轮循(默认)
Nginx根据请求次数,将每个请求均匀分配到每台服务器
最少连接
将请求分配给连接数最少的服务器。Nginx会统计哪些服务器的连接数最少。
IP Hash
绑定处理请求的服务器。第一次请求时,根据该客户端的IP算出一个HASH值,将请求分配到集群中的某一台服务器上。后面该客户端的所有请求,都将通过HASH算法,找到之前处理这台客户端请求的服务器,然后将请求交给它来处理。
1> 轮循
http {

# ... 省略其它配置

upstream tomcats {      //服务器集群,名称为 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这里的名称必须和服务器集群的名称一致
    } 
}

# ... 省略其它配置

}
proxy_pass http://tomcats:表示将所有请求转发到tomcats服务器组中配置的某一台服务器上。
upstream模块:配置反向代理服务器组,Nginx会根据配置,将请求分发给组里的某一台服务器。tomcats是服务器组的名称。
upstream模块下的server指令:配置处理请求的服务器IP或域名,端口可选,不配置默认使用80端口。通过上面的配置,Nginx默认将请求依次分配给100,101,102来处理,可以通过修改下面这些参数来改变默认的分配策略:
weight
默认为1,将请求平均分配给每台server
upstream tomcats {
server 192.168.0.100:8080 weight=2; # 2/6次
server 192.168.0.101:8080 weight=3; # 3/6次
server 192.168.0.102:8080 weight=1; # 1/6次
}
上例配置,表示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暂时不可用,不会将请求分配给它
upstream tomcats {
server 192.168.0.100:8080 weight=2 max_fails=3 fail_timeout=15;
server 192.168.0.101:8080 weight=3;
server 192.168.0.102:8080 weight=1;
}
192.168.0.100这台机器,如果有3次请求失败,nginx在15秒内,不会将新的请求分配给它。
backup
备份机,所有服务器挂了之后才会生效
upstream tomcats {
server 192.168.0.100:8080 weight=2 max_fails=3 fail_timeout=15;
server 192.168.0.101:8080 weight=3;
server 192.168.0.102:8080 backup;
}
在100和101都挂了之前,102为不可用状态,不会将请求分配给它。只有当100和101都挂了,102才会被启用。
down
标识某一台server不可用。可能能通过某些参数动态的激活它吧,要不真没啥用。
upstream tomcats {
server 192.168.0.100:8080 weight=2 max_fails=3 fail_timeout=15;
server 192.168.0.101:8080 down;
server 192.168.0.102:8080 backup;
}
表示101这台Server为无效状态,不会将请求分配给它。
max_conns
限制分配给某台Server处理的最大连接数量,超过这个数量,将不会分配新的连接给它。默认为0,表示不限制。注意:1.5.9之后的版本才有这个配置
upstream tomcats {
server 192.168.0.100:8080 max_conns=1000;
}
表示最多给100这台Server分配1000个请求,如果这台Server正在处理1000个请求,nginx将不会分配新的请求给到它。假如有一个请求处理完了,还剩下999个请求在处理,这时nginx也会将新的请求分配给它。
resolve
将server指令配置的域名,指定域名解析服务器。需要在http模块下配置resolver指令,指定域名解析服务
http {
resolver 10.0.0.1;

upstream u {
    zone ...;
    ...
    server example.com resolve;
}

}
表示example.com域名,由10.0.0.1服务器来负责解析。
upstream模块server指令的其它参数和详细配置说明,请参考官方文档。
二、第三方负载策略
1> fair
根据服务器的响应时间来分配请求,响应时间短的优先分配,即负载压力小的优先会分配。
由于fair模块是第三方提供的,所以在编译nginx源码的时候,需要将fair添加到nginx模块中。
假设我的nginx是通过源码安装的,安装在/opt/nginx目录下,而且安装时没有添加fair模块

1> 下载fair模块源码
下载地址:https://github.com/xyang0917/nginx-upstream-fair
cd /opt
wget https://github.com/xyang0917/nginx-upstream-fair/archive/master.zip
unzip master.zip
解压后的目录名为:nginx-upstream-fair-master
2> 重新编译nginx,将fair模块添加到编译参数
我的nginx源码目录在/opt/nginx-1.10.0
cd /opt/nginx-nginx-1.10.0
./configure --prefix=/opt/nginx --add-module=/opt/nginx-upstream-fair-master
make
注意:不要执行make install,这样会覆盖之前nginx的配置
3> 将新编译的nginx可执行程序拷贝到/opt/nginx/sbin/目录下,覆盖之前安装的nginx
编译后的nginx执行程序,放在nginx源码的objs目录下
ps -aux | grep nginx
kill -9 nginx进程ID # 停止nginx服务
cp /opt/nginx-1.10.0/objs/nginx /opt/nginx/sbin/ # 覆盖旧的nginx
nginx # 启动服务
配置使用fair负载策略模块:
upstream tomcats {
fair;
server 192.168.0.100:8080;
server 192.168.0.101:8080;
server 192.168.0.102:8080;
}
由于采用fair负载策略,配置weigth参数改变负载权重将无效。
2> url_hash
按请求url的hash结果来分配请求,使每个url定向到同一个后端服务器,服务器做缓存时比较有效。
1.7.2版本以后,url_hash模块已经集成到了nginx源码当中,不需要单独安装。之前的版本仍需要单独安装,下载地址:https://github.com/evanmiller/nginx_upstream_hash
安装方法和fair模块一样,先下载url_hash源码,然后重新编译nginx源码,将url_hash模块添加到编译配置参数当中,最后将编译后生成的nginx二进制文件替换之前安装的nginx二进制文件即可。
upstream tomcats {
server 192.168.0.100:8080;
server 192.168.0.101:8080;
server 192.168.0.102:8080;
hash $request_uri;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值