负载均衡集群:
四层:
lvs, nginx(stream),haproxy(mode tcp)
七层:
http: nginx(http, ngx_http_upstream_module), haproxy(mode http), httpd, ats, perlbal, pound...
haproxy:
HAProxy 是一款高性能TCP/HTTP 反向代理负载均衡服务器,具有如下功能:
- 根据静态分配的cookies完成HTTP请求转发
- 在多个服务器间实现负载均衡,并且根据HTTP cookies 实现会话粘性
- 主备服务器切换
- 接受访问特定端口实现服务监控
- 实现平滑关闭服务,不中断已建立连接的请求响应,拒绝新的请求
- 在请求或响应HTTP报文中添加,修改,或删除首部信息
- 根据正则规则阻断请求
- 提供带有用户认证机制的服务状态报告页面
HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的 并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
HAproxy组成:
主程序:/usr/sbin/haproxy
配置文件:/etc/haproxy/haproxy.cfg
Unit file:/usr/lib/systemd/system/haproxy.service
haproxy.cfg主要有两部分组成:global,和proxies配置段
global:全局配置段
进程及安全配置相关的参数
性能调整相关参数
Debug参数
proxies:代理配置段
defaults:为frontend, backend, listen提供默认配置
fronted:前端,相当于nginx, server {}
backend:后端,相当于nginx, upstream {}
listen:同时拥有前端和后端,适用于一对一环境
haproxy安装
1、下载、解压haproxy-1.6.11.tar.gz
2、安装 rpm-build
[root@server4 ~]# yum install rpm-build -y
3、rpmbuild制作rpm安装包
[root@server4 ~]# yum install pcre-devel gcc -y
[root@server4 ~]# rpmbuild -tb haproxy-1.7.3.tar.gz
4、安装haproxy
[root@server1 examples]# cd
[root@server1 ~]# cd rpmbuild/RPMS/x86_64/
[root@server1 x86_64]# rpm -ivh haproxy-1.7.3-1.x86_64.rpm
安装之后启动脚本直接存在且有执行权限
haproxy负载均衡
实验环境:
一台客户端:172.25.33.250
一台haproxy调度器:172.25.33.4
两台RS:172.25.33.2 172.25.33.3
1、修改配置文件
[root@server4 x86_64]# cd
[root@server4 ~]# cd haproxy-1.7.3/examples/
[root@server4 examples]# cp content-sw-sample.cfg /etc/haproxy
[root@server4 examples]# cd /etc/haproxy/
[root@server4 haproxy]# mv content-sw-sample.cfg haproxy.cfg
global
maxconn 10000
stats socket /var/run/haproxy.stat mode 600 level admin
log 127.0.0.1 local0
uid 200
gid 200
chroot /var/empty
daemondefaults
mode http
log global
option httplog
option dontlognull
monitor-uri /monitoruri
maxconn 8000
timeout client 30s
option prefer-last-server
retries 2
option redispatch
timeout connect 5s
timeout server 5sstats uri /admin/stats
stats auth admin:redhat ##登录身份认证
stats refresh 5s ##设置页面刷新时间
# The public 'www' address in the DMZ
frontend public
bind *:80 name clear
#bind 192.168.1.10:443 ssl crt /etc/haproxy/haproxy.pem
#use_backend static if { hdr_beg(host) -i img }
#use_backend static if { path_beg /img /css }
default_backend dynamic
# the application servers go here
backend dynamic
balance roundrobin
server dynsrv1 172.25.33.2:80 check inter 1000
server dynsrv2 172.25.33.3:80 check inter 1000
2、添加haproxy用户和组
[root@server4 haproxy]# groupadd -g 200 haproxy
[root@server4 haproxy]# useradd -u 200 -g 200 -M -s /sbin/nologin haproxy
3、调度器开启haproxy服务
4.后端真实服务器部署并开启http服务
[root@server2 ~]# /etc/init.d/httpd start
[root@server3 ~]# /etc/init.d/httpd start
客户端测试:
haproxy日志设置(更改日志路径)
[root@server4 haproxy]# vim /etc/rsyslog.conf
12 # Provides UDP syslog reception
13 $ModLoad imudp
14 $UDPServerRun 51461 local7.* /var/log/boot.log
62 local0.* /var/log/haproxy.log[root@server4 log]# /etc/init.d/rsyslog restart ##注意此处使用reload不会生效
更改配置文件,重新加载haproxy服务
[root@server4 haproxy]# /etc/init.d/haproxy reload
查看日志:
ACL访问限制
<1>设置黑名单
[root@server4 haproxy]# vim /etc/haproxy/haproxy.cfg
frontend public
bind *:80 name clear
#bind 192.168.1.10:443 ssl crt /etc/haproxy/haproxy.pem
#use_backend static if { hdr_beg(host) -i img }
#use_backend static if { path_beg /img /css }
acl blacklist src 172.25.33.250 ##黑名单里的ip
http-request deny if blacklist ##拒绝黑名单里的ip用户进行访问
default_backend dynamic[root@server4 haproxy]# /etc/init.d/haproxy reload
测试:
172.25.33.250测试:
其他主机测试:
<2>黑名单访问重定向
[root@server4 haproxy]# vim /etc/haproxy/haproxy.cfg
frontend public
bind *:80 name clear
#bind 192.168.1.10:443 ssl crt /etc/haproxy/haproxy.pem
#use_backend static if { hdr_beg(host) -i img }
#use_backend static if { path_beg /img /css }
acl blacklist src 172.25.33.250
http-request deny if blacklist
errorloc 403 http://172.25.33.4:8080 ##如碰到403报错,将访问重定向default_backend dynamic
[root@server4 haproxy]# /etc/init.d/haproxy reload
黑名单用户浏览器访问haproxy服务器(172.25.33.4):
2、所有用户访问重定向
[root@server4 haproxy]# vim /etc/haproxy/haproxy.cfg
frontend public
bind *:80 name clear
#bind 192.168.1.10:443 ssl crt /etc/haproxy/haproxy.pem
#use_backend static if { hdr_beg(host) -i img }
#use_backend static if { path_beg /img /css }
#acl blacklist src 172.25.33.250
#http-request deny if blacklist
#errorloc 403 http://172.25.33.4:8080
redirect location http://172.25.33.4:8080
default_backend dynamic[root@server4 haproxy]# /etc/init.d/haproxy reload
此时所有主机访问haproxy服务器(172.25.33.4)时都会重定向到http://172.25.33.4:8080
测试:
haproxy实现动静分离
实验环境:
一台客户端:172.25.33.250
一台haproxy服务器:172.25.33.4
两台RS:172.25.33.2 充当被调度的静态页面
172.25.33.3 充当被调度的动态页面
实验步骤:
haproxy服务器配置:
修改配置文件:
[root@server4 haproxy]# vim /etc/haproxy/haproxy.cfg
frontend public
bind *:80 name clear
#bind 192.168.1.10:443 ssl crt /etc/haproxy/haproxy.pem
#use_backend static if { hdr_beg(host) -i img }
#use_backend static if { path_beg /img /css }
use_backend dynamic if { path_end .php }
default_backend static ##默认访问静态页面# the application servers go here
backend static
balance roundrobin
server dynsrv1 172.25.33.2:80 check inter 1000
backend dynamic
balance roundrobin
server dynsrv2 172.25.33.3:80 check inter 1000[root@server4 haproxy]# /etc/init.d/haproxy reload
172.25.33.3配置:被调度的动态页面
[root@server3 ~]# yum install -y php
[root@server3 ~]# cd /var/www/html/
[root@server3 html]# cat index.php
<?php
phpinfo()
?>
测试:
在浏览器输入172.25.33.4,访问到控制静态页面的server2
在浏览器输入172.25.33.4/index.php,访问到控制动态页面的server3
haproxy实现读写分离
将写的请求交给server2处理,将读的请求交给server3处理
haproxy服务器配置:
修改配置文件:
[root@server4 haproxy]# vim /etc/haproxy/haproxy.cfg
frontend public
bind *:80 name clear
#bind 192.168.1.10:443 ssl crt /etc/haproxy/haproxy.pem
#use_backend static if { hdr_beg(host) -i img }
#use_backend static if { path_beg /img /css }acl write method POST
acl write method PUT
acl read method GET
acl read method HEADuse_backend static if write
use_backend dynamic if read
default_backend dynamic[root@server4 haproxy]# /etc/init.d/haproxy reload
后段读写服务器设置:
两台机器必须都安装php
在server2和server3中的httpd默认发布目录,放进去index.php(选择图片的静态页面)和upload_file.php(上传图片的动态页面),在默认发布目录创建存放上传图片upload目录,修改权限为777。
为了防止文件过大造成的上传受限,可以修改upload_file.php文件中的上传文件大小限制
测试:
进入server2的upload目录可以看到上传的文件