Table of Contents
一、 负载均衡分类
1、二层负载均衡(mac)
根据OSI模型分的二层负载,一般是用虚拟mac地址方式,外部对虚拟MAC地址请求,负载均衡接收后分配后端实际的MAC地址响应.
2、三层负载均衡(ip)
一般采用虚拟IP地址方式,外部对虚拟的ip地址请求,负载均衡接收后分配后端实际的IP地址响应. (即一个ip对一个ip的转发, 端口全放开)
3、四层负载均衡(tcp)
在三次负载均衡的基础上,即从第四层"传输层"开始, 使用"ip+port"接收请求,再转发到对应的机器。
4、七层负载均衡(http)
从第七层"应用层"开始, 根据虚拟的url或IP,主机名接收请求,再转向相应的处理服务器。
注:我们运维中最常见的四层和七层负载均衡,这里重点说下这两种负载均衡。
二、根据客户端的设备(user_agent)转发实践需求
须知:在企业中,为了让不同的客户端设备用户访问有更好的体验,需要在后端架设不同的服务器来满足不同的客户端的访问,例如:移动客户端访问网站,就需要单独部署移动服务器,而且移动端还分苹果、安卓、Ipad等。
1、常规4层负载均衡解决方案架构(传统情况下,一般使用这个方法)
(1)原理:使用不同的域名来实现这个需求
(2)例如:人为分配好让移动端用户访问wap.baidu.com,PC客户端用户访问www.baidu.com
(3)此解决方案最大的问题:不同的客户端用户需要记住对应的域名!但是绝大部分用户只会记住www.baidu.com,而不会记住wap.baidu.com。这样以来用户的上网体验就会非常的差。
(4)怎么解决这个问题,实现用户只需要记住www.baidu.com这个地址,而且不同的客户端设备都能有非常好的访问体验呢?
答:采用第七层负载均衡解决方案
2、第七层负载均衡解决方案
这个解决方案下,就只需要记住一个域名即可,然后负载均衡器通过获取用户请求中的设备信息(利用$http_user_agent获取),根据这些信息转给后端合适的服务器处理。
如下为描述上述解决方案的架构逻辑图:
三、根据客户端设备(user_agent)转发请求实战
下面这个就是我找的一个$http_user_agent的值:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15
(KHTML, like Gecko) Version/13.0.2 Safari/605.1.15
1、简单配置
Nginx负载均衡代理服务器配置:
location / {
echo 2;
if ($http_user_agent ~* "Firefox"){
proxy_pass http://www;
include /usr/local/nginx/conf/vhost/proxy.conf;
}
网页请求处理服务器配置:
location / {
echo 1;
}
实现用Firefox浏览器浏览时,发送1,使用其他浏览器时,发送2
2、实现7层负载均衡加反向代理集群架构:
http {
upstream www{
server 172.16.193.163;
}
upstream wap{
server 172.16.193.164;
}
server {
listen 80;
server_name www.baidu.com;
location / {
echo 2;
if ($http_user_agent ~* "android"){ //如果是安卓,就转发到名叫wap的移动服务器池中去
proxy_pass http://wap;
include conf/vhost/proxy.conf
}
if ($http_user_agent ~* "MSIE"){ //如果是IE浏览器就转发到名叫www的pc服务器池中
proxy_pass http://www;
include conf/vhost/proxy.conf
}
}
}
}
注:至于转发到相应的服务器,服务器怎么根据设备来进行网页优化和前端设计,这就不是运维的工作了。有兴趣也可以去了解了解。