1.反向代理负载均衡服务概述
1.1 集群:一群完成相同工作的服务器,服务软件相同,配置文件信息相同
集群作用
- 提高服务器处理能力
- 价格保证
- 荣誉能力强
集群类型
- 负载均衡集群
- 高可用集群
- 高性能运算集群
1.2 负载均衡
作用
- 实现用户访问请求调度处理
- 实现访问压力负载分担
1.3 反向代理
服务器根据客户端的请求,从其关联的一组或多组后端服务器(如Web服务器)上获取资源,然后再将这些资源返回给客户端,客户端只会得知反向代理的IP地址,而不知道在代理服务器后面的服务器簇的存在
反向代理:
外网主机----> 互联网 ----> 主机 (中介)---->内网服务器
通过中间主机
正向代理:
网站服务器(Google)----> 内网主机(局域网) ----> 互联网 ----> 主机(中介)---- > 外网服务器 (翻墙)
2. 反向代理负载均衡配置过程
2.1 准备环境
lb01 10.0.0.5
lb02 10.0.0.6
web01 10.0.0.7
web02 10.0.0.8
web03 10.0.0.9
2.2 配置过程
第一步: Web服务器进行环境配置
配置环境
- 版本:Nginx 1.16
rpm -qa |grep nginx
- 管理服务用户设置为 www
vim /etc/nginx/nginx.conf
- 虚拟主机配置文件相同
- 站点目录结构相同
tree /html/www
- Nginx 配置相同
user www;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/www.conf;
}
- 配置 lb01/lb02
vim /etc/nginx/nginx.conf
user www; --管理用户设置为 www 如果没有创建用户,重启服务会提示失败
worker_processes 2;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
keepalive_timeout 0;
upstream oldboy { --- 负载均衡模块
server 10.0.0.7:80;
server 10.0.0.8:80;
server 10.0.0.9:80;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://oldboy; --- 反向代理模块
}
}
}
-
在lb01上测试访问站点
-
打开浏览器测试
配置完成
总结要注意的问题
1. nginx.conf include *.conf 设置为 www.conf (在有多个虚拟主机配置文件的时候需要,如果只有一个,不需要修改,*.conf 就可以)
2. 注意管理服务用户是否创建,配置文件是否修改
3. 注意web主机配置要相同
4. 注意修改本地host文件解析是否修改为负载服务器地址
3. 配置文件详解
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
keepalive_timeout 0;
upstream oldboy { 定义可以进行负载的主机
oldboy 集群名,可以创建多个集群
server 172.16.1.7:80; 用户访问的是负载均衡的80 ,网站端口有改变在这里修改就可以,不需要再前端修改
server 172.16.1.8:80;
server 172.16.1.9:80;
}
upstream oldgirl { 定义可以进行负载的主机
oldboy 集群名,可以创建多个集群
server 172.16.1.7:80; 用户访问的是负载均衡的80 ,网站端口有改变在这里修改就可以,不需要再前端修改
server 172.16.1.8:80;
server 172.16.1.9:80;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://oldboy; 发给oldboy 集群
}
location ~ \.(jpg|mp4) {
proxy_pass http://oldboy; 如果匹配jpg或者MP4的uri,将负载发给oldgirl 集群
}
}
}
4. 负载均衡upstream模块详解
'语法说明'
Syntax: upstream name { ... }
Default: —
Context: http 只能放在http 区块中
'官方举例'
upstream backend {
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
server backup1.example.com backup;
}
4.1 weight参数
weight =5 : 权重参数: 可以实现轮巡分配支援,不指定参数默认是轮巡分配资源(平均分配)
应用环境:'可以给性能好的服务器多分配资源,老旧服务器少分配减少压力'
设置之后重启服务,在linux系统中测试对比默认与设置了权重之后的区别
访问了六次负载服务器,默认轮巡分配的情况是每个web主机两次
访问了六次负载,可以看到设置了权重之后,负载分配每个主机的情况是 web01 3次 web02 2次 web03 1次
权重是按比例来分配,不是按顺序,比如以上,它不会连续三个分配给 web01 不会连续两个分给web02
上面介绍权重的两种分配情况
第一种: '默认轮巡分配 每个请求所占用的后端时间要差不多'
第二种: 'weight 按照指定比例来分配'
第三种: 'least_conn 按照节点连接数分配资源 Web请求会被转发到连接数最少的服务器上。'
Syntax: least_conn;
Default: —
Context: upstream 使用在 upstream 模块中
least_conn: 按照节点连接数分配资源 # 要把weight去掉,否则没有作用
upstream oldboy {
least_conn;
server 10.0.0.7:80;
server 10.0.0.8:80;
server 10.0.0.9:80;
}
第四种: 'ip_hash' 确保一个用户多次访问,负载均衡都会分配给相同的web节点
Syntax: ip_hash;
Default: —
Context: upstream 使用在 upstream 模块中
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com down;
server backend4.example.com;
}
当登录网站的时候,用户离开页面一段时间,或者关闭网站重新打开网站需要再次登录,出现此情况是因为用户的登录信息,服务器可能只会保存很短的时间,
所以会用到 ip_hash
'使用ip_hash,它会为根据每个ip生成一个hash值,当用户再次登录的时候,负载根据读取到的hash值,将访问分配给对应的web服务器 '
用户IP (根据算法生成的hash值,此处仅为举例)
用户01: 10.0.0.1 --- 001 web01
用户02: 11.0.0.1 --- 011 web02
用户03: 12.0.0.1 --- 112 web03
000 ~ 150 例如 生成hash值范围是000-150
000 ~ 050 --> web01 当读取的hash值范围是000 ~ 050 时分配给 web01
051 ~ 100 --> web02 当读取的hash值范围是051 ~ 100 时分配给 web02
101 ~ 150 --> web03 当读取的hash值范围是101 ~ 150 时分配给 web03
设置了ip_hash 之后会出现一种情况:
用户01(100人): 10.0.0.1 --- 001 web01
如果用户01访问的ip中有100人,那么负载就会将这100人的请求发送给 web01 此时就会出现'负载不均'的情况
优选办法:
用户01 --> web01(缓存客户端 memcache-php) 用户01登录信息
用户02 ---> lb01 --> web02(缓存客户端 memcache-php) 用户02登录信息 --> 缓存服务器 memcached (会话记录)
用户03 --> web03(缓存客户端 memcache-php) 用户03登录信息 session会话共享服务器
负载将处理分配给web01/02/03 ,三个web服务器,理论上是记录各自的缓存,其实是每个服务器上有一个php-memcache 缓存客户端,然后将用
户登录信息统一存储到后台的一个缓存服务器,后台部署 memcached 缓存服务器(session会话共享服务器),把所有会话存储在缓存服务器,通过缓存服务
器管理缓存客户端,当负载将原属于web01会话分配给lb02也没有问题,缓存服务器也有web01的记录,这样就可以解决负载不均的
'需要安装php-memcache 和 memcache服务器'
4.2 max_fails=3 fail_timeout=30s;
负载均衡节点健康检查
'max_fails=3' 最大失败次数
当负载接收到http请求,分配给例如 web01 ,第一次如果失败,会试两次,如果三次都不正常,就访问别的,例如 web02
'fail_timeout=30s' 失败超时时间
在三次失败之后,如果设置此功能,开始计时,计时时间内,发送过来的请求,发送给web02,过了30秒之后,会访问一次 web01('只访问1此') ,如果成功,
下一次请求会再次发给web01,如果失败,再次计时30秒,不会访问三次
请求 --- web01 1次失败 2次失败 3次失败 1次失败 30s 1次失败 30s
请求 --- web02 1次成功
4.3 server backup1.example.com backup;
upstream oldboy {
server 10.0.0.7:80;
server 10.0.0.8:80;
server 10.0.0.9:80 backup;
}
backup: 节点备份功能
当其他服务器都不可以用的时候,选择使用配置了 backup功能的服务器
示例:
设置节点备份功能
测试访问(此时web03 10.0.0.9 已经不会访问了)
4.3 down
手动关闭其中一个主机,不再给其分配资源
upstream oldboy {
server 10.0.0.7:80;
server 10.0.0.8:80;
server 10.0.0.9:80 down;
}
也可以使用 #注释掉主机所在行,也可以关掉,与down 类似
5. proxy 反向代理模块 反向代理模块
proxy_pass: 反向代理指令,将请求发给指定的集群
proxy_set_header: 设置请求头信息
proxy_set_header X-Forwarded-For 使网站节点日志可以记录真实IP地址
proxy_next_upstream error timeout 检查网站页面是否正确
01. 访问负载均衡可以显示不同网站页面
## 待解决
02. 使网站节点日志可以记录真实IP地址
proxy_set_header X-Forwarded-For $remote_addr;
03. 检查网站页面是否正确
proxy_next_upstream error timeout http_403;
location / {
proxy_pass http://oldboy;
proxy_next_upstream error timeout http_403;
}
proxy_next_upstream error timeout 示例
官方说明
第一次 负载分配各 web03
第二次 负载分配给 web01 ,报错!
第三次 负载分配给 web02
在负载服务器配置文件中加上proxy_next_upstream error timeout ,重启服务
在配置了 proxy_next_upstream error timeout http_403 之后,错误页面不再显示,nginx 负载在分配给web01资源之后,返回的结果是错误的,(定义的403 ,可以定义多个),nginx 不会返回给用户,通过指令寻找下一个主机,分配给返回请求正常的结果之后,返回给用户
Nginx 可以检查主机服务是否正常,但是无法检查页面是否可以正常访问
proxy_set_header X-Forwarded-For示例
6. proxy 反向代理负载均衡企业应用
6.1 网站服务动静分离
准备环境
上传集群 upload 10.0.0.9 web01 uri==upload index.html upload page
静态集群 static 10.0.0.8 web02 uri==static index.html static page
默认集群 default 10.0.0.7 web03 uri index.html default page
当用户访问图片,音频的时候,访问static 集群
当用户访问首页,访问 default 集群
当用户上传,下载的时候,访问static 集群
配置环境
#web01:
echo "default page" >/html/www/index.html
#web02
mkdir /html/www/static/
echo "static page" >/html/www/static/index.html
#web03
mkdir /html/www/upload/
echo "upload page" >/html/www/upload/index.html
# 主机将站点目录创建在www下,否者会提示 404
测试
默认显示 default 10.0.0.7 页面
访问static location的时候,跳转到 static集群
访问 upload location的时候,跳转到 upload集群
7. 网站服务根据客户端显示不同页面
需要对用户的请求头进行判断
iphone --> wap集群 web01 index.html iphone page 手机端访问iPhone集群
Chrome --> web集群 web02 index.html chrome page chrome浏览器访问 web集群
other --> default 集群 web03 index.html default page 其他浏览器访问 default集群
配置环境 站点首页
web01
echo 'iphone-page' >/html/www /index.html
web02
echo 'chrome-page' >/html/www/index.html
web03
echo 'default-page-other ' >/html/www/index.html
配置环境 负载配置
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://default;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout http_403;
if ($http_user_agent ~* iphone) {proxy_pass http://iphone;} 如果http_user_agent信息是iphone 将资源分配给 iphone集群
if ($http_user_agent ~* chrome) {proxy_pass http://chrome;} 如果http_user_agent信息是chrome 将资源分配给 iphone集群
# 其他浏览器分配至 default 集群
}
}
'重启服务测试'
chrome浏览器访问
手机浏览器访问(模拟)
其他浏览器测试(IE)