1,前期准备
两个tomcat,nginx,一个测试项目
修改配置文件,能同时运行两个tomcat
修改server.xml
为了区分两个tomcat,修改对应的启动文件startup,bat
然后分别启动tomcat
分别访问测试项目
2 配置nginx
修改配置文件,将tomcat的地址给添加进去
修改nginx的监听端口(默认为80)
有的电脑开启了IIS的服务,80端口被占用
运行nginx.exe,一个窗口一闪而过
window下可以直接查看进程
然后在浏览器中输入 http://localhost:8080/nginxdemo/
刷新可能会改变
至此,一个简单的负载均衡配置完成
3 nginx配置描述
1)轮询(默认),每个web请求按时间顺序分配到不同的服务器
2)权重(设置轮询比率,用于后端服务器性能不均的情况,默认为1)
访问比率tomcat2:tomcat1为2:1,其它规则和轮询一致
3)ip_hash
使用负载均衡时需要注意session丢失的问题,可以使用ip_hash,使同一客户端连接进入到同一个服务器中,当服务器宕机时,自动跳转到其它服务器,
4)集群/分布式下的session处理策略
在搭建完分布式环境后,如果不做任何处理的话,会出现用户未登录的情况,因为假设有两台服务器A,B,nginx将用户请求发送给服务器A,A会围棋创建session,当用户再次请求时,若nginx将请求发送给服务器B,则此时会出现未登录的情况,所以必须考虑到session共享的问题
解决方法1:将用户请求和服务器绑定在一起,比如直接设置ip_hash
优点:简单,不需要对session做人恶化处理
缺点:负载不均衡了,且缺乏容错性,如果服务器宕机之后,session会丢失
解决方法2:在所有服务器上都保存用户的session信息,当任何服务器上session变化时,该节点会把session内容序列化,广播给其它所有节点
优点:各个服务器的session能实时响应
缺点:实现方式有限,必须只能在同一种组件之间实现,比如用tomcat,其它必须全部用tomcat
解决方法3:修改tomcat的session存储机制,使之能把session序列化,存放到memcached (Memcached 是一套高性能的、分布式内存对象缓存系统。)中
使用redis+tomcat+nginx实现session共享
第一步:下载插件tomcat-cluster-redis-session-manager-2.0.2.jar
下载地址:https://github.com/ran-jit/tomcat-cluster-redis-session-manager/releases/tag/2.0.2
解压之后,按照readMe的步骤配置
1)将lib中的jar包复制到tomcat/lib目录下
2)配置环境变量
3)将conf下的配置文件复制到tomcat/conf下
4)修改tomcat/conf/content.xml,增添配置
5)修改session的过期时间 (tomcat/conf/web.xml),默认为30分钟
屏蔽掉nginx的ip_hash配置
运行测试程序,注意,此时需要启动redis,否则会报错
此时会发现,无论网页怎么刷新,sessionid都是固定的
至此,session共享已经完成
使用Redis实现session共享的好处就是,把session管理放在redis中,如果服务器重启或挂机,sessionId保存在redis中,下次重启后一样生效,避免sessionId失效,同样redis最好也做集群,避免redis重启或挂机。