1、基础环境

image.png

主机名 IP 服务
haproxy.stars.org 10.0.0.100 haproxy
web1.stars.org 10.0.0.101 nginx
web2.stars.org 10.0.0.102 nginx

2、Web服务配置

后端两个web服务器主机名分别设置为web1.stars.org和web2.stars.org,这里我就直接使用apt装了,这里我使用的系统的ubuntu的1804的版本的,用centos系统的话下载要使用yum方式安装,安装nginx的话也可以使用编译安装,编译安装可以参考我https://blog.51cto.com/u_15105742/5437984这篇文章,这里只是测试,页面也设置的简单点了。

root@web1:~# apt -y install nginx ;systemctl enable --now nginx;echo "Welcome to `hostname -I` page" > /var/www/html/index.nginx-debian.html

root@web2:~# apt -y install nginx ;systemctl enable --now nginx;echo "Welcome to `hostname -I` page" > /var/www/html/index.nginx-debian.html

#验证一下页面
root@haproxy:~# curl 10.0.0.101
Welcome to 10.0.0.101  page
root@haproxy:~# curl 10.0.0.102
Welcome to 10.0.0.102  page

image.png image.png

3、Haproxy服务配置

在这里我还是使用的上篇文章的环境编译安装Haproxy的来做,这里实现代理服务器可以使用frontend+backend的方式来实现或者使用listen的方式来实现都可以,不过在生产中推荐使用listen,因为可以简化配置。

3.1、frontend+backend的实现

root@haproxy:~# vim /etc/haproxy/haproxy.cfg
global
    maxconn 100000
    chroot /apps/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 0.0.0.0:9999
    stats enable
    log global
    stats uri   /haproxy-status
    stats auth  admin:wm521314

frontend zg_web_80
    bind 10.0.0.100:80	#如果你这里配置了高可用的话可以设置成你的VIP,后面就可以使用VIP来访问你的服务了,这也可以配置成你的域名,不过是要设置dns解析的,或者在需要访问的主机上修改hosts文件,从而使用域名也可以访问。
    mode http
    use_backend web_hosts

backend web_hosts
    mode http
    server web1 10.0.0.101:80 check inter 3000 fall 2 rise 5	#这里还可以添加weight可以设置权重
    server web2 10.0.0.102:80 check inter 3000 fall 2 rise 5

root@haproxy:~# systemctl restart haproxy.service
root@haproxy:~# curl 10.0.0.100
Welcome to 10.0.0.102  page
root@haproxy:~# curl 10.0.0.100
Welcome to 10.0.0.101  page
root@haproxy:~# curl 10.0.0.100
Welcome to 10.0.0.102  page
root@haproxy:~# curl 10.0.0.100
Welcome to 10.0.0.101  page

image.png image.png

3.2、listen实现

使用listen配置的话比frontend+backend的配置简洁多了。

root@haproxy:~# vim /etc/haproxy/haproxy.cfg
global
    maxconn 100000
    chroot /apps/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 0.0.0.0:9999
    stats enable
    log global
    stats uri   /haproxy-status
    stats auth  admin:wm521314

listen zg_web_80
    bind 10.0.0.100:80
    mode http
    server web1 10.0.0.101:80 check inter 3000 fall 2 rise 5
    server web2 10.0.0.102:80 check inter 3000 fall 2 rise 5
root@haproxy:~# systemctl restart haproxy.service

root@haproxy:~# curl 10.0.0.100
Welcome to 10.0.0.101  page
root@haproxy:~# curl 10.0.0.100
Welcome to 10.0.0.102  page
root@haproxy:~# curl 10.0.0.100
Welcome to 10.0.0.101  page
root@haproxy:~# curl 10.0.0.100
Welcome to 10.0.0.102  page

image.png image.png

3.3、使用子配置文件

3.3.1、创建子配置文件存放的目录

root@haproxy:~# mkdir /etc/haproxy/conf.d
root@haproxy:~# vim /etc/haproxy/conf.d/zg_web_80.cfg
listen zg_web_80
    bind 10.0.0.100:80
    mode http
    server web1 10.0.0.101:80 check inter 3000 fall 2 rise 5
    server web2 10.0.0.102:80 check inter 3000 fall 2 rise 5
#把前面的配置删了或者注释掉,我们这里把配置配到子配置文件上了,不删或者不注释掉的话还是使用的是/etc/haproxy/haproxy.cfg这个配置里的配置,相当于子配置文件没配置一样。
root@haproxy:~# cat /etc/haproxy/haproxy.cfg 
global
    maxconn 100000
    chroot /apps/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 0.0.0.0:9999
    stats enable
    log global
    stats uri   /haproxy-status
    stats auth  admin:wm521314

3.3.2、修改haproxy的service文件

这里和nginx的配置子配置文件不同,nginx的是创建了子配置文件后需要在主配置文件中引入一下子配置文件的路径,而haproxy的话是要修改service文件的,需要在service中指定一下子配置文件的路径并重启一下haproxy服务。

root@haproxy:~# vim /lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=network-online.target
Wants=network-online.target

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

[Install]
WantedBy=multi-user.target
root@haproxy:~# systemctl daemon-reload 
root@haproxy:~# systemctl restart haproxy.service

3.3.3、客户端验证访问

image.png image.png