HAProxy - 基础配置.note
·报错:

这条命令是haproxy的健康检测,当无法检测到 /favicon.ico 时,就会报错 503
·准备环境:
一台Linux服务器作为 HAProxy,一台Linux客户端,至少两台 Web服务器即可
apt install -y haproxy
一、配置 http 静态资源代理:
1、复制配置文件参考:
vim /usr/share/doc/haproxy/examples/content-sw-sample.cfg
# 在其中将其复制
2、编辑配置文件:
vim /etc/haproxy/haproxy.cfg
模式默认为 http

systemctl restart haproxy //重启服务
3、在 客户端上进行访问:
(1)先 编写hosts本地解析,或者配置一个DNS,将 WebSite 的域名,指向 HAProxy服务器:

(2)成功访问到 Apache页面:

(3)再刷新多刷新几次,就成功访问到 Nginx页面:

二、配置 网站动静分离:
1、配置 一个 php站点:
(1)配置一台服务器为 php站点接收动态页面:
apt install -y php8.2-fpm
echo "<?php phpinfo(); ?>" > /var/www/html/index.php
vim /etc/nginx/sites-enable/default默认配置文件中有php的配置参考,直接取消注释,将版本替换成下载的对应的版本即可

重启 Nginx服务
2、配置 动静分离:
需要多定义一个后端服务器群组
vim /etc/haproxy/haproxy.cfg
因为这里的后端服务器群组中只有一台服务器,因此没有定义 check,当然定义了也是没有影响的。

use_backend 字段不仅能匹配,还能够匹配后缀为 php 的请求,修改一下,就能够匹配更多其它自定义请求,可以通过它将不同的请求发送给指定的后端服务器
举个例子:
假如,我后端有两台web服务器,server1,server2,而 123.html 这个文件只在server1上有,请求丢到server2上就是‘not found’,那么使用这个方法,匹配123.html 就能够将请求发送给server1
3、在 客户端上进行访问:
(1)访问不带 php 后缀的页面:
·正常访问

(2)访问以 php 后缀结尾的页面:
注意:页面(资源)要在服务器上真实存在,能够被访问到,否则会报错:404(找不到)
·动静分离配置成功

三、【TLS/SSL(1)】前端https,后端http:
前端与客户端连接使用https,后端与服务器连接使用http
1、配置 CA证书:
(1)配置 即将生成的CA证书的参数:
vim /etc/ssl/openssl.cnf
(2)配置证书:
cd
/usr/lib/ssl/misc/CA.pl -newca
/usr/lib/ssl/misc/CA.pl -newreq-nodes
/usr/lib/ssl/misc/CA.pl -sign2、配置 haproxy 的 SSL 证书:
(1)将 证书 和 私钥 复制进同一个文件中:
cat ~/web.crt ~/web.key > /etc/ssl/web.pem (2)编辑 haproxy配置文件:
vim /etc/haproxy/haproxy.cfg
# 书写 证书 的绝对路径
重启服务
3、客户端上访问 https页面:
(1)访问成功
报错是正常的,因为客户端还没有信任证书

(2)在客户端上信任证书:
haproxy服务器:
scp ~/demoCA/cacert.pem root@192.168.20.100:/root



(3)尝试再次访问
·不再警告,访问成功

四、【TLS/SSL(2)】前端https,后端https:
前端与客户端连接使用 https,后端与服务器连接也使用 https
1、先为后端服务器配置 https站点:
·将证书传给 后端Web服务器:
scp new* root@192.168.10.80:/etc/ssl
scp new* root@192.168.10.81:/etc/ssl
scp new* root@192.168.10.82:/etc/ssl
scp new* root@192.168.10.83:/etc/ssl(1)Nginx:
vim /etc/nginx/sites-enable/default
·在haproxy服务器上测试https是否正常:
apt install -y curl
curl -I 192.168.10.80
curl -I 192.168.10.82
(2)Apache2:
a2enmod ssl
vim /etc/apache2/sites-enable/000-default.conf
·在haproxy服务器上测试:
apt install -y curl
curl -I 192.168.10.81
curl -I 192.168.10.83
2、配置 haproxy:
vim /etc/haproxy/haproxy.cfg将端口改为443,在末尾添加ssl
‘verify none’表示不验证证书是否可信有效

2、在 客户端尝试访问:
·访问成功

五、配置 负载均衡权重:
权重默认为 1(也就是说请求会被平均分配给每一条后端服务器)
1、编辑 haproxy:
vim /etc/haproxy/haproxy.cfg
2、进行访问:



3、与 Nginx负载均衡一样,backup字段都是作为备份机器,当其它设备down掉时才会启用

此时,已经无法在访问到 Apache-04了,因为其它两台服务器还在正常运行
(1)关闭其它两台访问,查看是否生效:
Nginx-01:
systemctl stop nginx
Apache-02:
systemctl stop apache2(2)此时再在客户端上进行访问:
·访问成功
backup 能够设置多台,也能够定义权重

六、配置 http 跳转到 https:(haproxy端)
·使用 ‘redirect scheme’字段:
(1)作用:
将指定请求重定向到指定的协议
(2)语法:
redircet scheme [要重定向到的协议] if { [条件] }1、编辑 haproxy:
# 复制配置:
cd /usr/share/doc/haprox/example
grep 301 ./*
vim /usr/share/doc/haprox/example/basic-config-edge.cfg
vim /etc/haproxy/haproxy.cfg if !{ ssl_fc } //将 ‘非https’ 的请求重定向到 ‘https’

2、在 客户端上测试:
访问 http://www.baidu.com
·重定向跳转成功:

七、【使用ACL】配置 二级域名,及非定义的三级域名跳转到 自定义的三级域名‘www’:
参考资料:
·ACL语法如下:
acl <aclname> <criterion> [flags] [operator] [<value>] ...
acl 名称 条件 条件标记位 具体操作符 操作对象类型 (1)ACL名称:
可以使用大字母(A-Z),小写字母(a-z),冒号(":"),点("."),中横线("-")和下划线("_");并且严格区分大小写,比如"my_acl"和"My_acl"完全是两个不同的acl。(2)ACL derivatives
hdr([<name> [,<occ>]]): 完全匹配字符串
hdr_beg([<name> [,<occ>]]): 前缀匹配
hdr_dir([<name> [,<occ>]]): 路径匹配
hdr_dom([<name> [,<occ>]]): 域匹配
hdr_end([<name> [,<occ>]]): 后缀匹配
hdr_len([<name> [,<occ>]]): 长度匹配
hdr_reg([<name> [,<occ>]]): 正则表达式匹配
hdr_sub([<name> [,<occ>]]): 子串匹配·GPT:
在 Debian 中,`haproxy` 是一个常用的负载均衡和代理服务器软件。如果需要将二级域名、以及其他非定义的三级域名重定向到 `www` 域名下,可以使用 `http-request redirect` 和 `acl` 指令实现。
以下是一个简单的示例配置文件:
```
frontend http-in
bind *:80
# 将二级域名和其他非定义的三级域名重定向到 www 域名
acl is_subdomain hdr(host) -i www.mydomain.com
acl is_subdomain hdr(host) -i mydomain.com
acl is_subdomain hdr(host) -m reg -i ^[^.]+\.[^.]+$
http-request redirect code 301 location https://www.mydomain.com%[capture.req.uri] if !is_subdomain
```
上述配置中,通过 `acl` 指令定义了三个条件:
- `is_subdomain hdr(host) -i www.mydomain.com`:如果请求的主机头是 `www.mydomain.com`,则不进行重定向。
- `is_subdomain hdr(host) -i mydomain.com`:如果请求的主机头是 `mydomain.com`,则不进行重定向。
- `is_subdomain hdr(host) -m reg -i ^[^.]+\.[^.]+$`:如果请求的主机头不是以 `www.` 开头,且没有大于等于两个点号(即非定义的三级域名),则进行重定向。
最后,通过 `http-request redirect` 指令将不符合条件的请求重定向到 `https://www.mydomain.com`,其中 `%[capture.req.uri]` 表示重定向后继续保留原先请求的 URI。
需要注意的是,在使用 `http-request redirect` 指令时,应该选择合适的状态码(例如 301/302),并确保目标域名的 SSL/TLS 证书已经安装和配置正确。同时,也应该对重定向后的网站进行测试,以确保其正常访问和功能。1、编辑 haproxy:
vim /etc/haproxy/haproxy.cfg
·‘if !Redirect-01’ //当不匹配定义的acl后,便触发该重定向,将请求重定向到‘www.baidu.com’
· ‘%[capture.req.uri]’ //表示重定向后继续保留原先请求的 URI。
·-i //不区分大小写
2、在 客户端上访问:
无论是访问 abc.baidu.com、adsfas.baidu.com、baidu.com 只要能够解析到,只要不是‘www.baidu.com’,都会被重定向到 www.baidu.com

八、匹配自定义请求,将不同的请求发送给指定的后端服务器:
use_backend 字段不仅能匹配,还能够匹配后缀为 php 的请求,修改一下,就能够匹配更多其它自定义请求,可以通过它将不同的请求发送给指定的后端服务器
举个例子:
假如,我后端有两台web服务器,server1,server2,而 123.html 这个文件只在server1上有,请求丢到server2上就是‘not found’,那么使用这个方法,匹配123.html 就能够将请求发送给server1
·配置前尝试访问:
因为请求是轮询发送,有时能够访问到,有时不能访问


1、编辑 haproxy服务器:
vim /etc/haproxy/haproxy.cfg
2、客户端进行访问 123.html:
此时无论怎样刷新都不会在发送到其它服务器上提示 not found
