概述

最近一段时间bilibili上看了两个关于反向代理、负载均衡的视频,主要以nginx和haproxy为主。寻思自己动手搭建一下简单的反向代理和负载均衡的环境。

实现过程

两台虚拟机192.168.74.128,安装haproxy+两个http服务,http服务通过docker部署 192.168.74.129,作为客户端访问haproxy服务。 128上配置公网docker源
wget https://mirrors.163.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce
遇到报错,缺少依赖,这几个依赖包在centos-extra源内,通过配置extra源解决。
Error: Package: docker-ce-rootless-extras-20.10.6-3.el7.x86_64 (docker-ce-stable)
Requires: slirp4netns >= 0.4
Error: Package: 3:docker-ce-20.10.6-3.el7.x86_64 (docker-ce-stable)
Requires: container-selinux >= 2:2.74
Error: Package: docker-ce-rootless-extras-20.10.6-3.el7.x86_64 (docker-ce-stable)
Requires: fuse-overlayfs >= 0.7
Error: Package: containerd.io-1.4.4-3.1.el7.x86_64 (docker-ce-stable)
Requires: container-selinux >= 2:2.74

安装完毕,配置docker镜像加速器。通过阿里云获得加速器地址。配置完毕后docker info可以查看加速已生效。
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://mie7pdyw.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

Registry Mirrors:
https://mie7pdyw.mirror.aliyuncs.com/

[root@lblab yum.repos.d]# docker pull httpd
[root@lblab yum.repos.d]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest 45561c1ef88a 4 days ago 138MB

[root@lblab yum.repos.d]# docker run --name web1 -d httpd
[root@lblab yum.repos.d]# docker exec -it web1 /bin/bash
echo web1 >> index.html
修改index页面,以区分两个http服务
[root@lblab yum.repos.d]# docker inspect web1
查看container web1的地址
"IPAddress": "172.17.0.2",
[root@lblab yum.repos.d]# curl 172.17.0.2
<html><body><h1>It works!</h1></body></html>
web1
查看修改结果

同样方法启动第二个web服务
[root@lblab yum.repos.d]# docker run --name web2 -d httpd
[root@lblab yum.repos.d]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1f504cbda46 httpd "httpd-foreground" 3 seconds ago Up 2 seconds 80/tcp web2
13d3e8b58efd httpd "httpd-foreground" 5 minutes ago Up 5 minutes 80/tcp web1

[root@lblab yum.repos.d]# docker exec -it web2 /bin/bash
echo web2 >> index.html
[root@lblab yum.repos.d]# docker inspect web2
"IPAddress": "172.17.0.3",
[root@lblab yum.repos.d]# curl 172.17.0.3
<html><body><h1>It works!</h1></body></html>
web2

安装haproxy
yum install -y haproxy

配置文件路径/etc/haproxy/haproxy.cfg
frontend webbind *:80
default_backend websrvs
backend websrvs
server web1 172.17.0.2:80 check
server web2 172.17.0.3:80 check

[root@dns yum.repos.d]# while true; do curl 192.168.74.128;sleep 1s;done
<html><body><h1>It works!</h1></body></html>
web1
<html><body><h1>It works!</h1></body></html>
web2
<html><body><h1>It works!</h1></body></html>
web1
<html><body><h1>It works!</h1></body></html>
web2
<html><body><h1>It works!</h1></body></html>
web1
<html><body><h1>It works!</h1></body></html>
web2

完成round robin配置

haproxy存在心跳机制,用来检测后端服务端口监听是否正常,如果多次发现后端服务的端口监听异常, 它会将端口异常的服务从分发列表内移除。

haproxy对于后端的服务器就算请求没过来也有一直在健康检测,发现有故障的时候在请求没到来的时候会切掉,但如果在检测期间请求到达的话,会有异常。haproxy只会把请求转到后端的一台服务器。

nginx对于后端的服务器没有一直在健康检测,请求过来的时候,分发还是进行分发,只是请求不到数据的时候,会再向好的机器进行请求,直到请求正常为止。nginx请求转到后端一台不成功的话,还会转向另外一台服务器