HAProxy

一、编译安装haproxy

解决lua环境(Centos7)

由于CentOS7 之前版本自带的lua版本比较低并不符合HAProxy要求的lua最低版本(5.3)的要求,因此需要编译安装较新版本的lua环境,然后才能编译安装HAProxy。参考链接:http://www.lua.org/start.html

##查看当前系统自带的lua版本
[root@node5 ~]# lua -v
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio


##安装基础命令及编译依赖环境
[root@node5 ~]# yum install gcc readline-devel -y
[root@node5 ~]# wget http://www.lua.org/ftp/lua-5.3.5.tar.gz
[root@node5 ~]# tar xvf  lua-5.3.5.tar.gz -C /usr/local/src
[root@node5 ~]# cd /usr/local/src/lua-5.3.5
[root@node5 ~]# make linux test


##查看编译安装的版本
[root@node5 lua-5.3.5]# src/lua -v
Lua 5.3.5  Copyright (C) 1994-2018 Lua.org, PUC-Rio

编译安装HAProxy

haproxy官方网址:http://www.haproxy.org/

[root@node5 ~]# yum -y install gcc openssl-devel pcre-devel systemd-devel gcc-c++
[root@node5 ~]# wget http://www.haproxy.org/download/2.2/src/haproxy-2.2.19.tar.gz
[root@node5 ~]# tar xf haproxy-2.2.19.tar.gz -C /usr/local/src/
[root@node5 ~]# cd /usr/local/src/haproxy-2.2.19/

##可参考INSTALL文件进行编译安装
[root@node5 haproxy-2.2.19]# make -j 4 ARCH=x86_64 TARGET=linux-glibc  USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1  USE_SYSTEMD=1  USE_LUA=1 LUA_INC=/usr/local/src/lua-5.3.5/src/  LUA_LIB=/usr/local/src/lua-5.3.5/src/
[root@node5 haproxy-2.2.19]# make install PREFIX=/usr/local/haproxy



##查看生成的文件
[root@node5 haproxy-2.2.19]# tree /usr/local/haproxy/
/usr/local/haproxy/
├── doc
│   └── haproxy
│       ├── 51Degrees-device-detection.txt
│       ├── architecture.txt
│       ├── close-options.txt
│       ├── configuration.txt
│       ├── cookie-options.txt
│       ├── DeviceAtlas-device-detection.txt
│       ├── intro.txt
│       ├── linux-syn-cookies.txt
│       ├── lua.txt
│       ├── management.txt
│       ├── netscaler-client-ip-insertion-protocol.txt
│       ├── network-namespaces.txt
│       ├── peers.txt
│       ├── peers-v2.0.txt
│       ├── proxy-protocol.txt
│       ├── regression-testing.txt
│       ├── seamless_reload.txt
│       ├── SOCKS4.protocol.txt
│       ├── SPOE.txt
│       └── WURFL-device-detection.txt
├── sbin
│   └── haproxy
└── share
    └── man
        └── man1
            └── haproxy.1


##验证编译安装的HAProxy版本
[root@node5 haproxy-2.2.19]# cp /usr/local/haproxy/sbin/haproxy /usr/sbin/haproxy
[root@node5 haproxy-2.2.19]# which haproxy
/usr/sbin/haproxy
[root@node5 haproxy-2.2.19]# haproxy -v
HA-Proxy version 2.2.19-7ea3822 2021/11/29 - https://haproxy.org/
Status: long-term supported branch - will stop receiving fixes around Q2 2025.
Known bugs: http://www.haproxy.org/bugs/bugs-2.2.19.html
Running on: Linux 5.4.148-1.el7.elrepo.x86_64 #1 SMP Tue Sep 21 10:51:21 EDT 2021 x86_64


##创建haproxy.service文件
[root@node5 ~]# cat /usr/lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target

[Service]
ExecStartPre=/usr/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg -c -q
ExecStart=/usr/sbin/haproxy -Ws -f /usr/local/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID

[Install]
WantedBy=multi-user.target

[root@node5 haproxy-2.2.19]# systemctl daemon-reload


##创建自定义的配置文件,要与haproxy.service中写的路径相对应不然启动会报错
[root@node5 ~]# cat /usr/local/haproxy/haproxy.cfg
global
    maxconn 100000
    chroot /usr/local/haproxy
    stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
    user  haproxy
    group haproxy
    daemon
    pidfile /var/lib/haproxy/haproxy.pid
    log 127.0.0.1 local2 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 *:9999
    stats enable
    log global
    stats uri     /haproxy-status
    stats auth    admin:123456

listen  web_port
    bind *:80
    mode http
    log global
    server web1  172.20.21.70:80  check inter 3000 fall 2 rise 5


##172.20.21.70后端服务器准备一个测试页面,关闭selinux
[root@node1 ~]# setenforce 0
[root@node1 ~]# yum install -y nginx
[root@node1 ~]#  vim /etc/nginx/nginx.conf
    server {
...
        listen       80;
        root         /data/nginx/html; #修改对应的网页文件路径
    }
...
[root@node1 ~]# mkdir /data/nginx/html -p
[root@node1 ~]# echo 172.20.21.70 web page > /data/nginx/html/index.html
[root@node1 ~]# chown -R nginx. /data/nginx/
[root@node1 ~]# systemctl start nginx

##访问测试
[root@node1 ~]# curl 172.20.21.70
172.20.21.70 web page


[root@node5 haproxy-2.2.19]# mkdir /var/lib/haproxy
[root@node5 haproxy-2.2.19]# useradd -s /sbin/nologin haproxy
[root@node5 haproxy-2.2.19]# chown haproxy. /var/lib/haproxy
[root@node5 haproxy-2.2.19]# systemctl start haproxy
[root@node5 haproxy-2.2.19]# systemctl status haproxy
● haproxy.service - HAProxy Load Balancer
   Loaded: loaded (/usr/lib/systemd/system/haproxy.service; disabled; vendor preset: disabled)
   Active: active (running) since 六 2022-01-01 14:58:47 CST; 3min 15s ago
  Process: 2454 ExecStartPre=/usr/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg -c -q (code=exited, status=0/SUCCESS)
 Main PID: 2457 (haproxy)
   CGroup: /system.slice/haproxy.service
           ├─2457 /usr/sbin/haproxy -Ws -f /usr/local/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid
           └─2460 /usr/sbin/haproxy -Ws -f /usr/local/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid

1月 01 14:58:47 node5 systemd[1]: Starting HAProxy Load Balancer...
1月 01 14:58:47 node5 systemd[1]: Started HAProxy Load Balancer.
1月 01 14:58:47 node5 haproxy[2457]: [NOTICE] 000/145847 (2457) : New worker #1 (2460) forked

##访问haproxy主机测试,显示的是后端nginx的自定义的页面
[root@node5 ~]# curl 172.20.21.131
172.20.21.70 web page

global:全局配置段参数详解

官方文档: HAProxy version 2.0.22 - Starter Guide

chroot #锁定运行目录
deamon #以守护进程运行
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin process 1 #socket文件
user, group, uid, gid  #运行haproxy的用户身份
nbproc    n     #开启的haproxy work 进程数,默认进程数是一个
#nbthread  1    #指定每个haproxy进程开启的线程数,默认为每个进程一个线程,和nbproc互斥(版本有关)
#如果同时启用nbproc和nbthread 会出现以下日志的错误,无法启动服务
Apr  7 14:46:23 haproxy haproxy: [ALERT] 097/144623 (1454) : config : cannot enable multiple processes if multiple threads are configured. Please use either nbproc or nbthread but not both.

cpu-map 1 0     #绑定haproxy 进程至指定CPU,将第一个work进程绑定至0号CPU
maxconn  n      #每个haproxy进程的最大并发连接数
maxsslconn  n   #每个haproxy进程ssl最大连接数,用于haproxy配置了证书的场景下
maxconnrate n   #每个进程每秒创建的最大连接数量
spread-checks n #后端server状态check随机提前或延迟百分比时间,建议2-5(20%-50%)之间,默认值0
pidfile         #指定pid文件路径
log 127.0.0.1  local2 info #定义全局的syslog服务器;日志服务器需要开启UDP协议,最多可以定义两个

二  haproxy作为代理服务器,将web服务代理至后端两台nginx

haproxy代理服务器:172.20.21.131

nginx后端服务器1: 172.20.21.70

nginx后端服务器2: 172.20.21.70

配置后端nginx服务器

##172.20.21.70后端服务器准备一个测试页面,关闭selinux
[root@node1 ~]# setenforce 0
[root@node1 ~]# yum install -y nginx
[root@node1 ~]# vim /etc/nginx/nginx.conf
    server {
...
        listen       80;
        root         /data/nginx/html; #修改对应的网页文件路径
    }
...
[root@node1 ~]# mkdir /data/nginx/html -p
[root@node1 ~]# echo 172.20.21.70 web1 page > /data/nginx/html/index.html
[root@node1 ~]# chown -R nginx. /data/nginx/
[root@node1 ~]# systemctl start nginx

##访问测试
[root@node1 ~]# curl 172.20.21.70
172.20.21.70 web1 page


##172.20.21.80后端服务器准备一个测试页面,关闭selinux
[root@node2 ~]# setenforce 0
[root@node2 ~]# yum install -y nginx
[root@node2 ~]# vim /etc/nginx/nginx.conf
    server {
...
        listen       80;
        root         /data/nginx/html; #修改对应的网页文件路径
    }
...
[root@node2 ~]# mkdir /data/nginx/html -p
[root@node2 ~]# echo 172.20.21.80 web2 page > /data/nginx/html/index.html
[root@node2 ~]# chown -R nginx. /data/nginx/
[root@node2 ~]# systemctl start nginx

##访问测试
[root@node2 ~]# curl 172.20.21.80
172.20.21.80 web2 page

修改haproxy服务器配置文件对应的后端服务器

[root@node5 haproxy-2.2.19]# vim /usr/local/haproxy/haproxy.cfg

##修改对应的后端服务器
listen  web_port
    bind *:80
    mode http
    log global
    server web1  172.20.21.70:80  check inter 3000 fall 2 rise 5
    server web2  172.20.21.80:80  check inter 3000 fall 2 rise 5

[root@node5 haproxy-2.2.19]# systemctl restart haproxy

访问测试

访问haproxy的web服务,将由后端两台nginx服务器轮询响应

##访问测试
[root@node5 ~]# while true;do curl http://172.20.21.131;sleep 1;done
172.20.21.70 web1 page
172.20.21.80 web2 page
172.20.21.70 web1 page
172.20.21.80 web2 page
172.20.21.70 web1 page
172.20.21.80 web2 page

三 haproxy调度算法

HAProxy通过固定参数balance指明对后端服务器的调度算法,该参数可以配置在listen或backend选项中。

HAProxy的调度算法分为静态和动态调度算法,但是有些算法可以根据参数在静态和动态算法中相互转换。

官方文档:http://cbonte.github.io/haproxy-dconv/2.1/configuration.html#4-balance

静态算法

静态算法:按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、链接数和响应速度等,且无法实时修改权重,只能靠重启HAProxy生效。静态算法有两种:static-rr和first

注:静态算法无法利用工具socat对服务器动态权重调整

static-rr

static-rr:基于权重的轮询调度,不支持权重的运行时利用socat进行动态调整及后端服务器慢启动,其后端主机数量没有限制,相当于LVS中的wrr

[root@node5 ~]# vim /usr/local/haproxy/haproxy.cfg

listen websrc_80
    bind *:80
    mode http
    log global
    balance static-rr
    server web1 172.20.22.70:80 weight 1 check inter 3000 fall 2 rise 5
    server web2 172.20.22.80:80 weight 2 check inter 3000 fall 2 rise 5
    
#重启haproxy,访问测试
[root@node5 ~]# systemctl restart haproxy

#如果静态算法,如:static-rr,可以更改weight为0或1,但不支持动态更改weight为其它值,否则会提示下面信息
[root@node5 ~]# echo "set weight websrc_80/web1 0" | socat stdio /var/lib/haproxy/haproxy.sock
[root@node5 ~]# echo "set weight websrc_80/web1 1" | socat stdio /var/lib/haproxy/haproxy.sock

[root@node5 ~]# echo "set weight websrc_80/web1 2" | socat stdio /var/lib/haproxy/haproxy.sock
Backend is using a static LB algorithm and only accepts weights '0%' and '100%'.

first

[root@node5 ~]# vim /usr/local/haproxy/haproxy.cfg

listen  websrc_80
  bind 172.20.22.22:80,:8801-8810,172.20.22.22:9001-9010
  mode http
  log global
  balance first  ##指定调度算法
  server web1  172.20.22.11:80 maxconn 2 weight 1 check inter 3000 fall 2 rise 5
  server web2  172.20.22.12:80 weight 1 check inter 3000 fall 2 rise 5

[root@node5 ~]# systemctl restart haproxy


##分别在两台测试机器同时运行下面命令,观察结果
# while  true;do  curl http://172.20.21.131/index.html ; sleep 0.1;done

动态算法

动态算法:基于后端服务器状态进行调度适当调整,优先调度至当前负载较低的服务器,且权重可以在haproxy运行时动态调整无需重启。 动态算法可利用工具socat对服务器动态权重调整

roundrobin

roundrobin:基于权重的轮询动态调度算法,支持权重的运行时调整,不同于lvs中的rr轮询模式,HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数),其每个后端backend中最多支持4095个real server,支持对real server权重动态调整,roundrobin为默认调度算法

listen  web_port
    bind *:80
    mode http
    log global
    balance roundrobin
    server web1 172.20.21.70:80 weight 1 check inter 3000 fall 2 rise 5
    server web2 172.20.21.80:80 weight 2 check inter 3000 fall 2 rise 5


##支持动态调整权重
[root@node5 ~]# echo "get weight web_port/web1" | socat stdio /var/lib/haproxy/haproxy.sock 
1 (initial 1)

[root@node5 ~]# echo "set weight web_port/web1 3" | socat stdio /var/lib/haproxy/haproxy.sock

[root@node5 ~]# echo "get weight web_port/web1" | socat stdio /var/lib/haproxy/haproxy.sock
3 (initial 1)

leastconn

leastconn加权的最少连接的动态,支持权重的运行时调整和慢启动,即当前后端服务器连接最好的优先调度(新客户端连接),比较适合长连接的场景使用,比如:MySQL等场景。

listen  web_port
    bind *:80
    mode http
    log global
    balance leastconn
    server web1  172.20.21.70:80  check inter 3000 fall 2 rise 5
    server web2  172.20.21.80:80  check inter 3000 fall 2 rise 5

其他算法

其它算法即可作为静态算法,又可以通过选项成为动态算法

source

源地址hash,基于用户源地址hash并将请求转发到后端服务器,默认为静态即取模方式,但是可以通过hash-type支持的选项更改,后续同一个源地址请求将被转发至同一个后端web服务器,比较适用于session会话保持但不支持cookie和缓存的场景。此方式当后端服务器数据量发生变化时,会导致很多用户的请求转发至新的后端服务器,这个算法一般是在不插入Cookie的TCP模式下使用,也可给拒绝会话cookie的客户提供最好的会话粘性,适用于session会话保持但不支持cookie和缓存的场景。

源地址有两种转发客户端请求到后端服务器的服务器选取计算方式,分别是取模法和一致性hash

hash-type:哈希算法

  map-based:除权取余法,哈希数据结构是静态的数组;静态;

  consistent:一致性哈希,哈希数据结构是一个树;动态;

map-based取模法

map-based:取模法,基于服务器总权重的hash数组取模,该hash是静态的即不支持在线调整权重,不支持慢启动,其对后端服务器调度均衡,缺点是当服务器的总权重发生变化时,即有服务器上线或下线,都会因为权重发生变化而导致调度结果整体改变,hash-type 指定的默认值为此算法

listen  web_port
    bind *:80
    mode http
    log global
    balance source
    hash-type map-based  #指定的默认算法,可不写
    server web1  172.20.21.70:80  check inter 3000 fall 2 rise 5
    server web2  172.20.21.80:80  check inter 3000 fall 2 rise 5

# echo "get weight web_port/web2" | socat stdio /var/lib/haproxy/haproxy.sock 
1 (initial 1)

# echo "set weight web_port/web2 10" | socat stdio /var/lib/haproxy/haproxy.sock
Backend is using a static LB algorithm and only accepts weights '0%' and '100%'.

# echo "set weight web_port/web2 0" | socat stdio /var/lib/haproxy/haproxy.sock

# echo "get weight web_port/web2" | socat stdio /var/lib/haproxy/haproxy.sock
0 (initial 1)

一致性hash

consistent:一致性哈希,当服务器的总权重发生变化时,对调度结果影响是局部的,不会引起大的变动,hash(o)mod n ,该hash算法是动态的,支持使用 socat等工具进行在线权重调整,支持慢启动

算法:
1、key1=hash(source_ip)%(2^32)  [0---4294967295]
2、keyA=hash(后端服务器虚拟ip)%(2^32)
3、将key1和keyA都放在hash环上,将用户请求调度到离key1最近的keyA对应的后端服务器


hash环偏斜问题:
增加虚拟服务器IP数量,比如:一个后端服务器根据权重为1生成1000个虚拟IP,再hash。而后端服务器权重为2则生成2000的虚拟IP,再bash,最终在hash环上生成3000个节点,从而解决hash环偏斜问题

hash对象:Hash对象到后端服务器的映射关系

HAProxy_第1张图片

一致性hash示意图:后端服务器在线与离线的调度方式

HAProxy_第2张图片

一致性hash配置示例

listen  web_port
    bind *:80
    mode http
    log global
    balance source
    hash-type consistent
    server web1  172.20.21.70:80  check inter 3000 fall 2 rise 5
    server web2  172.20.21.80:80  check inter 3000 fall 2 rise 5

# echo "get weight web_port/web2" | socat stdio /var/lib/haproxy/haproxy.sock
1 (initial 1)

# echo "set weight web_port/web2 5" | socat stdio /var/lib/haproxy/haproxy.sock

# echo "get weight web_port/web2" | socat stdio /var/lib/haproxy/haproxy.sock
5 (initial 1)

uri

基于对用户请求的URI的左半部分或整个uri做hash,再将hash结果对总权重进行取模后,根据最终结果将请求转发到后端指定服务器,适用于后端是缓存服务器场景,默认是静态,也可以通过hash-type指定map-based和consistent,来定义使用取模法还是一致性hash。注意:此算法是应用层,所有只支持 mode http ,不支持 mode tcp

listen  web_port
    bind *:80
    mode http
    log global
    balance uri
    hash-type consistent
    server web1  172.20.21.70:80  check inter 3000 fall 2 rise 5
    server web2  172.20.21.80:80  check inter 3000 fall 2 rise 5

url_param

url_param对用户请求的url中的params部分中的一个参数key对应的value值做hash计算,并由服务器总权重相除以后派发至某挑出的服务器;通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个real server,如果没有key,将按roundrobin算法。

假设:
url = http://www.magedu.com/foo/bar/index.php?key=value

则:
host = "www.magedu.com"
url_param = "key=value"



listen  web_port
    bind *:80
    mode http
    log global
    balance url_param name
    hash-type consistent
    server web1  172.20.21.70:80  check inter 3000 fall 2 rise 5
    server web2  172.20.21.80:80  check inter 3000 fall 2 rise 5

##访问测试
# while true;do curl http://172.20.21.131/index.html?name=jack;sleep 1;done
# while true;do curl http://172.20.22.131/index.html?name=tom;sleep 1;done

hdr

针对用户每个http头部(header)请求中的指定信息做hash,此处由name指定的http首部将会被取出并做hash计算,然后由服务器总权重取模以后派发至某挑出的服务器,如无有效的值则会使用默认的轮询调度。

listen  web_port
    bind *:80
    mode http
    log global
    balance hdr(User-Agent)
    hash-type consistent
    server web1  172.20.21.70:80  check inter 3000 fall 2 rise 5
    server web2  172.20.21.80:80  check inter 3000 fall 2 rise 5


##访问测试
#curl -v http://172.20.21.131/index.html
#curl -vA 'firefox' http://172.20.21.131/index.html
#curl -vA 'chrome' http://172.20.21.131/index.html

rdb-cookie

rdp-cookie对远windows远程桌面的负载,使用cookie保持会话,默认是静态,也可以通过hash-type指定map-based和consistent,来定义使用取模法还是一致性hash。

listen RDB
    bind *:3389
    mode tcp
    balance rdp-cookie
    hash-type consistent
    persist rdp-cookie #启用基于RDB cookie的持久连接,同一个cookie就转发给对应的服务器
    tcp-request inspect-delay 5s #设置内容检查期间等待数据的最大允许时间
    tcp-request content accept if RDP_COOKIE #匹配RDP_COOKIE存在就就收请求
    server rdp0 172.20.21.171:3389 weight 1 check inter 3000 fall 3 rise 5

random

在1.9版本开始增加一个叫做random的负载平衡算法,其基于随机数作为一致性hash的key,随机负载平衡对于大型服务器场或经常添加或删除服务器非常有用,支持weight的动态调整,weight较大的主机有更大概率获取新请求

listen  web_port
    bind *:80
    mode http
    log global
    balance random
    server web1  172.20.21.70:80  check inter 3000 fall 2 rise 5
    server web2  172.20.21.80:80  check inter 3000 fall 2 rise 5

算法总结

static-rr--------->tcp/http  静态
first------------->tcp/http  静态

roundrobin-------->tcp/http 动态
leastconn--------->tcp/http 动态
random------------>tcp/http 动态

以下静态和动态取决于hash_type是否consistent
source------------>tcp/http
Uri--------------->http
url_param--------->http     
hdr--------------->http
rdp-cookie-------->tcp

first       #使用较少

static-rr   #做了session共享的web集群
roundrobin
random

leastconn   #数据库
source      #基于客户端公网IP的会话保持

Uri--------------->http  #缓存服务器,CDN服务商,蓝汛、百度、阿里云、腾讯
url_param--------->http 

hdr         #基于客户端请求报文头部做下一步处理

rdp-cookie  #很少使用

haproxy监控界面

通过web界面,显示当前HAProxy的运行状态

官方文档HAProxy version 2.1.12 - Configuration Manual

状态页配置项

stats enable         #基于默认的参数启用stats page
stats hide-version   #将状态页中haproxy版本隐藏
stats refresh  #设定自动刷新时间间隔,默认不自动刷新
stats uri    #自定义stats page uri,默认值:/haproxy?stats
stats realm   #账户认证时的提示信息,示例:stats realm HAProxy\ Statistics
stats auth : #认证时的账号和密码,可使用多次,默认:no authentication,可有多行用户
stats admin { if | unless }  #启用stats page中的管理功能

启用状态页

[root@node5 ~]# vim /usr/local/haproxy/haproxy.cfg
listen stats
    bind  :9999
    stats enable
    stats hide-version
    stats uri  /haproxy-status
    stats realm HAProxy\ Stats\ Page
    stats auth admin:123456
    stats refresh 30s
    #stats admin if TRUE         #启用管理接口功能,安全原因,不建议打开

[root@node5 ~]# systemctl restart haproxy

登录状态页

浏览器访问管理界面:http://172.20.21.131:9999/haproxy-status

HAProxy_第3张图片

四 基于haproxy,实现网页动静分离

访问控制列表(ACL,Access Control Lists)是一种基于包过滤的访问控制技术,它可以根据设定的条件对经过服务器传输的数据包进行过滤(条件匹配),即对接收到的报文进行匹配和过滤,基于请求报文头部中的源地址、源端口、目标地址、目标端口、请求方法、URL、文件后缀等信息内容进行匹配并执行进一步操作,比如允许其通过或丢弃。

官方文档:

http://cbonte.github.io/haproxy-dconv/2.1/configuration.html#7
http://cbonte.github.io/haproxy-dconv/2.0/configuration.html#7

ACL示例-基于文件后缀名实现动静分离

frontend websrc_80
    bind *:80
    mode http
    log global
    option httplog
    balance roundrobin

###############ACL settings##################
  acl acl_static path_end  -i .jpg .jpeg .png .gif .css .js
  acl acl_php    path_end  -i .php

##############host#########################
  use_backend  static_server    if  acl_static
  use_backend  php_server       if  acl_php

backend static_server
  mode http
  server web1 172.20.21.80:80  check weight 1 inter 3000 fall 3 rise 5

backend php_server
  mode http
  server web2 172.20.21.70:80  check weight 1 inter 3000 fall 3 rise 5


#172.20.21.80上传图片
[root@node2 ~]# ls -lrt /data/nginx/html/1.png 
-rw-r--r--. 1 root root 588707 11月  8 2020 /data/nginx/html/1.png


#172.20.21.70准备php测试页面
[root@node1 ~]# yum install -y php-fpm php-mysql
[root@node1 ~]# systemctl start php-fpm
[root@node1 ~]# vim /etc/nginx/nginx.conf
    server {
        listen       80;
        server_name  localhost;
        root         /data/nginx/html;      
        location ~ \.php$ {
           index index.php;
           fastcgi_pass  127.0.0.1:9000;
           fastcgi_index index.php;
           fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
           include       fastcgi_params;
        }
    }

[root@node1 ~]# nginx -t
[root@node1 ~]# vim /data/nginx/html/index.php


[root@node1 ~]# systemctl restart nginx
   

访问测试

访问php动态资源由定义的后端nginx 172.20.21.70服务器响应,静态资源则由172.20.21.80服务器响应

浏览器访问http://172.20.21.131/index.php测试

HAProxy_第4张图片

浏览器访问http://172.20.21.131/1.png测试

HAProxy_第5张图片

 五 HAProxy实现https

相关配置

#配置HAProxy支持https协议,支持ssl会话;
    bind *:443 ssl crt /PATH/TO/SOME_PEM_FILE   

#crt 后证书文件为PEM格式,且同时包含证书和所有私钥   
        cat  demo.crt demo.key > demo.pem 

#把80端口的请求重向定443
    bind *:80
    redirect scheme https if !{ ssl_fc }    

#向后端传递用户请求的协议和端口(frontend或backend)
    http_request set-header X-Forwarded-Port %[dst_port]
    http_request add-header X-Forwared-Proto https if { ssl_fc }

https配置示例

##证书制作
[root@node5 ~]# cd /usr/local/haproxy/
[root@node5 haproxy]# ls -lrt
[root@node5 haproxy]# mkdir certs
[root@node5 haproxy]# cd certs/
[root@node5 certs]# openssl genrsa -out haproxy.key 2048
Generating RSA private key, 2048 bit long modulus
...........+++
....................+++
e is 65537 (0x10001)

[root@node5 certs]# openssl req -new -x509 -key haproxy.key -out haproxy.crt
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:ShangHai
Locality Name (eg, city) [Default City]:ShangHai
Organization Name (eg, company) [Default Company Ltd]:magedu.net
Organizational Unit Name (eg, section) []:magedu
Common Name (eg, your name or your server's hostname) []:www.magedu.net
Email Address []:
[root@node5 certs]# ll
总用量 8
-rw-r--r-- 1 root root 1350 1月   1 19:28 haproxy.crt
-rw-r--r-- 1 root root 1679 1月   1 19:25 haproxy.key
[root@node5 certs]# cat haproxy.crt haproxy.key > haproxy.pem
[root@node5 certs]# openssl x509 -in haproxy.pem -noout -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            99:9b:c5:0f:df:70:a7:8e
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=CN, ST=ShangHai, L=ShangHai, O=magedu.net, OU=magedu, CN=www.magedu.net
        Validity
            Not Before: Jan  1 11:28:19 2022 GMT
            Not After : Jan 31 11:28:19 2022 GMT
        Subject: C=CN, ST=ShangHai, L=ShangHai, O=magedu.net, OU=magedu, CN=www.magedu.net
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)



##https配置
[root@node5 ~]# vim /usr/local/haproxy/haproxy.cfg
frontend websrc_80
    bind *:80
    bind *:443 ssl crt /usr/local/haproxy/certs/haproxy.pem
    redirect scheme https if !{ ssl_fc }
    http-request  set-header  X-forwarded-Port   %[dst_port]
    http-request  add-header  X-forwarded-Proto  https if { ssl_fc }
    mode http
    log global
    option httplog
    default_backend ngxsrv-hosts

backend ngxsrv-hosts
    mode http
    balance roundrobin
    server web1 172.20.21.70:80 check inter 3000 fall 2 rise 5
    server web2 172.20.21.80:80 check inter 3000 fall 2 rise 5

[root@node5  ~]# systemctl restart haproxy
[root@node5  ~]# ss -tnlp
State      Recv-Q Send-Q                                         Local Address:Port                                                        Peer Address:Port              
LISTEN     0      32768                                                      *:9999                                                                   *:*                   users:(("haproxy",pid=2811,fd=7))
LISTEN     0      32768                                                      *:80                                                                     *:*                   users:(("haproxy",pid=2811,fd=8))
LISTEN     0      128                                                        *:22                                                                     *:*                   users:(("sshd",pid=1007,fd=3))
LISTEN     0      32768                                                      *:443                                                                    *:*                   users:(("haproxy",pid=2811,fd=9))
LISTEN     0      128                                                     [::]:22                                                                  [::]:*                   users:(("sshd",pid=1007,fd=4))

访问测试

添加hosts访问测试,http://www.magedu.net

HAProxy_第6张图片

你可能感兴趣的:(lua,运维,haproxy)