实现服务代理
继上一篇 nginx基础命令 后,这次讲一下如何用nginx实现负载均衡。
场景说明:
当用户输入http://manage.jt.com/index时,访问对服务器页面。
前期准备:
1.编辑nginx配置文件
server {
listen 80;
server_name manage.jt.com;
location / {
proxy_pass http://localhost:8091;
}
}
2.Tomcat集群部署
Windows中部署tomcat集群
准备3台tomcat
修改配置文件
启动3台tomcat服务器.修改对应的端口号
-
修改8005端口
-
修改8080端口.
-
修改8009端口.
项目发布
将原有的ROOT文件删除,部署新的war包(目的是输入localhost:8080能直接访问到工程).之后重启tomcat服务
3.基于Nginx实现负载均衡
重点来了!!负载均衡常用的又轮询策略,权重策略,及hash_ip。下面将依次讲讲各种策略的配置!
3.1 轮询策略
特点:根据配置文件的顺序,依次访问不同的tomcat服务器.
配置:
#配置tomcat负载均衡 1.轮询
upstream jt {
server localhost:8091;
server localhost:8092;
server localhost:8093;
}
#后台管理系统
server {
listen 80;
server_name manage.jt.com;
location / {
proxy_pass http://jt;
}
}
说明:
upstream是轮询策略的关键字,jt是给这个轮询策略起的一个名字;
使用轮训策略,proxy_pass就不能像基础配置内那样写死某台服务器的地址,proxy_pass http://jt表示拦截用户访问manage.jt.com,会使用jt的轮询策略。
3.2 权重策略
特点:根据服务器处理能力不同,动态划分请求,处理能力越高,所处理的请求越多.
配置文件:
#配置tomcat负载均衡 1.轮询 2.权重
upstream jt {
server localhost:8091 weight=6;
server localhost:8092 weight=3;
server localhost:8093 weight=1;
}
说明:权重的关键字 weight
3.3 IP_HASH
实际问题:
采用集群的方式不能实现用户Session共享.因为不同的tomcat之间是物理隔离.如何解决???
专业术语:
Session黏着:指Session共享
解决方案:
A:采用SessionId进行URL重写.
优点:可以实现Session共享,Cookie禁用
缺点:效率太低
B:使用Nginx中IP_HASH技术.能够根据用户的IP动态的绑定到一台服务器中.变向的实现Session共享.IP_HASH中优先级最高.配置后轮询和权重不生效.
缺点:
-
如果服务器宕机,用户访问受限
-
使用IP_hash导致负载不均.
-
安全性不好
C:实现单点登录(后期学习)SSO#配置tomcat负载均衡 1.轮询 2.权重 3.ip_hash方式 upstream jt { ip_hash; server localhost:8091 weight=6; server localhost:8092 weight=3; server localhost:8093 weight=1; }
说明:ip_hash优先级最高,配置ip_hash后,权重及轮询都不会生效。
3.4 Nginx故障迁移
-
手动下线
server localhost:8091 weight=6 down; -
备用机机制
server localhost:8093 weight=1 backup; -
设定超时时间
proxy_connect_timeout 3;
proxy_read_timeout 3;
proxy_send_timeout 3; -
健康检测
说明:在规定的周期内,用户会通过健康检测.检查当前的服务器是否可用,如果发现服务器宕机.则在当前的周期内不会再将请求发往故障机.
直到下个周期.如果当故障机修复.可以在下一个周期后继续提供服务.
server localhost:8091 max_fails=1 fail_timeout=60s;
说明:max_fails 如果服务器超时达到最大次数,该服务器就会停止一个周期的服务;
fail_timeout 代表一个服务周期的时间; -
完整代码
#配置tomcat负载均衡 1.轮询 2.权重 3.ip_hash方式 upstream jt { #ip_hash; server localhost:8091 max_fails=1 fail_timeout=60s; server localhost:8092 max_fails=1 fail_timeout=60s; server localhost:8093 max_fails=1 fail_timeout=60s; } #后台管理系统 server { listen 80; server_name manage.jt.com; location / { proxy_pass http://jt; proxy_connect_timeout 3; proxy_read_timeout 3; proxy_send_timeout 3; } }