当前位置:   article > 正文

haproxy负载均衡&配置http+https负载集群_haproxy开机自启

haproxy开机自启

haproxy负载均衡&配置http+https负载集群

一、haproxy介绍

HAProxy是一种开源的负载均衡和代理服务器软件,可以实现高可用性和性能优化。它通常用于将传入的请求分发到多个后端服务器,以达到负载均衡的目的。

二、工作原理

HAProxy的工作原理是通过分析传入的请求,并使用配置的规则来决定如何处理请求。它可以根据多种策略(如轮询、最小连接数、源IP地址等)将请求分发到后端服务器。HAProxy还支持会话保持,它可以确保具有相同会话标识符的请求都被发送到同一个后端服务器,以确保用户的一致性体验。

三、工作流程

HAProxy的工作流程如下:
  1. 监听端口:HAProxy监听一个或多个端口,接收传入的请求
  2. 请求分发:根据配置的负载均衡规则,HAProxy将请求分发到一个或多个后端服务器。
  3. 响应返回:后端服务器处理请求并将响应返回给HAProxy。
  4. 响应传输:HAProxy将后端服务器的响应传输给客户端。

四、haproxy的部署步骤

haproxy的部署可以分为以下几个步骤:
  1. 安装haproxy:首先,需要在服务器上安装haproxy软件。可以使用系统的包管理工具,如apt或yum,来安装haproxy。
  2. 配置haproxy:接下来,需要配置haproxy以定义代理服务器的行为。配置文件通常位于/etc/haproxy/haproxy.cfg。可以使用文本编辑器打开该文件,并根据需求进行相应的配置。配置文件中包含了监听的端口、后端服务器的地址和端口、负载均衡算法等信息。
  3. 启动haproxy,配置完成后启动haproxy服务
  4. 测试haproxy:可以通过访问haproxy绑定的IP地址和端口来测试haproxy是否正常工作。可以使用curl或浏览器等工具进行访问,并查看返回的结果。如果配置正确,haproxy会将请求转发到后端服务器,并返回相应的内容。
  5. 高可用性和故障转移:为了实现高可用性和故障转移,可以将多个haproxy服务器组成一个集群,并使用负载均衡软件(如Keepalived)来实现故障检测和自动切换。这样,当一个haproxy服务器出现故障时,其他服务器会接管其工作,确保服务的连续性。

五、部署haproxy实现http集群负载均衡

实验准备:

实验机说明主机名ip地址系统
负载调度器DR192.168.10.130CentOS-8
后端服务器1RS1192.168.10.131CentOS-8
后端服务器2RS2192.168.10.133CentOS-8

DR负载均衡器部署操作

编译安装haproxy

首先在DR调度机上安装依赖包

[root@DR ~]# yum -y install make gcc pcre-devel bzip2-devel openssl-devel systemd-devel --allowerasing
  • 1

创建haproxy用户

[root@DR ~]# useradd -r -M -s /sbin/nologin haproxy
[root@DR ~]# id haproxy
uid=995(haproxy) gid=992(haproxy) groups=992(haproxy)
  • 1
  • 2
  • 3

下载haproxy

[root@DR opt~]# wget https://www.haproxy.org/download/2.7/src/haproxy-2.7.10.tar.gz
  • 1

解压

[root@DR opt]# tar xf haproxy-2.7.10.tar.gz 
  • 1

编译安装haproxy,详细阅读INSTALL,里面有安装操作

[root@DR haproxy-2.7.10]# ls
addons  BRANCHES   CONTRIBUTING  doc       haproxy  INSTALL  MAINTAINERS  README     scripts  SUBVERS  VERDATE
admin   CHANGELOG  dev           examples  include  LICENSE  Makefile     reg-tests  src      tests    VERSION
[root@DR haproxy-2.7.10]# vim INSTALL 
  • 1
  • 2
  • 3
  • 4

编译

[root@DR opt]# cd haproxy-2.7.10
[root@DR haproxy-2.7.10]# make clean    # 清除上次的make命令所产生的object文件
[root@DR haproxy-2.7.10]# make -j $(nproc) \
> TARGET=linux-glibc  \
> USE_OPENSSL=1  \
> USE_PCRE=1  \
> USE_SYSTEMD=1
  CC      src/slz.o
  CC      src/ev_poll.o
  CC      src/ev_epoll.o
  CC      src/cpuset.o
.......
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

安装

[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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

创建软连接

[root@DR haproxy]# ln -s /usr/local/haproxy/sbin/* /usr/sbin/
  • 1

查看环境变量中的文件

[root@DR haproxy]# which haproxy
/usr/sbin/haproxy
  • 1
  • 2

查看haproxy的版本号

[root@DR haproxy]# haproxy -V
HAProxy version 2.7.10-d796057 2023/08/09 - https://haproxy.org/
Status: stable branch - will stop receiving fixes around Q1 2024.
Known bugs: http://www.haproxy.org/bugs/bugs-2.7.10.html
Running on: Linux 4.18.0-365.el8.x86_64 #1 SMP Thu Feb 10 16:11:23 UTC 2022 x86_64
.....
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

配置各个负载的内核参数

[root@DR ~]# echo 'net.ipv4.ip_nonlocal_bind = 1' >>  /etc/sysctl.conf   #没有配置的本地ip也能放在配置文件中
[root@DR ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf      # 开启IP转发功能
  • 1
  • 2

使配置的参数立即生效

[root@DR ~]# sysctl  -p
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1
[root@DR ~]# 
  • 1
  • 2
  • 3
  • 4

配置加入systemctl管理

[root@DR ~]# vim /usr/lib/systemd/system/haproxy.service
[root@DR ~]# cat /usr/lib/systemd/system/haproxy.service
[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 
 
[Install]
WantedBy=multi-user.target
[root@DR ~]# 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

配置man文档

[root@DR haproxy]# cd share/
[root@DR share]# ls   #这里有一个man文档但是使用不了
man
[root@DR share]# pwd
/usr/local/haproxy/share
# 编辑/etc/man_db.conf 文件,将当前路径下的man目录写入进去
[root@DR share]# vim /etc/man_db.conf 
......
MANDATORY_MANPATH                       /usr/man
MANDATORY_MANPATH                       /usr/share/man
MANDATORY_MANPATH                       /usr/local/share/man
MANDATORY_MANPATH                       /usr/local/haproxy/share/man    #添加这一行
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

然后就可以用man帮助文档查看haproxy

[root@DR share]# man haproxy
  • 1

创建存放haproxy配置文件的目录

[root@DR share]# mkdir /etc/haproxy
[root@DR share]# cd /etc/haproxy
[root@DR haproxy]# ls
  • 1
  • 2
  • 3

生成配置文件

#直接复制下面的内容,然后执行
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
    balance roundrobin
    cookie SESSION_COOKIE insert indirect nocache
    server RS1 192.168.10.131:80 check inter 2000 fall 5    #在这里添加两台主机的信息
    server RS2 192.168.10.133:8080 check inter 2000 fall 5
    #server web01 192.168.80.102:80 cookie web01 check inter 2000 fall 5
EOF
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57

重启haproxy服务

[root@DR ~]# systemctl restart haproxy.service
  • 1

创建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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

刷新

[root@DR haproxy]# systemctl daemon-reload
  • 1

设置开机自启haproxy

[root@DR haproxy]# systemctl enable --now haproxy
Created symlink /etc/systemd/system/multi-user.target.wants/haproxy.service → /usr/lib/systemd/system/haproxy.service.
[root@DR haproxy]# 
[root@DR haproxy]# ss -antl           
# 80端口和8189端口起来了
State         Recv-Q        Send-Q               Local Address:Port               Peer Address:Port       Process       
LISTEN        0             128                        0.0.0.0:80                      0.0.0.0:*                        
LISTEN        0             128                        0.0.0.0:22                      0.0.0.0:*                        
LISTEN        0             128                        0.0.0.0:8189                    0.0.0.0:*                        
LISTEN        0             128                           [::]:22                         [::]:*                        
[root@DR haproxy]# 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

创建日志并重启rsyslog

[root@DR ~]# vim /etc/rsyslog.conf
#进入配置文件,命令行输入/local7找到这一行
local0.*                                                /var/log/harpoxy.log     #在/local7前一行加入这一行
local7.*                                                /var/log/boot.log
  • 1
  • 2
  • 3
  • 4

重启rsyslog

[root@DR ~]# systemctl restart rsyslog.service
  • 1

关闭防火墙和selinux

[root@localhost ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@localhost ~]# 
[root@localhost ~]# setenforce 0
[root@RS1 ~]# vim /etc/selinux/config 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在RS1、RS2上安装httpd

yum -y install httpd
  • 1

设置开机自启

systemctl enable --now httpd
  • 1

更改RS2的httpd端口号为8080

[root@RS2 ~]# vim /etc/httpd/conf/httpd.conf 
#Listen 12.34.56.78:80     #命令行输入/80找到这一行
Listen 8080                #添加这一行
  • 1
  • 2
  • 3

重启服务

[root@RS2 ~]# systemctl restart httpd
  • 1

在两台主机的网页文件中写入不同的内容以便区分两台主机

RS1

[root@RS1 ~]# echo "RS1" > /var/www/html/index.html
[root@RS1 ~]# cat /var/www/html/index.html
RS1
[root@RS1 ~]# 
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

RS2

[root@RS2 ~]# echo "RS2" > /var/www/html/index.html
[root@RS2 ~]# cat /var/www/html/index.html
RS2
[root@RS2 ~]# 
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

到这里http负载集群就配置完成了

测试:

用DR调度机的IP地址通过负载均衡访问到RS1,RS2的页面

命令行测试

[root@DR ~]# curl http://192.168.10.130
RS1
[root@DR ~]# curl http://192.168.10.130
RS2
[root@DR ~]# 
  • 1
  • 2
  • 3
  • 4
  • 5

浏览器测试

在这里插入图片描述

刷新一下

在这里插入图片描述

在网页上监听负载均衡集群状态

地址栏加上8189端口号和haproxy_stats
登陆的用户名和密码都是:admin

在这里插入图片描述

在这里插入图片描述

在RS2主机上将httpd服务停止

[root@RS2 ~]# systemctl stop httpd
[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             128                           [::]:22                         [::]:*                        
[root@RS2 ~]# 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

重新加载网页

在这里插入图片描述

发现RS2状态为DOWN

六、部署haproxy实现https集群负载均衡

首先要,配置用于测试的https页面

然后要生成证书,并在所有后端服务器上安装证书

生成密钥对和证书步骤,请参考:生成密钥对和证书的步骤_嗝~壁老黄的博客-CSDN博客

配置https负载均衡规则

启动httpd服务

httpd服务端口号是443

RS1

[root@RS1 ~]# systemctl restart 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            128                         [::]:22                       [::]:*                      
LISTEN       0            128                            *:443                         *:*                      
LISTEN       0            128                            *:80                          *:*                      
[root@RS1 ~]# 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

RS2

[root@RS2 ssl]# systemctl restart httpd.service
[root@RS2 ssl]# 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             128                              *:80                            *:*                        
LISTEN        0             128                           [::]:22                         [::]:*                        
LISTEN        0             128                              *:443                           *:*                        
[root@RS2 ssl]# 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在DR负载均衡器上添加配置文件内容

[root@DR ~]# vim /etc/haproxy/haproxy.cfg
#在web设置下将bind后面的80端口改成443,mode后面的http改正tcp,RS1和RS2的端口号改成443
#---------------web设置-----------------------
listen webcluster
    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 192.168.10.131:443 check inter 2000 fall 5
    server RS2 192.168.10.133:443 check inter 2000 fall 5
    #server web01 192.168.80.102:80 cookie web01 check inter 2000 fall 5
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

重启haproxy服务,并查看端口

[root@DR ~]# systemctl restart haproxy
[root@DR ~]# 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             128                        0.0.0.0:443                     0.0.0.0:*                        
LISTEN        0             128                        0.0.0.0:8189                    0.0.0.0:*                        
LISTEN        0             128                           [::]:22                         [::]:*                        
[root@DR ~]# 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

浏览器网页访问测试

第一次访问,负载均衡器把请求转发给了RS1

在这里插入图片描述

刷新几次

访问请求转发给了RS2

在这里插入图片描述

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号