反向代理作为客户端和目标服务器的中介,接受客户端发来的请求,通过均衡策略来访问目标服务器,获取数据,返回给客户端。这是最直白的理解,那么反向代理到底时如何实现的呢?
模拟反向代理需要的配置
一台虚拟机、一个nginx服务器作为反向代理服务器、两个tomcat作为目标服务器。
实现反向代理
nginx和tomcat的安装此处就省略了。。。
1、修改Nginx.conf配置文件
upstream tomcats{
server 192.168.128.111:8080;
server 192.168.128.111:8081;
}
server {
listen 80;
server_name tomcat.taotao.com;
#charset koi8-r;
# #access_log logs/host.access.log main;
location / {
proxy_pass http://tomcats;
index index.html index.htm;
}
}
在http节点下,添加upstream节点。upstream配置了tomcat的ip及端口,作为目标服务器。
serve是nginx服务器,作为反向代理服务器,需要注意的是反向代理localtion节点中的proxy_pass配置为:http://+upstream名称,即“http://tomcats”
其中的原理正是nginx反向代理服务器通过“http://tomcats”来访问配置好的两台tomcats目标服务器。
2、启动并查看nginx进程
3、启动并查看tomcat进程
4、访问tomcats.taotao.com
我们可以看到访问反向代理服务器中配置的路径tomcat.taotao.com便可以访问到目标服务器tomcat,刷新页面,可以实现轮流访问8080和8081两台目标服务器。
这样就实现了反向代理。
负载均衡策略
1、轮询
上边的访问策略就是轮询(默认)方式进行负载,我们刷新浏览器可以看到,两台目标服务器几乎是轮流着访问。
upstream tomcats{
server 192.168.128.111:8080;
server 192.168.128.111:8081;
}
2、权重
指定轮询几率,weitht和访问比率成正比。如下图所示,192.168.128.111:8080的访问几率要比192.168.128.111:8081的访问比率高一倍。
upstream tomcats{
server 192.168.128.111:8080 weight=2;
server 192.168.128.111:8081;
}
3、ip-hash
上述方式存在一个问题就是说,在负载均衡系统中,假如用户在某台服务器上登录了,那么该用户第二次请求的时候,因为我们是负载均衡系统,每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的。
我们可以采用ip_hash指令解决这个问题,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream tomcats{
ip_hash;
server 192.168.128.111:8080;
server 192.168.128.111:8081;
}
ip_hash;
4、fair(第三方)
按后端服务器的相应时间来分配请求、相应时间短的优先分配。
upstream tomcats{
ip_hash;
server 192.168.128.111:8080;
server 192.168.128.111:8081;
fair;
}
5、url_hash
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
注意:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。
upstream tomcats{
server 192.168.128.111:8080;
server 192.168.128.111:8081;
hash $request_uri;
hash_method crc32;
}