二、Haproxy的部署及配置文件说明

一、Haproxy在centos7上的部署

1、实验环境

System OS: CentOS Linux release 7.8.2003 (Core)
内核:3.10.0-1127.el7.x86_64

2、yum安装

[root@node4 ~]# yum provides haproxy
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
haproxy-1.5.18-9.el7.x86_64 : TCP/HTTP proxy and load balancer for high availability environments
Repo        : base

[root@node4 ~]# yum install -y haproxy
#yum部署的haproxy版本为比较旧

3、第三方安装包部署

 
#https://pkgs.org/download/haproxy #下载rpm包
#部署步骤

#准备工作
mkdir /app
cd /app

#Download latest cheese-release rpm from
#http://www.nosuchhost.net/~cheese/fedora/packages/epel-7/x86_64/cheese-release.html
wget http://www.nosuchhost.net/~cheese/fedora/packages/epel-7/x86_64/cheese-release-7-1.noarch.rpm

#Install cheese-release rpm:
rpm -Uvh cheese-release*rpm

#查看可以安装的haproxy版本
[root@node4 ~]# yum provides haproxy
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
haproxy-1.5.15-1.el7.x86_64 : HAProxy reverse proxy for high availability environments
Repo        : cheese
haproxy-1.5.18-9.el7.x86_64 : TCP/HTTP proxy and load balancer for high availability environments 
Repo        : base
haproxy-1.7.3-2.el7.x86_64 : HAProxy reverse proxy for high availability environments Repo        : cheese
haproxy-1.8.12-4.el7.x86_64 : HAProxy reverse proxy for high availability environments Repo        : cheese
haproxy-1.8.13-1.el7.x86_64 : HAProxy reverse proxy for high availability environments Repo        : cheese
haproxy-1.8.14-1.el7.x86_64 : HAProxy reverse proxy for high availability environments Repo        : cheese
haproxy-1.8.14-1.el7.x86_64 : HAProxy reverse proxy for high availability environments Repo        : @cheese


#Install haproxy rpm package:
yum install -y haproxy-1.8.14-1.el7.x86_64

#查看安装的版本
[root@node4 ~]# haproxy -v
HA-Proxy version 1.8.14-52e4d43 2018/09/20
Copyright 2000-2018 Willy Tarreau <willy@haproxy.org>

4、编译安装HAProxy

编译安装HAProxy 2.0 LTS版本,更多源码包下载地址:http://www.haproxy.org/download/

HAProxy 支持基于lua实现功能扩展,lua是一种小巧的脚本语言,于1993年由巴西里约热内卢天主教大学
(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组开发,其设计目的是为了嵌入应用程序中,
从而为应用程序提供灵活的扩展和定制功能。

Lua 应用场景
1)游戏开发
2)独立应用脚本
3)Web 应用脚本
4)扩展和数据库插件,如MySQL Proxy
5)安全系统,如入侵检测系统

4.1、部署lua环境

由于centos自带的lua版本比较低并不符合HAProxy要求的lua最低版本(5.3)的要求,因此需要编译安装较新版本的 lua环境,然后才能编译安装HAProxy

 
#lua的当前版本
[root@node4 app]# lua -v
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio

#源码部署5.3.5lua
mkdir /app
cd /app
yum install -y libtermcap-devel ncurses-devel libevent-devel readline-devel gcc gcc-c++
wget http://www.lua.org/ftp/lua-5.3.5.tar.gz
tar xvf lua-5.3.5.tar.gz
cd lua-5.3.5
make linux test

#拷贝新版本的lua命令
mv /usr/bin/lua /usr/bin/lua.bak
ln -s /app/lua-5.3.5/src/lua /usr/bin/lua
[root@node4 lua-5.3.5]# ll /usr/bin/lua
lrwxrwxrwx 1 root root 22 Jan  6 18:58 /usr/bin/lua -> /app/lua-5.3.5/src/lua
[root@node4 ~]# lua -v
Lua 5.3.5  Copyright (C) 1994-2018 Lua.org, PUC-Rio

4.2编译安装HAProxy

#下载haproxy2.0.4,下载地址:http://www.haproxy.org/download
mkdir /app
cd /app
wget http://www.haproxy.org/download/2.0/src/haproxy-2.0.4.tar.gz
tar xvf haproxy-2.0.4.tar.gz
#安装依赖包
yum install -y gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel net-tools vim iotop bc zip unzip zlib-devel lrzsz tree screen lsof tcpdump wget ntpdate 

#安装编译环境
#HAProxy 1.8及1.9版本编译参数:
cd haproxy-1.8.4
make ARCH=x86_64 TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1
USE_CPU_AFFINITY=1 PREFIX=/usr/local/haproxy

#HAProxy 2.0编译参数:
cd haproxy-2.0.4
make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 \
USE_SYSTEMD=1 USE_CPU_AFFINITY=1 USE_LUA=1 LUA_INC=/app/lua-5.3.5/src/ \
LUA_LIB=/app/lua-5.3.5/src/ PREFIX=/usr/local/haproxy

make install PREFIX=/usr/local/haproxy
cp haproxy /usr/sbin/
echo 'export PATH=/usr/local/haproxy/sbin:$PATH' > /etc/profile.d/haproxy.sh
source /etc/profile

查看haproxy安装版本

[root@node4 haproxy-2.0.4]# haproxy -v
HA-Proxy version 2.0.4 2019/08/06 - https://haproxy.org/

4.3创建haproxy的启动用户及配置文件

 
#启动用户
useradd -M -s /sbin/nologin haproxy
[root@node4 ~]# id haproxy
uid=1000(haproxy) gid=1000(haproxy) groups=1000(haproxy)

#配置文件
mkdir /etc/haproxy
cd /etc/haproxy
cat >> harproxy.cfg <<EOF
global
maxconn 100000
chroot /usr/local/haproxy
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
#启动用户的uid和gid号,有2中配置方法
uid 99
gid 99
#user haproxy
#group haproxy
daemon
#nbproc 4
#cpu-map 1 0
#cpu-map 2 1
#cpu-map 3 2
#cpu-map 4 3
pidfile /var/lib/haproxy/haproxy.pid
log 127.0.0.1 local3 info
defaults
option http-keep-alive
option forwardfor
maxconn 100000
mode http
timeout connect 300000ms
timeout client 300000ms
timeout server 300000ms
listen stats
mode http
bind 0.0.0.0:9999
stats enable
log global
stats uri /haproxy-status
stats auth haadmin:123456
listen web_port
bind 192.168.7.101:80
mode http
log global
server web1 127.0.0.1:8080 check inter 3000 fall 2 rise 5
EOF

4.4HAproxy的启动脚本

cat >> /usr/lib/systemd/system/haproxy.service <<EOF
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
ExecStartPre=/usr/sbin//haproxy -f /etc/haproxy/haproxy.cfg -c -q
ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target

4.5启动haproxy

mkdir /var/lib/haproxy
chown haproy.haproxy /var/lib/haproxy/ -R
systemctl start haproxy
systemctl enable haproxy
systemctl status haproxy
[root@node4 ~]# id haproxy
uid=1000(haproxy) gid=1000(haproxy) groups=1000(haproxy)
[root@node4 ~]# systemctl status haproxy
● haproxy.service - HAProxy Load Balancer
   Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2021-01-06 19:58:33 CST; 1h 31min ago
  Process: 19093 ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q (code=exited, status=0/SUCCESS)
 Main PID: 19095 (haproxy)
   CGroup: /system.slice/haproxy.service
           ├─19095 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid
           └─19098 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid

Jan 06 19:58:33 node4 systemd[1]: Starting HAProxy Load Balancer...
Jan 06 19:58:33 node4 systemd[1]: Started HAProxy Load Balancer.
Jan 06 19:58:33 node4 haproxy[19095]: [NOTICE] 005/195833 (19095) : New worker #1 (19098) forked
Jan 06 19:58:33 node4 haproxy[19095]: [WARNING] 005/195833 (19098) : Server web_port/web1 is DOWN, reason: Layer4 connection problem, info: "Conn...in queue.
Jan 06 19:58:33 node4 haproxy[19095]: [ALERT] 005/195833 (19098) : proxy 'web_port' has no server available!
Hint: Some lines were ellipsized, use -l to show in full.

[root@node4 ~]# ps -ef |grep haproxy
root     19095     1  0 19:58 ?        00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid
haproxy  19098 19095  0 19:58 ?        00:00:01 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid
root     23640  1811  0 21:32 pts/0    00:00:00 grep --color=auto haproxy

二、haproxy的基础配置

HAPrpxy的配置文件haproxy.cfg由两大部分组成,分别是global和proxies部分。

global:全局配置段

进程及安全配置相关的参数
性能调整相关参数
Debug参数

proxies:代理配置段

defaults:为frontend, backend, listen提供默认配置
frontend:前端,相当于nginx中的server {}
backend:后端,相当于nginx中的upstream {}
listen:同时拥有前端和后端配置

1、global配置参数

官方文档 https://cbonte.github.io/haproxy-dconv/2.0/intro.html

global    #全局参数的设置
chroot /usr/local/haproxy #锁定运行目录
deamon #以守护进程运行
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin #socket文件
 #运行haproxy的用户身份
user haproxy 
group haproxy
#uid 1000
#gid 1000
nbproc  2 #开启的haproxy进程数,与CPU保持一致
nbthread 1 #指定每个haproxy进程开启的线程数,默认为每个进程一个线程
#绑定haproxy 进程至指定CPU
cpu-map 1 0 
cpu-map 2 1
maxconn  4000 #每个haproxy进程的最大并发连接数
maxsslconn #每个haproxy进程ssl最大连接数,用于haproxy配置了证书的场景下
maxconnrate #每个进程每秒创建的最大连接数量
spread-checks 2 #后端server状态check随机提前或延迟百分比时间,建议2-5(20%-50%)之间
pidfile /var/lib/haproxy/haproxy.pid #指定pid文件路径
log 127.0.0.1 local3 info #定义全局的syslog服务器;最多可以定义两个
# log语法:log <address_1>[max_level_1] 
# 全局的日志配置,使用log关键字,指定使用127.0.0.1上的syslog服务中的local0日志设备,记录日志等级为info的日志

2、Proxies配置

官方文档 https://cbonte.github.io/haproxy-dconv/2.0/configuration.html

defaults [<name>] #默认配置项,针对以下的frontend、backend和lsiten生效,可以多个name也可以没有
name
frontend <name> #前端servername,类似于Nginx的一个虚拟主机 server。
backend <name> #后端服务器组,等于nginx的upstream
listen <name> #将frontend和backend合并在一起配置

注意:name字段只能使用”-”、”_”、”.”、和”:”,并且严格区分大小写,例如:Web和web是完全不同的两组服务器。

2.1 Proxies配置-defaults

defaults 配置参数:

 
option redispatch #当server Id对应的服务器挂掉后,强制定向到其他健康的服务器,重新派发
option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接,关闭
option http-keep-alive #开启与客户端的会话保持
option forwardfor #透传客户端真实IP至后端web服务器
mode http #设置默认工作类型
timeout http-keep-alive 120s #session 会话保持超时时间,范围内会转发到相同的后端服务器
timeout connect 120s #客户端请求从haproxy到后端server的最长连接等待时间(TCP之前)
timeout server 600s #客户端请求从haproxy到后端服务端的请求处理超时时长(TCP之后)
timeout client 600s #设置haproxy与客户端的最长非活动时间
timeout check 5s #对后端服务器的默认检测超时时间

2.2 Proxies配置-frontend

frontend配置参数

 
bind:指定HAProxy的监听地址,可以是IPV4或IPV6,可以同时监听多个IP或端口,可同时用于listen字段中
bind [<address>]:<port_range> [, ...] [param*]

listen http_proxy #监听http的多个IP的多个端口和sock文件
  bind :80,:443,:8801-8810
  bind 10.0.0.1:10080,10.0.0.1:10443
  bind /var/run/ssl-frontend.sock user root mode 600 accept-proxy
listen http_https_proxy #https监听
  bind :80
  bind :443 ssl crt /etc/haproxy/site.pem

listen http_https_proxy_explicit #监听ipv6、ipv4和unix sock文件
  bind ipv6@:80
  bind ipv4@public_ssl:443 ssl crt /etc/haproxy/site.pem
  bind unix@ssl-frontend.sock user root mode 600 accept-proxy
listen external_bind_app1 #监听file descriptor
  bind "fd@${FD_APP1}"
生产示例:
frontend WEB_PORT
  bind :80,:8080
  bind 192.168.7.102:10080,:8801-8810,192.168.7.101:9001-9010
  mode http/tcp #指定负载协议类型
  use_backend backend_name #调用的后端服务器组名称

2.3 Proxies配置-backend

定义一组后端服务器,backend服务器将被frontend进行调用

 
mode http/tcp #指定负载协议类型
option #配置选项
server #定义后端real server
#注意:option后面加httpchk,smtpchk,mysql-check,pgsql-check,ssl-hello-chk方法,可用于实现更多应用层检测功能

check #对指定real进行健康状态检查,默认不开启
  addr IP #可指定的健康状态监测IP
  port num #指定的健康状态监测端口
  inter num #健康状态检查间隔时间,默认2000 ms
  fall num #后端服务器失效检查次数,默认为3
  rise num #后端服务器从下线恢复检查次数,默认为2
weight #默认为1,最大值为256,0表示不参与负载均衡
backup #将后端服务器标记为备份状态
disabled #将后端服务器标记为不可用状态
redirect prefix http://www.magedu.net/ #将请求临时重定向至其它URL,只适用于http模式
maxconn <maxconn>:当前后端server的最大并发连接数
backlog <backlog>:当server的连接数达到上限后的后援队列长度

2.4 frontend+backend配置实例

#官网业务访问入口
frontend WEB_PORT_80
  bind 192.168.7.248:80
  mode http
  use_backend web_prot_http_nodes
#后端真实服务器
backend web_prot_http_nodes
mode http
option forwardfor
server 192.168.7.101 192.168.7.101:8080 check inter 3000 fall 3 rise 5
server 192.168.7.102 192.168.7.102:8080 check inter 3000 fall 3 rise 5

2.5 Proxies配置-listen替代frontend+backend

使用listen替换frontend和backend的配置方式:
#官网业务访问入口=====================================
listen WEB_PORT_80
  bind 192.168.7.102:80
  mode http
  option forwardfor
  server web1 192.168.32.201:80 check inter 3000 fall 3 rise 5
  server web2 192.168.32.202:80 check inter 3000 fall 3 rise 5

三、实验案例

1、实验环境

System OS: CentOS Linux release 7.8.2003 (Core)
内核:3.10.0-1127.el7.x86_64

web01:
node1 10.0.0.201 nginx
web02:
node2 10.0.0.202 nginx
haproxy:
node4 192.168.32.204 外网
node4 10.0.0.204 内网

客户机:
node3 192.168.32.203

2、web服务部署

yum install -y nginx
systemctl start nginx
systemctl enable nginx

web01
echo 'web01 10.0.0.201' > /usr/share/nginx/html/index.html
web02
echo 'web02 10.0.0.202' > /usr/share/nginx/html/index.html

[root@node4 ~]# curl 10.0.0.201
web01 10.0.0.201
[root@node4 ~]# curl 10.0.0.202
web02 10.0.0.202

3、haproxy部署

haproxy的安装部署见前文

haproxy.cfg文件配置

global
maxconn 100000
chroot /usr/local/haproxy
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
#uid 1000
#gid 1000
user haproxy
group haproxy
daemon
nbproc 2
cpu-map 1 0
cpu-map 2 1
pidfile /var/lib/haproxy/haproxy.pid
log 127.0.0.1 local3 info

defaults
option http-keep-alive
option forwardfor
maxconn 100000
mode http
timeout connect 300000ms
timeout client 300000ms
timeout server 300000ms

listen stats
  mode http
  bind 192.168.32.204:9999
  stats enable
  log global
stats uri /haproxy-status
  stats auth haadmin:123456

listen web_port
  bind 192.168.32.204:80
  mode http
  log global
  balance roundrobin
  server web01 10.0.0.201:80 check inter 3000 fall 2 rise 5
  server web02 10.0.0.202:80 check inter 3000 fall 2 rise 5

4、测试

在客户机上测试

 
[root@node3 ~]# curl 192.168.32.204
web01 10.0.0.201
[root@node3 ~]# curl 192.168.32.204
web01 10.0.0.201
[root@node3 ~]# curl 192.168.32.204
web02 10.0.0.202
[root@node3 ~]# curl 192.168.32.204
web02 10.0.0.202
#客户端访问

 

 
posted @ 2021-01-06 16:29  yaowx  阅读(1520)  评论(0编辑  收藏  举报