文章目录
1.什么是haproxy?
- HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
- HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理,可以对浏览器中的http服务url报文进行解析。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。(有反向代理的功能)
- HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。
- 此模型的弊端是,haproxy是单核的,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
2.haproxy配置文件详解
(1)haproxy的安装
yum install haproxy -y (建议用rpm包装)
(2)haproxy配置文件详解
cd /etc/haproxy/ ##haproxy配置文件所在目录
vim haproxy.cfg ##配置文件绝对路径/etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2 #全局的日志配置,使用log关键字
chroot /var/lib/haproxy #改变当前工作目录
#修改haproxy的工作目录至指定的目录并在放弃权限之前执行chroot()操作,可以提升haproxy的安全级别,不过需要注意的是要确保指定的目录为空目录且任何用户均不能有写权限
pidfile /var/run/haproxy.pid #当前进程id文件
maxconn 4000 #设定每个haproxy进程所接受的最大并发连接数
user haproxy ##默认haproxy用户是存在的
group haproxy
daemon #让haproxy以守护进程的方式工作于后台
defaults
mode http #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
log global #应用全局的日志配置
option httplog # 启用日志记录HTTP请求,默认haproxy日志记录是不记录HTTP请求日志
option dontlognull # 启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器 或者监控系统为了探测该服务是否存活可用时,需要定期的连接或者获取某固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接;官方文档中标注,如果该服务上游没有其他的负载均衡器的话,建议不要使用该参数,因为互联网上的恶意扫描或其他动作就不会被记录下来
option http-server-close #每次请求完毕后主动关闭http通道
option forwardfor except 127.0.0.0/8
option redispatch
# 当使用了cookie时,haproxy将会将其请求的后端服务器的serverID插入到cookie中,以保证会话的SESSION持久性;而此时,如果后端的服务器宕掉了, 但是客户端的cookie是不会刷新的,如果设置此参数,将会将客户的请求强制定向到另外一个后端server上,以保证服务的正常。
retries 3 # 定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端 服务器标记为不可用
timeout http-request 10s #http请求超时时间
timeout queue 1m #一个请求在队列里的超时时间
timeout connect 10s #连接超时
timeout client 1m #客户端超时
timeout server 1m #服务器端超时
timeout http-keep-alive 10s #设置http-keep-alive的超时时间
timeout check 10s #检测超时
maxconn 3000 #每个进程可用的最大连接数
3.开启haproxy日志
可以在配置文件中查看到haproxy的日志是2级日志
20 # 2) configure local2 events to go to the /var/log/haproxy.log
21 # file. A line like the following can be added to
22 # /etc/sysconfig/syslog
23 #
24 # local2.* /var/log/haproxy.log
配置:
vim /etc/rsyslog.conf
编辑日志管理服务配置文件
15 $ModLoad imudp ##开启UDP端口,接受haproxy日志
16 $UDPServerRun 514
55 local2.* /var/log/haproxy.log ##日志文件所在路径
4. haproxy+apache负载均衡的实现
实验配置:
在负载均衡服务器方(server1):
(1)下载安装haproxy
yum install -y haproxy
(2)更改配置文件
87 listen admin *:8080 ##监控负载均衡的页面,自动带有健康检查的功能
88 stats enable
89 stats uri /status ##监控页面地址
90 stats auth admin:westos ##监控帐号密码管理
91 stats refresh 5s ##监控刷新频率
92
93 listen westos *:80 ##负载均衡策略
94 balance roundrobin ##轮询模式
95 server web1 172.25.254.22:80 check
96 server web2 172.25.254.23:80 check
(3)重启服务
注意:如果配置文件有语法错误,服务是启动不了的
systemctl start haproxy
在RS–>server2 方:
yum install -y httpd ##编辑发布页面方便查看效果
vim /var/www/html/index.html
server1
systemctl start httpd
在RS–>server3 方:
yum install -y httpd ##编辑发布页面方便查看效果
vim /var/www/html/index.html
server3
systemctl start httpd
测试:
在真机上,curl http://172.25.19.23(负载均衡服务器的ip)不断测试
实现效果:haproxy不仅实现了负载均衡的效果;还起到了一个反向代理的作用,客户主机不知道真实服务器
监控查看(http://172.25.254.21:8080/status)
模拟RS挂机,自带健康检查:
5.haproxy实现动静分离访问
5.1 动静分离简述
-
动静分离是将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问。
-
api接口服务化:动静分离之后,后端应用更为服务化,只需要通过提供api接口即可,可以为多个功能模块甚至是多个平台的功能使用,可以有效的节省后端人力,更便于功能维护。
-
动静分离后,前后端只需要关心接口协议即可,各自的开发相互不干扰,并行开发,并行自测,可以有效的提高开发时间,也可以有些的减少联调时间
-
动静分离可减轻后端服务器压力,提高静态资源访问速度:后端不用再将模板渲染为html返回给用户端,且静态服务器可以采用更为专业的技术提高静态资源的访问速度
5.2 动静分离的实现
配置:
在haproxy服务器方配置(server1):
(1)修改配置文件
vim /etc/haproxy/haproxy.cfg
#frontend:用来匹配接收客户所请求的域名,uri等,并针对不同的匹配,做不同的请求处理
frontend westos *:80
acl url_static path_beg -i /images
acl url_static path_end -i .jpg .gif .png
use_backend static if url_static
default_backend app (默认访问app)
#backend:定义后端服务器集群
backend static (静态)
#balance roundrobin
server web2 172.25.42.14:80 check
backend app
#balance roundrobin
server web1 172.25.42.13:80 check
server local 172.25.42.12:8000 backup (如果后端real server down掉 则调度报错页面 但是正常情况下不会访问 因为 是“backup”)
systemctl restart haproxy ##重启服务
(2)添加httpd服务访问
yum install httpd -y
vim /etc/httpd/conf/httpd.conf ##修改http服务端口为为8000,因为80端口已经被haproxy占用
42 Listen 8000
vim /var/www/html/index.html ##编写发布内容,模拟动态内容
systemctl start httpd ##启动http服务
在静态资源服务器方配置(server3):
在httpd服务创建静态资源目录,模拟静态资源找一个照片放在发布目录下
测试:
在浏览器中分别模拟访问静态动态资源;静态资源:(http://172.25.254.21/redhat.jpg)真实访问的是172.25.254.23RS;
动态资源(http://172.25.254.21):真实访问的是172.25.254.22RS,根据所写的haproxy策略,当22主机宕掉了,会访问haproxy主机服务器。
6. haproxy错误重定向
实验一:403错误重定向
haproxy服务器方配置:
vim /etc/haproxy/haproxy.cfg ##编辑配置文件
frontend westos *:80
acl url_static path_beg -i /images #(以什么开头 默认根目录)
acl url_static path_end -i .jpg .gif .png #(以什么结尾)
acl badhost src 172.25.254.3 #(模拟错误:设定谁不能访问我)
block if badhost
errorloc 403 http://172.25.42.21:8000 #(注意端口不要冲突)(403:服务器拒绝你的访问 服务器设定你是坏的 )(如果是403错误就重定向到 172.25.254.12:8000)
use_backend static if url_static
default_backend app
backend static
balance roundrobin
server web2 172.25.42.14:80 check
backend app
balance roundrobin
server web1 172.25.42.13:80 check
systemctl restart haproxy ##重启服务
测试:
在浏览器中访问服务器 http://172.25.254.21
只设定谁不允许访问时:
403重定向访问:
实验二:所有错误重定向
在haproxy服务器方配置:
vim /etc/haproxy/haproxy.cfg ##编辑配置文件
frontend westos *:80
acl url_static path_beg -i /images (以什么开头 默认根目录)
acl url_static path_end -i .jpg .gif .png (以什么结尾)
acl badhost src 172.25.42.250 ##(设定谁不能访问我)
redirect location http://172.25.42.12:8000 if badhost ##(如果出现错误访问 就重定向 不管是什么错误)
use_backend static if url_static
default_backend app
backend static
balance roundrobin
server web2 172.25.42.14:80 check
backend app
balance roundrobin
server web1 172.25.42.13:80 check
测试:
在浏览器中访问haproxy服务器,http://172.25.254.21
7. 301永久重定向(域名重定向)
301重定向与302定向:
-
301 redirect: 301 代表永久性转移(Permanently Moved)
302 redirect: 302 代表暂时性转移(emporarily Moved ) -
详细来说,301和302状态码都表示重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入的地址A瞬间变成了另一个地址B)这是它们的共同点。
-
他们的不同在于301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址
配置:
之前其他的服务器配置不变
vim /etc/haproxy/haproxy.cfg ##编辑配置文件
acl westos.org hdr_beg(host) -i westos.org
acl 172.25.42.12 hdr_beg(host) -i 172.25.42.12
redirect code 301 location http://www.westos.org if westos.org
(以westos.org访问 自动重定向 www.westos.org)
redirect code 301 location http://www.westos.org if 172.25.42.12
(以172.25.42.12访问 自动重定向 www.westos.org)
use_backend static if url_static
default_backend app
systemctl restart haproxy ##重启服务
测试:
在物理机上使用curl -I 172.25.254.21获取报文信息
8.haproxy读写分离
什么是读写分离?
读写分离为了确保数据库产品的稳定性,很多数据库拥有双机热备功能。也就是,第一台数据库服务器,是对外提供增删改业务的生产服务器;第二台数据库服务器,主要进行读的操作。
配置:
在两台real server 分别配置(server2和server3):
yum install php -y
chmod 777 upload (默认上传目录一定要给权限)
在haproxy服务器方配置(server1):
vim /etc/haproxy/haproxy.cfg ##编辑配置文件,编写调度策略
acl read method GET
acl read method HEAD //两个read write 只用一个就行
acl write method PUT
acl write method POST
use_backend app if write
default_backend static (默认静态页面 为了测试 刚开始 www.westos.org 时是172.25.42.14 而写(上传时 却是在172.25.254.13 上进行的) 做到了读写分离)
backend static
balance roundrobin
server web2 172.25.42.14:80 check
backend app
balance roundrobin
server web1 172.25.42.13:80 check (默认会上传到这个real server)
server local 172.25.42.12:8000 backup
测试:
在浏览器中访问 http://172.25.0.1/index.php
上传一张照片(模拟写操作),点击submit提交,提交成功后可以在写对应的RS上(server3)查看到提交资源