HAProxy - 基础配置.note

noteId: C0EC37329EFC49EFB31296F316BEF589 · 原始路径:/ALL/Linux - A模块/服务配置/haproxy 代理(高可用负载均衡)-LB集群/HAProxy - 基础配置.note · 图片:44 · 附件待处理:0

 
·报错:
这条命令是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 -sign
 
 
2、配置 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
当 URL 请求不是 www.baidu.com 时,就将请求重定向到 https://www.baidu.com
·‘acl Redirect-01 hdr(host) -i www.baidu.com’ //定义名为‘Redirect-01’的acl,匹配 www.baidu.com
·‘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