目录
日志分离:log 127.0.0.1 local2 info 定义全局的syslog服务器,且需要开启UDP服务
haprixy算法:通过固定参数balance指明对后端服务器的调度算法(listen或backend中)
static-rr:#适用于做了session共享的web集群
hdr_end(host) -i .org --说明要是以.org结尾的名称
hdr_beg(host) -i bbs --以bbs开头的host请求
启动状态页:特别注意看自己的SELinux是否处于宽容模式 不然用不了这个端口的网页!!
负载均衡是什么:
就是客户端给予的一个特定的任务 在LB调度器上可以分担给多个特定的后端服务器 实现负载均衡 提高并发处理能力 保证业务的高可用性
1.用负载均衡的理由
Web服务器的动态水平扩展-->可以在同一个调度器中添加n个服务器或者设备
增加业务并发访问及处理能力-->解决单服务器瓶颈问题
节约公网IP地址-->server不需要公网ip 只有调度器有
隐藏内部服务器IP-->提高内部服务器安全性
配置简单-->固定格式的配置文件
功能丰富-->支持四层和七层,支持动态下线主机 可以进行流量的转发 也可以进行报文的分析
性能较强
2.负载均衡类型
四层--转发功能:
1.修改报文头部的目标地址
2.修改源地址
支持软件:
lvs:重量级四层负载均衡
Nginx:轻量级负载均衡
haproxy:模拟四层转发
七层--代理功能:
会在中间代理部分进行预处理 所以server只知道是proxy在处理 不会知道还有client的存在 除非将client的ip进行渗透过去才可以知道
一般当存在需要处理url信息解析的时候 需要七层
如果单纯只进行ip流量识别 四层或者七层皆可
支持七层:
Nginx:基于http协议
haproxy:七层代理,会话保持、标记、路径转移等
正向代理和反向代理
正向代理:类似中间商 --客户端知道要访问的目标服务器 由于不能访问 需要中间商介入
我联系不上房东 就需要中间的中介给我进行代理 我和房东之间比如有一个防火墙可能直接进行不了 这个时候我需要一个可以联系上房东的人给我进行联系 这个时候我会去找中介 中介有的资源直接给我介绍 但是没有的就需要去找房东进行收集信息
假设你(客户端)想要买一件国外网站的商品,但是直接访问该网站被限制了。这时,你可以找一个代购(正向代理)来帮忙。你把购物需求告诉代购,代购会用自己的方式去访问那个网站,购买商品,然后再把商品寄给你。在这个过程中,国外网站并不知道是你想买这件商品,它只知道是代购在买
反向代理:--客户端不知道要访问哪个服务器 只有反向代理服务器会知道 是和目标服务器直接联系
-
餐馆:就像我们的原始服务器,它负责制作美食(提供服务或内容)。但是,由于餐馆本身的位置有限,能容纳的顾客数量也有限,所以直接到店就餐可能会遇到排队等待的情况。
-
外卖服务:这就是我们的反向代理。它位于餐馆(原始服务器)和顾客(客户端)之间。顾客不需要直接和餐馆打交道,只需要通过外卖服务下单即可。外卖服务会接收顾客的订单,然后转发给餐馆,餐馆做好菜后,外卖服务会负责将菜品送到顾客手中。
-
顾客:就像我们的客户端,他们只需要和外卖服务(反向代理)进行交互,就可以享受到餐馆的美食,而不需要关心餐馆的内部情况,比如有多少厨师在忙碌、有多少张桌子空着等。
正反向代理的区别:
1.目的不同
正向代理:实际代理的是客户端,它的主要目的是解决客户端的访问问题,如访问限制、加速访问等。
反向代理:代理的是目标服务器,它的主要目的是提高系统的可用性、安全性和性能,如通过负载均衡来平衡后端服务器的负载,通过缓存来减少对后端服务器的请求等。
2.代理对象不同
正向代理:是客户端架构,它代理的是客户端的请求。
反向代理:是服务器架构,它代理的是后端服务器的响应。
3.服务对象不同
正向代理:在正向代理中,服务器不知道真正的用户是谁,因为所有请求都经过代理服务器转发。
反向代理:在反向代理中,用户不知道真正的服务器是谁,因为用户直接与代理服务器交互,而不需要知道后端服务器的具体信息。
4.功能不同
正向代理:主要用来解决访问问题,如访问限制、加速访问等。同时,它还可以提供缓存功能,以减少对原始服务器的请求次数。
反向代理:主要用于解决负载均衡、安全防护等问题。通过负载均衡,反向代理可以将客户端请求分发到多个后端服务器上,从而提高系统的可伸缩性和性能。同时,它还可以作为应用层防火墙,为网站提供对基于web的攻击行为的防护。
进程和线程
进程:
进程相当于我开机之后电脑进行的每一项任务,比如我打开qq 微信 小红书 抖音 是属于不同的进程 他们单独隶属于一个任务 因为他们之间没有必要的联系 各自进行各自的任务进程 独立存在 互不干扰
进程就是一个正在运行的程序,它拥有独立的内存空间和系统资源。
线程:
线程相当于我打开微信之后打开的其他页面/进行的其他步骤,不如我打开微信之后,打开了微信里面的朋友圈、健康步数、某公众号...是属于不同的线程的,他们都会在各自读取里面的信息进行操作等等,但是都是在同一个进程下的不同操作 就是线程
一个进程可以有一个或者多个线程
这些线程共享进程的资源(比如内存空间、文件描述符等),但每个线程都有自己独立的执行路径
区别:
1.资源占用:进程是资源分配的基本单位,它拥有独立的内存空间和系统资源。而线程是CPU调度的基本单位,多个线程共享进程的资源。
2.独立性:进程之间是相互独立的,一个进程的崩溃不会影响其他进程。而线程之间由于共享进程资源,所以一个线程的崩溃可能会影响到同一进程内的其他线程。
3.系统开销:由于进程需要分配独立的资源,所以创建和销毁进程的开销通常比线程大。线程则因为共享进程资源,所以创建和销毁的开销相对较小。
4.并发性:由于线程之间的切换开销小,所以线程更适合用于需要高并发处理的场景。而进程则适用于需要较高独立性和安全性的场景。
5.包含关系:一个进程至少有一个线程,线程是进程的一部分
haproxy含义:
HAProxy(High Availability Proxy)是一款开源、高性能的负载均衡器和代理服务器,专为TCP和HTTP应用而设计。
含义解释
1. 开源与高性能
- 开源:意味着HAProxy的源代码是公开的,任何人都可以查看、修改和使用,这促进了社区的发展和技术创新。
- 高性能:HAProxy采用事件驱动模型,能够处理大量并发连接,非常适合处理高负载的Web站点或应用。
2. 负载均衡
- 负载均衡是HAProxy的核心功能。简单来说,当有大量用户同时访问一个网站或应用时,HAProxy可以将这些访问请求分散到多台后端服务器上,从而减轻单台服务器的压力,提高系统的整体性能和稳定性。
3. 代理服务器
- 作为代理服务器,HAProxy可以接收来自客户端的请求,并根据配置规则将这些请求转发给后端服务器。同时,它还可以将后端服务器的响应返回给客户端,实现了客户端与后端服务器之间的透明通信。
举例
假设你经营着一家大型在线商店,每天有成千上万的用户访问你的网站进行购物。为了确保网站能够顺畅运行,你决定使用HAProxy作为负载均衡器。
场景设定:
- 你有三台服务器(我们称之为A、B、C),它们都在运行你的在线商店的网站。
- 你还部署了一台HAProxy服务器,用于接收用户访问网站的请求。
工作流程:
- 用户访问:当用户通过浏览器访问你的在线商店时,他们的请求首先会发送到HAProxy服务器。
- 负载均衡:HAProxy会根据配置的负载均衡算法(比如轮询调度),选择一个后端服务器(比如A)来处理这个请求。
- 请求转发:HAProxy将用户的请求转发给选定的后端服务器A。
- 处理请求:服务器A接收到请求后,会处理这个请求(比如查询商品信息、生成订单等)。
- 返回响应:服务器A处理完请求后,将结果返回给HAProxy。
- 返回给用户:HAProxy再将这个结果转发给用户的浏览器,用户就可以看到他们请求的内容了。
haproxy基本部署
systemctl restart haproxy --重启服务
global:全局配置
查看线程
启动多线程设定:nbproc
启动多进程设定:nbthread
日志分离:log 127.0.0.1 local2 info 定义全局的syslog服务器,且需要开启UDP服务
haproxy多进程如何热处理
proxies代理配置
defaults
frontend
backend
backup:只有非备份的主机down运行不起来的时候 才会sorry server
dnf install httpd -y
vim /etc/http/httpd.conf 文件修改端口形式为其他 比如8080
echo 内容 > /var/www/html/index.html 网站中
需要关闭两个webserver的nginx服务 让它实现只有两个服务都运行不了的时候就会显示backup
**disabled:下线指定realserver(指定一个服务器下班)**
**redirect prefix +URL(http:www.baidu.com/):网页重定向到其他url 当302时**
maxconn +数字 :后端server最大并发连接数 到达这个指标同时并发 就会下线触发backup--sorryserver显示
haprixy算法:通过固定参数balance指明对后端服务器的调度算法(listen或backend中)
静态算法
static-rr:#适用于做了session共享的web集群
不支持慢启动(开启之后流量慢慢给) 支持权重 不支持修改权重 balance static-rr
first:#使用较少
balance first 自上而下进行调用 当一台的服务器达到了上限 才会给下一台 不支持修改权重
不支持socat工具进行显示 比如get set disable enable
动态算法
roundrobin
1.基于权重的轮询动态调度算法 2.支持权重的运行时调整,不同于Ivs中的rr轮训模式
3.HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数)
4.其每个后端backend中最多支持4095个real server, 5.支持对real server权重动态调整, 6.roundrobin为默认调度算法,此算法使用广泛
leastconn:#数据库
1.leastconn加权的最少连接的动态 2.支持权重的运行时调整和慢启动,即:根据当前连接最少的后端服务器而非权重进行优先调度(新客户端连接) 3.比较适合长连接的场景使用,比如:MySQL等场景
其他算法:即可动也可静
uri
1.基于对用户请求的URI的左半部分或整个uri做hash,再将hash结果对总权重进行取模后
2.根据最终结果将请求转发到后端指定服务器
3.适用于后端是缓存服务器场景 4.默认是静态算法,也可以通过hash-type指定map-based和consistent,来定义使用取模法还是一致性hash
source
源地址hash,基于用户源地址hash并将请求转发到后端服务器,后续同一个源地址请求将被转发至同-个后端web服务器。此方式当后端服务器数据量发生变化时,会导致很多用户的请求转发至新的后端服务器,默认为静态方式,但是可以通过hash-type支持的选项更改这个算法一般是在不插入Cookie的TCP模式下使用,也可给拒绝会话cookie的客户提供最好的会话粘性,适用于session会话保持但不支持cookie和缓存的场景源地址有两种转发客户端请求到后端服务器的服务器选取计算方式,分别是取模法和一致性hash
socat工具:socket套接字
下载socat软件包
dnf install socat -y
vim /etc/haproxy/haproxy.cfg
看haproxy 集群权重状态--show info
get 查看指定服务器的权重
set 修改指定服务器的权重
disable enable 关闭和重启后端服务器
高级功能及配置
cookie会话
IP透传
七层透传 http
web服务器日志格式配置
需要在webserver中任意一台机子上面做web服务器七层透传命令修改
vim /etc/httpd/conf/httpd.conf
需要先去haproxy上面运行一下 让webserver有运行日志
curl 172.25.254.100
webserver1
webserver2
四层透传 tcp ---四层利用日志配置是看不见ip透传进来了 需要做代理
nginx可以做四、七层透传 但是apache(http)不可以做四层 只能做七层透传
ACL访问控制列表
访问控制列表ACL,Access ControlLists) 是一种基于包过滤的访问控制技术 它可以根据设定的条件对经过服务器传输的数据包进行过滤(条件匹配)即对接收到的报文进行匹配和过滤,基于请求报文头部中的源地址、源端口、目标地址、目标端口、请求方法、URL、文件后缀等信息内容进行匹配并执行进一步操作,比如允许其通过或丢弃。
hdr
hdr([<name>[,<occ>]]):完全匹配字符串,header的指定信息,<occ>表示在多值中使用的值的出
现次数
hdr_beg([<name>[,<occ>]]):前缀匹配,header中指定匹配内容的begin
hdr_end([<name>[,<occ>]]):后缀匹配,header中指定匹配内容end
hdr_dom([<name>[,<oCC>]]):域匹配,header中的domainname(host)
hdr_dir([<name>[,<occ>]]):路径匹配,header的uri路径
hdr_1en([<name>[,<occ>]]):长度匹配,header的长度匹配
hdr_reg([<name>【,<0CC>]]):正则表达式匹配,自定义表达式(regex)模糊匹配
hdr_sub([<name>【,<occ>]]):子串匹配,header中的uri模糊匹配 模糊匹配c洪湖报文中a/b/c
也会匹配
#示例:
hdr(<string>)用于测试请求头部首部指定内容
hdr_dom(host)请求的host名称,如www.timinglee.orghdr_beg(host)请求的host开头,如www.i mg -
video. download. ftp.
hdr_end(host)请求的host结尾,如.com.net.cn
hdr_dom(host) ---请求的host的名称
需要在windows里面进行解析 不然输入www.csy.org时识别不了这是什么的
hdr_end(host) -i .org --说明要是以.org结尾的名称
hdr_beg(host) -i bbs --以bbs开头的host请求
base
base_beg
base_dir
base_dom
base_end
base_len
base_reg
base_sub
base_sub -m sub csy --包含关系
path
path_beg :#请求的URL开头,如/static、/images、/img、/css
path_end :#请求的URL中资源的结尾,如gif.png.css.js.jpg.jpeg
path_dom
path_dir
path_len
path_reg
path_sub
逻辑处理
与:隐式(默认)使用
或:使用“or”或“|"表示
否定:使用"!”表示
利用ACL做动静分离等访问控制
基于域名的访问
基于ip的访问
拒绝
基于字符串的访问
基于文件后缀名实现动静分离
基于访问路径实现动静分离
四层负载tcp应用场景
mysql:
在haproxy和web1.2分别下载mysql服务:dnf install mariadb -y
dnf install mariadb-server -y
(内包含一个mariadb-server 要存在这个包才可以启动服务)
haproxy连接10主机的mysql:
说明没有设置10主机可以远程登录
进行10.20主机远程登录:
进行依次查看三台主机 会显示rr轮询状态
加密访问
普通加密:
mkdir -p /etc/haproxy/certs
openssl req -newkey rsa:2048 -nodes -sha256 -keyout /etc/haproxy/certs/timinglee.org.key -x509 -days 365 -out /etc/haproxy/certs/timinglee.org.crt
cat /etc/haproxy/certs/timinglee.org.key /etc/haproxy/certs/timinglee.org.crt > /etc/haproxy/certs/timinglee.pem
[root@haproxy ~]# systemctl restart haproxy.service
[root@haproxy ~]# netstat -antlupe |grep haproxy
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
[root@haproxy ~]# systemctl restart httpd
全站加密:
vim /etc/haproxy/haproxy.cfg
138 systemctl restart haproxy.service
haproxy状态页
启动状态页:特别注意看自己的SELinux是否处于宽容模式 不然用不了这个端口的网页!!
登录状态页
backend server信息
session rate(每秒的连接会话信息):
cur:每秒的当前会话数量:
max:每秒新的最大会话数量
limit:每秒新的会话限制量
ssions(会话信息):
cur:当前会话量
max:最大会话量
Req:错误请求量
conn:错误链接量Resp:错误响应量
Warnings(警告统计信息)
Retr:重新尝试次数Redis:再次发送次数
limit: 限制会话量
Total:总共会话量
LBTot:选中一台服务器所用的总时间
Last:和服务器的持续连接时间
Server(realserver信息):
Status:后端机的状态,包括UP和DOWN
LastChk:持续检查后端服务器的时间
Wght:权重
In:网络的字节输入总量
Out:网络的字节输出总量
Act:活动链接数量
Bck:备份的服务器数量
Chk:心跳检测时间
Dwn:后端服务器连接后都是DOWN的数量
Denied(拒绝统计信息):
Req:拒绝请求量
Resp:拒绝回复量
Dwntme:总的downtime时间
Thrtle:server 状态