目录
一.haproxy介绍
1.harroxy是一款开源的负载均衡软件,它支持TCP和HTTP应用,并能够通过配置文件进行高度定制。它能够在高并发环境下分发网络流量,提高服务器的性能和可靠性
2.haproxy最初是为Linux平台开发的,但现在已经支持多种操作系统。
3.haproxy具有高性能、高可靠性和可扩展性等优点,被广泛应用于高流量的网站和应用程序中。它可以将请求分发到多个服务器,从而实现负载均衡,同时还支持会话保持、健康检查、SSL终止和内容缓存等功能。
4.HAProxy支持多种负载均衡算法,包括轮询、加权轮询、最小连接和哈希等。它还提供了高可用性和故障转移功能,能够自动检测和剔除故障服务器,并将流量重新分发到可用的服务器上。HAProxy还支持SSL终止和TCP代理,可以用于构建高性能的Web应用程序和服务。
二.haproxy的部署步骤
haproxy的部署可以分为以下几个步骤:
安装haproxy:首先,需要在服务器上安装haproxy软件。可以使用系统的包管理工具,如apt或yum,来安装haproxy。
配置haproxy:接下来,需要配置haproxy以定义代理服务器的行为。配置文件通常位于/etc/haproxy/haproxy.cfg。可以使用文本编辑器打开该文件,并根据需求进行相应的配置。配置文件中包含了监听的端口、后端服务器的地址和端口、负载均衡算法等信息。
启动haproxy:配置完成后,可以使用以下命令启动haproxy服务:
sudo systemctl start haproxy
可以使用以下命令检查haproxy是否已成功启动:
sudo systemctl status haproxy
测试haproxy:可以通过访问haproxy绑定的IP地址和端口来测试haproxy是否正常工作。可以使用curl或浏览器等工具进行访问,并查看返回的结果。如果配置正确,haproxy会将请求转发到后端服务器,并返回相应的内容。
高可用性和故障转移:为了实现高可用性和故障转移,可以将多个haproxy服务器组成一个集群,并使用负载均衡软件(如Keepalived)来实现故障检测和自动切换。这样,当一个haproxy服务器出现故障时,其他服务器会接管其工作,确保服务的连续性。
三.haproxy实现http集群负载均衡
实验准备
实验机 | ip地址 | 系统 |
DR机:DR.example.com | 192.168.187.128 | centos8 |
RS1机:RS1.example.com | 192.168.187.131 | centos8 |
RS2机:RS2.example.com | 192.168.187.129 | centos8 |
DR机部署操作
haproxy官网下载地址
# 1.关闭防火墙与selinux
[root@DR ~]# systemctl disable --now firewalld
[root@DR ~]# setenforce 0
[root@DR ~]# sed -i s/SELINUX=.*/SELINUX=disabled/ /etc/selinux/config
# 2.安装haproxy依赖
[root@DR ~]# yum -y install make gcc pcre-devel bzip2-devel openssl-devel systemd-devel
# 3.创建haproxy用户
[root@DR ~]# useradd -r -M -s /sbin/nologin haproxy
# 4.下载haproxy软件包
[root@DR ~]# wget https://www.haproxy.org/download/2.7/src/haproxy-2.7.10.tar.gz
[root@DR ~]# ls
anaconda-ks.cfg haproxy-2.7.10.tar.gz
[root@DR ~]# tar xf haproxy-2.7.10.tar.gz
[root@DR ~]# ls
anaconda-ks.cfg haproxy-2.7.10 haproxy-2.7.10.tar.gz
[root@DR ~]# cd haproxy-2.7.10
[root@DR haproxy-2.7.10]# ls
addons CHANGELOG doc INSTALL Makefile scripts tests
admin CONTRIBUTING examples LICENSE README src VERDATE
BRANCHES dev include MAINTAINERS reg-tests SUBVERS VERSION
# 5.编译安装haproxy,详细阅读INSTALL,里面有安装操作
# 清理
[root@DR haproxy-2.7.10]# make clean
# 编译
[root@DR haproxy-2.7.10]# make -j $(nproc) TARGET=linux-glibc USE_OPENSSL=1 USE_PCRE=1 USE_SYSTEMD=1
# 安装时指定路径
[root@DR haproxy-2.7.10]# make install PREFIX=/usr/local/haproxy
[root@DR haproxy-2.7.10]# ls /usr/local
bin etc games haproxy include lib lib64 libexec sbin share src
[root@DR haproxy-2.7.10]# cd /usr/local/haproxy/
[root@DR haproxy]# ls
doc sbin share
# 6.方便启动haproxy,我们给它做一个软链接
[root@DR haproxy]# ln -s /usr/local/haproxy/sbin/* /usr/sbin/
[root@DR haproxy]# which haproxy
/usr/sbin/haproxy
# 这样就能找到它了
# -V 可以查看它的版本信息
[root@DR haproxy]# haproxy -V
# 7.配置各个负载的内核参数
[root@DR ~]# echo 'net.ipv4.ip_nonlocal_bind = 1' >> /etc/sysctl.conf
[root@DR ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@DR ~]# sysctl -p
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1
# 8.使用harpoxy帮助文档
[root@DR share]# pwd
/usr/local/haproxy/share
[root@DR share]# ls
man
# 这里有一个man目录,但是目前还使用不了
# 编辑/etc/man_db.conf 文件,将当前路径下的man目录写入进去
MANDATORY_MANPATH /usr/local/haproxy/share/man ---接着22行按照模板写入路径
# 然后就可以用man帮助文档查看haproxy
[root@DR ~]# man haproxy
# 9.创建haproxy目录,写入配置文件
[root@DR ~]# mkdir /etc/haproxy
[root@DR ~]# cd /etc/haproxy
[root@DR haproxy]# ls
[root@DR haproxy]#
[root@DR haproxy]# cat > /etc/haproxy/haproxy.cfg <<EOF
#--------------全局配置----------------
global
log 127.0.0.1 local0 info
#log loghost local0 info
maxconn 20480
#chroot /usr/local/haproxy
pidfile /var/run/haproxy.pid
#maxconn 4000
user haproxy
group haproxy
daemon
#---------------------------------------------------------------------
#common defaults that all the 'listen' and 'backend' sections will
#use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
log global
option dontlognull
option httpclose
option httplog
#option forwardfor
option redispatch
balance roundrobin
timeout connect 10s
timeout client 10s
timeout server 10s
timeout check 10s
maxconn 60000
retries 3
#--------------统计页面配置------------------
listen admin_stats
bind 0.0.0.0:8189
stats enable
mode http
log global
stats uri /haproxy_stats
stats realm Haproxy\ Statistics
stats auth admin:admin
#stats hide-version
stats admin if TRUE
stats refresh 30s
#---------------web设置-----------------------
listen webcluster
bind 0.0.0.0:80
mode http
#option httpchk GET /index.html
log global
maxconn 3000 # --- 监听http80端口,添加上2台RS主机的信息
balance roundrobin
cookie SESSION_COOKIE insert indirect nocache
server RS1 192.168.187.131:80 check inter 2000 fall 5
server RS2 192.168.187.129:8080 check inter 2000 fall 5
#server web01 192.168.80.102:80 cookie web01 check inter 2000 fall 5
EOF
# 10.创建haproxy文件开机自启
[root@DR haproxy]# cat > /usr/lib/systemd/system/haproxy.service <<EOF
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
ExecStartPre=/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q
ExecStart=/usr/local/haproxy/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target
EOF
# 11.刷新
[root@DR haproxy]# systemctl daemon-reload
# 设置开机自启haproxy
[root@DR haproxy]# systemctl enable --now haproxy
[root@DR haproxy]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 2048 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 2048 0.0.0.0:8189 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
# 80端口和8189端口起来了
# 12.创建日志并重启rsyslog
[root@DR haproxy]# vim /etc/rsyslog.conf
# 在66行local7.* 的前面加上这一行,将haproxy日志添加进去
local0.* /var/log/harpoxy.log
# 重启rsyslog
[root@DR haproxy]# systemctl restart rsyslog
RS1机部署操作
# 1.关闭防火墙与selinux
[root@RS1 ~]# systemctl disable --now firewalld
[root@RS1 ~]# setenforce 0
[root@RS1 ~]# sed -i s/SELINUX=.*/SELINUX=disabled/ /etc/selinux/config
# 2.安装httpd
[root@RS1 ~]# yum -y install httpd
[root@RS2 ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@RS1 ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 511 *:80 *:*
LISTEN 0 128 [::]:22 [::]:*
# 3.向网页文件添加点内容
[root@RS1 ~]# echo '忘情天尊' > /var/www/html/index.html
# 这时可以通过ip访问到刚刚输入的内容
RS2机部署操作
# 1.关闭防火墙与selinux
[root@RS2 ~]# systemctl disable --now firewalld
[root@RS2 ~]# setenforce 0
[root@RS2 ~]# sed -i s/SELINUX=.*/SELINUX=disabled/ /etc/selinux/config
# 2.安装httpd
[root@RS2 ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@RS2 ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 511 *:80 *:*
LISTEN 0 128 [::]:22 [::]:*
# 3.向网页文件添加点内容
[root@RS2 ~]# echo '玄一大法师' > /var/www/html/index.html
# 这时可以通过ip访问到刚刚输入的内容
# 4.更改httpd服务的端口为8080
[root@RS2 ~]# vim /etc/httpd/conf/httpd.conf
Listen 8080 ----- 第59行
# 重启服务
[root@RS2 ~]# systemctl restart httpd
# 这时访问ip得添加上8080端口才能看到页面
这时可以用DR机的ip地址通过负载均衡访问到RS1,RS2的页面
[root@DR haproxy]# curl http://192.168.187.128
忘情天尊
[root@DR haproxy]# curl http://192.168.187.128
玄一大法师
四.haproxy实现https集群负载均衡
RS1机部署操作
密钥文件创建详情请看上一篇LVS负载均衡博客
# 1.将密钥文件传输进来
[root@RS1 ~]# cd /etc/httpd
[root@RS1 httpd]# mkdir ssl
[root@RS1 httpd]# cd ssl/
[root@RS1 ssl]# ls
[root@RS1 ssl]# ls
httpd.crt httpd.key
# 2.安装httpd-devel
[root@RS1 ssl]# yum -y install httpd-devel
# 3.安装mod_ssl模块
[root@RS1 httpd]# yum list all | grep mod_ssl
mod_ssl.x86_64 1:2.4.37-62.module_el8+657+88b2113f appstream
[root@RS1 httpd]# yum -y install mod_ssl
# 4.查询文件ssl.conf已生成
[root@RS1 httpd]# ls /etc/httpd/conf.d/
autoindex.conf README ssl.conf userdir.conf welcome.conf
# 5.修改ssl文件
[root@RS1 httpd]# vim /etc/httpd/conf.modules.d/00-ssl.conf
[root@RS1 httpd]# cat /etc/httpd/conf.modules.d/00-ssl.conf
LoadModule ssl_module modules/mod_ssl.so
# 6.修改DocumentRoot,ServerName,SSLCertificateFile,SSLCertificateKeyFile
# 因为我们没有创建虚拟主机文件,所以我们直接创建一个虚拟主机家目录,然后写一个index.html文件进去,这里指定那个域名目录
[root@RS1 ~]# mkdir -p /var/www/html/www.pupu.com
[root@RS1 ~]# echo "https to RS1" > /var/www/html/www.pupu.com/index.html
# 43 #DocumentRoot "/var/www/html" 取消注释并改为 DocumentRoot "/var/www/html/www.pupu.com"
# 44 ServerName www.pupu.com:443 取消注释
# 85 SSLCertificateFile /etc/pki/tls/certs/localhost.crt 改为 SSLCertificateFile /etc/httpd/ssl/httpd.crt
# 93 SSLCertificateFile /etc/pki/tls/certs/localhost.key 改为 SSLCertificateKeyFile /etc/httpd/ssl/httpd.key
[root@RS1 ssl]# systemctl restart httpd
# 这时通过ip可以看到https的页面
RS2机部署操作
# 1.将密钥文件传输进来
[root@RS2 ~]# cd /etc/httpd
[root@RS2 httpd]# ls
conf conf.d conf.modules.d logs modules run state
[root@RS2 httpd]# mkdir ssl
[root@RS2 httpd]# cd ssl/
[root@RS2 ssl]# ls
[root@RS2 ssl]# ls
httpd.crt httpd.key
# 2.安装httpd-devel
[root@RSs ssl]# yum -y install httpd-devel
# 3.安装mod_ssl模块
[root@RS2 httpd]# yum list all | grep mod_ssl
mod_ssl.x86_64 1:2.4.37-62.module_el8+657+88b2113f appstream
[root@RS2 httpd]# yum -y install mod_ssl
# 4.查询文件ssl.conf已生成
[root@RS2 httpd]# ls /etc/httpd/conf.d/
autoindex.conf README ssl.conf userdir.conf welcome.conf
# 5.修改ssl文件
[root@RS2 httpd]# vim /etc/httpd/conf.modules.d/00-ssl.conf
[root@RS2 httpd]# cat /etc/httpd/conf.modules.d/00-ssl.conf
LoadModule ssl_module modules/mod_ssl.so
# 6.修改DocumentRoot,ServerName,SSLCertificateFile,SSLCertificateKeyFile
# 因为我们没有创建虚拟主机文件,所以我们直接创建一个虚拟主机家目录,然后写一个index.html文件进去,这里指定那个域名目录
[root@RS2 ~]# mkdir -p /var/www/html/www.pupu.com
[root@RS2 ~]# echo "https to RS1" > /var/www/html/www.pupu.com/index.html
# 43 #DocumentRoot "/var/www/html" 取消注释并改为 DocumentRoot "/var/www/html/www.daozhang.com"
# 44 ServerName www.daozhang.com:443 取消注释
# 85 SSLCertificateFile /etc/pki/tls/certs/localhost.crt 改为 SSLCertificateFile /etc/httpd/ssl/httpd.crt
# 93 SSLCertificateFile /etc/pki/tls/certs/localhost.key 改为 SSLCertificateKeyFile /etc/httpd/ssl/httpd.key
# 7.重启httpd服务
[root@RS2 ssl]# systemctl restart httpd
# 这时通过ip可以看到https的页面
DR机部署操作
# 1.编辑haproxy.cfg文件
# 在上一个监听模板的后面加上这一个模板,表示监听https
[root@DR haproxy]# vim /etc/haproxy/haproxy.cfg
listen webclustr_https
bind 0.0.0.0:443
mode tcp
#option httpchk GET /index.html
log global
maxconn 3000
balance roundrobin
cookie SESSION_COOKIE insert indirect nocache
server RS1_https 192.168.187.131:443 check inter 2000 fall 5
server RS2_https 192.168.187.129:443 check inter 2000 fall 5
#server web01 192.168.80.102:80 cookie web01 check inter 2000 fall 5
# 2.重启服务
[root@DR haproxy]# systemctl restart haproxy
这时可以通过DR机的ip经过负载均衡访问RS1,RS2机的页面
五.haproxy状态页面
通过DR机的8189端口,可以访问haproxy服务的状态页面
用户 admin
密码 admin
登录之后可以看到这样的一个页面,这就是haproxy的状态页面
上面有负载均衡集群几台机器的状态