第1章 负载均衡服务
服务作用:
(1) 对用户的请求进行调度
(2) 减少web服务器的访问压力
实现服务软件:
硬件设备方式: F5 A10 (厂商会负责培训或远程支持设备维护)
软件方式:
(1) nginx
服务 利用OSI网络模型的四层或七层 实现负载均衡
(2) LVS
服务 利用OSI网络模型的四层 实现负载均衡
(3) haproxy
服务 利用OSI网络模型的四层或七层 实现负载均衡 (功能强大,默认有节点健康状态检查功能(图形界面))
负载均衡名词概念
(1) 集群: 多台服务器完成相同的工作 (提高网站架构并发处理能力 架构伸缩性更高 架构冗余能力强 架构成本降低)
集群条件包含但不限于
(1) 部署的软件服务相同
(2) 软件的配置相同
(3) 部署的网站代码相同(web服务器集群)
(2) 反向代理 正向代理
反向代理简述 : 可以让外网主机访问内网主机 (访问通过外网访问内网时 进行IP转换 访问内网 这个过程为反向代理 实际比这个复杂)
正向代理简述 : 可以让内网主机访问外网主机
(内网通过路由等功能访问外网时 会将IP地址进行映射 这个过程为正向代理 实际比这个复杂)
第2章 负载均衡部署
nginx服务部署负载均衡服务
web集群方面
(1) 配置后端web服务集群
(2) 编写站点目录,测试文件
(3) 进行访问测试
nginx服务部署负载均衡
(1) 负载均衡服务器更新yum源 并下载安装nginx服务
(2) 利用nginx服务的upstream模块进行负载均衡的搭建 利用proxy模块进行反向代理分发请求
主配置文件中编写
upstream old{ upstream 设置负载均衡主机表 old=主机表的名字
server 10.0.0.7:80;
server 10.0.0.8:80; server 指定主机ip :80 端口 server 10.0.0.9:80;
}
# upstream 模块只能写在http模块下
server{
listen 80; 指定传输端口
server_name localhost; 默认指定域名 后面值可随意写
location /{ 匹配模块 符号匹配条件执行xx命令
proxy_pass http://old; 将http请求发送给old主机表内的主机 默认为rr (轮询)
}
}
proxy 不能写入server模块中所以使用location进行默认匹配
(3) 重启nginx服务进行测试 查看是否轮询访问
第3章 upstream模块扩展应用
upstream 模块官方应用解释
Syntax: upstream name { ... } --- 指定可以分配用户请求web节点信息
Default: — --- 无默认值
Context: http --- 可在什么模块使用
扩展应用
根据节点能力进行分配用户访问请求
upstream old{
server 10.0.0.7:80 weight=3; 设置权重值为3
server 10.0.0.8:80 weight=2; 设置权重值为2
server 10.0.0.9:80 weight=1; 设置权重值为1
}
分配访问请求时会根据权重值进行分配 权重值越高 分配任务越多
根据后端节点健康状态进行分配
web集群中万一有主机突然硬件损坏 / 网络延时等状况 造成应答不及时或无法应答
这时用户访问的时候会出现 错误代码 造成无法访问网页 为了防止发生这种情况 就要将无法返回正常信息的主机暂时停止传输请求 只对能过够返回正常页面的进行传输请求
设置方法
upstream old{
server 10.0.0.7:80;
server 10.0.0.8:80 max_fails=3 fail_timeout=5s;
(主机给与n次机会 全部失败5s后在发送一次请求查看是否恢复健康)
}
根据后端节点状态进行热备节点的使用
upstream old{
server 10.0.0.6:80;
server 10.0.0.7:80;
server 10.0.0.9:80 backup; 将指定主机设为备用主机
}
当集群主机都无法响应请求 启用热备主机 平时热备主机不会参与集群
根据后端节点连接数进行分配
负载均衡会根据每一台主机的请求连接数进行分配请求 (连接多的少分配 少的多分配)
least_conn
根据连接数进行分配请求指令
upstream old{
least_conn; 指定开启连接数分配模式
server 10.0.0.8:80;
server 10.0.0.9:80;
}
根据用户源IP地址hash (哈希值) 分配请求
每一台后端主机 负载均衡服务器都会分配一个哈希值区域 当用户请求访问进来 负载均衡会记录主机信息 并赋予哈希值 这样以后这台主机在次访问会被负载均衡服务器直接分配 第一次访问时分配的web主机
缺点 容易造成负载不均衡 导致web压力过大
upstream old{
ip_hash; 指定开启根据哈希值分配模式
server 10.0.0.6:80;
server 10.0.0.7:80;
}
第4章 proxy扩展功能应用
proxy模块官方应用解释
Syntax: proxy_pass URL; --- 传输请求到指定主机表
Default: — --- 无默认值
Context: location, if in location, limit_except --- 可在什么模块内使用
经过负载均衡服务器 访问网站看到不同页面
根据前缀来访问不同的页面 默认传输的数据时 请求头是没有数据的会进行默认首选项的匹配
使用模块 proxy_set_header
修改请求头信息 使访问不同网站显示不同的页面
使用方法: proxy_set_header Host $host;
upstream old {
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://old;
proxy_set_header Host $host; 指定请求头信息为$host (原始请求头信息)
}
}
让web节点日志显示真是用户IP地址
proxy_set_header 在请求头中添加内容
upstream old{
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://old](http://old);
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr; 指定请求行添加源ip地址
}
}
根据页面显示信息进行健康检查
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://oldboy;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout invalid_header http_404; 指定出现什么状态不进行显示 显示健康状态主页
}
}
说明: 这样给用户显示的页面一定是正常的页面信息
第5章 负载均衡企业应用
负载均衡动静页面分离
思路 将动态静态页面分开建立主机表 然后用location进行匹配执行分配访问请求
负载均衡服务器配置:
upstream dynamic {
server 10.0.0.7:80;
}
upstream static {
server 10.0.0.8:80;
}
upstream upload {
server 10.0.0.9:80;
}
server {
listen 80;
server_name localhost;
location /dynamic/ {
proxy_pass http://dynamic;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout invalid_header http_404;
}
location /static/ {
proxy_pass http://static;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout invalid_header http_404;
}
location /upload {
proxy_pass http://upload;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout invalid_header http_404;
}
}
利用负载均衡 实现访问时显示不同网页(手机端or电脑端)
判断请求信息中 主机信息 是使用什么设备进行的访问 根据不同设备返回不同网页
upstream chrome { 设置主机表
server 10.0.0.7:80;
}
upstream Android {
server 10.0.0.8:80;
}
location / {
if ($http_user_agent ~* chrome) { if判断功能 日志中访问设备信息是否匹配chrome(谷歌浏览器内核)
proxy_pass [http://chrome](http://chrome); 如果成立 将数据传输给指定服务器显示浏览器页面
}
if ($http_user_agent ~* Android) { if判断功能 判断是否匹配Android(安卓系统内核)
proxy_pass http://iphone;
}
proxy_pass http://default;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout invalid_header http_404;
}
$http_user_agent
调取日志主机信息中 访问设备信息
第6章 企业中服务网络安全访问配置
目的: 尽可能不暴露企业服务器IP地址给用户
第一步: 修改负载均衡配置文件
upstream oldboy {
server 10.0.0.7:80;
server 10.0.0.8:80;
server 10.0.0.9:80;
}
server {
listen 10.0.0.3:80; 只监听指定ip的访问请求 (注意要自己网卡有的IP)
server_name localhost;
location / {
proxy_pass http://oldboy;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
第二步修改内核信息 修改为允许监听本地网卡没有的IP地址
echo 'net.ipv4.ip_nonlocal_bind = 1' >>/etc/sysctl.conf
修改内核信息
sysctl -p
查看是否允许监听没有的IP地址
注意项:
(1) nginx程序涉及到IP地址修改,必须重启nginx
(2) 监听的地址必须是本地网卡上有的地址
如何监听网卡上没有的地址:
解决方法:
echo 'net.ipv4.ip_nonlocal_bind = 1' >>/etc/sysctl.conf
sysctl -p