由于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官方网址: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
官方文档: 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代理服务器:172.20.21.131
nginx后端服务器1: 172.20.21.70
nginx后端服务器2: 172.20.21.70
##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
[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通过固定参数balance
指明对后端服务器的调度算法,该参数可以配置在listen或backend选项中。
HAProxy的调度算法分为静态和动态调度算法,但是有些算法可以根据参数在静态和动态算法中相互转换。
官方文档:http://cbonte.github.io/haproxy-dconv/2.1/configuration.html#4-balance
静态算法:按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、链接数和响应速度等,且无法实时修改权重,只能靠重启HAProxy生效。静态算法有两种:static-rr和first
注:静态算法无法利用工具socat对服务器动态权重调整
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%'.
[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:基于权重的轮询动态调度算法,支持权重的运行时调整,不同于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加权的最少连接的动态,支持权重的运行时调整和慢启动,即当前后端服务器连接最好的优先调度(新客户端连接),比较适合长连接的场景使用,比如: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
其它算法即可作为静态算法,又可以通过选项成为动态算法
源地址hash,基于用户源地址hash并将请求转发到后端服务器,默认为静态即取模方式,但是可以通过hash-type支持的选项更改,后续同一个源地址请求将被转发至同一个后端web服务器,比较适用于session会话保持但不支持cookie和缓存的场景。此方式当后端服务器数据量发生变化时,会导致很多用户的请求转发至新的后端服务器,这个算法一般是在不插入Cookie的TCP模式下使用,也可给拒绝会话cookie的客户提供最好的会话粘性,适用于session会话保持但不支持cookie和缓存的场景。
源地址有两种转发客户端请求到后端服务器的服务器选取计算方式,分别是取模法和一致性hash
hash-type:哈希算法
map-based:除权取余法,哈希数据结构是静态的数组;静态;
consistent:一致性哈希,哈希数据结构是一个树;动态;
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对象到后端服务器的映射关系
一致性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做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中的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
针对用户每个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
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
在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 #很少使用
通过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
访问控制列表(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
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测试
浏览器访问http://172.20.21.131/1.png测试
#配置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 }
##证书制作
[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