haproxy 订阅
HAProxy是一个使用C语言编写的自由及开放源代码软件[1],其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。包括 GitHub、Bitbucket[3]、Stack Overflow[4]、Reddit、Tumblr、Twitter[5][6]和 Tuenti[7]在内的知名网站,及亚马逊网络服务系统都使用了HAProxy。 [1] 展开全文
HAProxy是一个使用C语言编写的自由及开放源代码软件[1],其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。包括 GitHub、Bitbucket[3]、Stack Overflow[4]、Reddit、Tumblr、Twitter[5][6]和 Tuenti[7]在内的知名网站,及亚马逊网络服务系统都使用了HAProxy。 [1]
信息
外文名
HAProxy
特    点
免费、快速并且可靠
类    型
代理
模    型
单一进程
支    持
虚拟主机
haproxy安装
tar zxvf haproxy-1.4.8.tar.gzcd haproxy-1.4.8uname -a //查看linux内核版本make TARGET=linux26 PREFIX=/usr/local/haproxymake install PREFIX=/usr/local/haproxy
收起全文
精华内容
下载资源
问答
  • 2021-06-15 18:26:09

    haproxy
    haproxy简介
    HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。根据官方数据,其最高极限支持10G的并发。
      HAProxy特别适用于那些负载特大的web站点, 这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
    其支持从4层至7层的网络交换,即覆盖所有的TCP协议。就是说,Haproxy 甚至还支持 Mysql的均衡负载。
    负载均衡
     HAProxy主要为基于 HTTP和 TCP访问的应用服务提供负载均衡,如基于 Internet的连接服务和基于 web的应用服务。通过负载均衡算法, HAproxy能够接受数以万计的访问请求并将其转发到后端服务器池中进行处理,而后端服务器池就如一个强大的虚拟服务器接受 HAProxy转发的请求并进行处理。 HAproxy的请求调度器(Scheduler)决定了后端服务器中每个服务器接受和处理的请求量,在没有权重的调度算法下,调度器为每台服务器分配相同数量的请求,而在加权调度算法下,调度器根据每台服务器的权重为每个后端服务器分配不同数量的请求。 HAProxy允许用户自定义多个代理,并为每个代理提供负载均衡服务,代理由一个前端和一个或多个后端构成,前端定义了代理监听的IP地址(Virtual IP )和端口,同时还需在前端定义中关联与其相关的后端,而在HAProxy中,后端主要用于定义服务器池和负载均衡算法。HAProxy的负载均衡服务在7层,即应用层,在很多情况下,由于商业应用连续性的要求,管理员通常需要部署HAProxy,从而为基于HTTP的应用提供负载均衡和高可用性。

    haproxy的特点 支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机;
    能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作 支持url检测后端的服务器出问题的检测会有很好的帮助。
    更多的负载均衡策略比如:动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source
    Hash),加权URL哈希和加权参数哈希(Weighted Parameter Hash)已经实现
    单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度。
    HAProxy可以对Mysql进行负载均衡,对后端的DB节点进行检测和负载均衡。
    支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)
    不能做Web服务器即Cache。

    haproxy支持5种连接模式: keep
    alive:分析并处理所有的request和response(默认),后端为静态或缓存服务器建议使用此模式。
    tunnel:仅分析处理第一个request和response,剩余所有内容不进行任何分析直接转发。1.5版本之前此为默认,现在不建议设置为此模式。
    passive
    close:在请求和响应首部加上"connection:close"标记的tunnel,在处理完第一个request和response后尝试关闭两端连接。
    server
    close:处理完第一个response后关闭和server端的连接,但和客户端的连接仍然保持,后端为动态应用程序服务器组建议使用此模式。
    forced close:传输完一个response后客户端和服务端都关闭连接

    HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,
    同时可以保护你的web服务器不被暴露到网络上。 HAProxy实现了一种事件驱动,
    单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制
    、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space)
    实现所有这

    负载均衡类型 四层负载均衡
    将网络流量负载均衡到多个服务器的最简单方法是使用第4层(传输层)负载均衡。以这种方式进行负载均衡将根据IP范围和端口转发用户流量。
    用户访问负载均衡器,调度器将用户的请求转发给后端服务器的Web后端组。无论选择哪个后端服务器,都将直接响应用户的请求。通常,Web后端中的所有服务器应该提供相同的内容

    • 否则用户可能会收到不一致的内容。

    七层负载均衡
    7层负载均衡是更复杂的负载均衡网络流量的方法是使用第7层(应用层)负载均衡。使用第7层允许调度器根据用户请求的内容将请求转发到不同的后端服务器。这种负载平衡模式允许您在同一域和端口下运行多个Web应用程序服务器。

    haproxy的特点 支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机;
    能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作 支持url检测后端的服务器出问题的检测会有很好的帮助。
    更多的负载均衡策略比如:动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source
    Hash),加权URL哈希和加权参数哈希(Weighted Parameter Hash)已经实现
    单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度。
    HAProxy可以对Mysql进行负载均衡,对后端的DB节点进行检测和负载均衡。
    支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)
    不能做Web服务器即Cache。 haproxy配置文件 HAProxy 配置文件根据功能和用途,主要有 5
    个部分组成,但有些部分并不是必须的, 可以根据需要选择相应的部分进行配置。

    global 部分 用来设定全局配置参数,属于进程级的配置,通常和操作系统配置有关。

    defaults 部分 默认参数的配置部分。在此部分设置的参数值,默认会自动被引用到下面的 frontend、 backend 和
    listen 部分中,因此,如果某些参数属于公用的配置,只需在 defaults 部分添加一次即可。而如果在
    frontend、backend 和 listen 部分中也配置了与 defaults 部分一样的参数,那么defaults
    部分参数对应的值自动被覆盖。

    frontend 部分 此部分用于设置接收用户请求的前端虚拟节点。frontend 是在 HAProxy1.3
    版本之后才引入的一个组件,同时引入的还有 backend 组件。通过引入这些组件,在很大程度上简化了 HAProxy
    配置文件的复杂性。frontend 可以根据 ACL 规则直接指定要使用的后端

    backend 部分 此部分用于设置集群后端服务集群的配置,也就是用来添加一组真实服务器,以处理前端用户的请求。添加的真实服务器类似于
    LVS 中的real server 节点。

    listen 部分 此部分是 frontend 部分和 backend 部分的结合体。在 HAProxy1.3 版本之前, HAProxy
    的所有配置选项都在这个部分中设置。为了保持兼容性,HAProxy 新的版本仍然保留了 listen 组件的配置方式。目前在 HAProxy
    中,两种配置方式任选其一即可。

    配置实例
    安装haproxy

    [root@lb ~]# yum -y install make gcc pcre-devel bzip2-devel openssl-devel systemd-devel
    [root@lb ~]# useradd -r -M -s /sbin/nologin haproxy
    [root@lb ~]# tar xf haproxy-2.4.0.tar.gz 
    [root@lb ~]# cd haproxy-2.4.0
    [root@lb haproxy-2.4.0]# make clean
    [root@lb haproxy-2.4.0]# make -j $(grep 'processor' /proc/cpuinfo |wc -l)  \
    > TARGET=linux-glibc  \
    > USE_OPENSSL=1  \
    > USE_ZLIB=1  \
    > USE_PCRE=1  \
    > USE_SYSTEMD=1
    make install PREFIX=/usr/local/haproxy
    [root@lb haproxy-2.4.0]# echo "export PATH=/usr/local/haproxy/sbin:$PATH">/etc/profile.d/haproxy.sh
    [root@lb haproxy-2.4.0]# . /etc/profile.d/haproxy.sh
    [root@lb haproxy-2.4.0]# which haproxy 
    /usr/local/haproxy/sbin/haproxy
    

    配置各个负载的内核参数

    [root@lb haproxy-2.4.0]# echo 'net.ipv4.ip_nonlocal_bind = 1' >>  /etc/sysctl.conf
    [root@lb haproxy-2.4.0]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf[root@lb haproxy-2.4.0]# sysctl  -p 
    net.ipv4.ip_nonlocal_bind = 1
    net.ipv4.ip_forward = 1
    

    编写配置文件

    [root@lb haproxy-2.4.0]# cat > /etc/haproxy/haproxy.cfg <<EOF
    > #--------------全局配置----------------
    > global
    >     log 127.0.0.1 local0  info
    >     #log loghost local0 info
    >     maxconn 20480
    > #chroot /usr/local/haproxy
    >     pidfile /var/run/haproxy.pid
    >     #maxconn 4000
    >     user haproxy
    >     group haproxy
    >     daemon
    > #---------------------------------------------------------------------
    > #common defaults that all the 'listen' and 'backend' sections will
    > #use if not designated in their block
    > #---------------------------------------------------------------------
    > defaults
    >     mode http
    >     log global
    >     option dontlognull
    >     option httpclose
    >     option httplog
    >     #option forwardfor
    >     option redispatch
    >     balance roundrobin
    >     timeout connect 10s
    >     timeout client 10s
    >     timeout server 10s
    >     timeout check 10s
    >     maxconn 60000
    >     retries 3
    > #--------------统计页面配置------------------
    > listen admin_stats
    >     bind 0.0.0.0:8189
    >     stats enable
    >     mode http
    >     log global
    >     stats uri /haproxy_stats
    >     stats realm Haproxy\ Statistics
    >     stats auth admin:admin
    >     #stats hide-version
    >     stats admin if TRUE
    >     stats refresh 30s
    > #---------------web设置-----------------------
    > listen webcluster
    >     bind 0.0.0.0:80
    >     mode http
    >     #option httpchk GET /index.html
    >     log global
    >     maxconn 3000
    >     balance roundrobin
    >     cookie SESSION_COOKIE insert indirect nocache
    >     server web01 192.168.136.133:80 check inter 2000 fall 5
    >     server web02 192.168.136.134:80 check inter 2000 fall 5
    > EOF
    

    启用日志

    
    [root@lb haproxy-2.4.0]# vim /etc/rsyslog.conf 
    local0.*                        /tmp/haproxy.log
    [root@lb haproxy-2.4.0]# systemctl restart rsyslog
    1
    2
    3
    编写.service文件
    
    [root@lb haproxy-2.4.0]# cat > /usr/lib/systemd/system/haproxy.service <<EOF
    > [Unit]
    > Description=HAProxy Load Balancer
    > After=syslog.target network.target
    > 
    > [Service]
    > ExecStartPre=/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg   -c -q
    > ExecStart=/usr/local/haproxy/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg  -p /var/run/haproxy.pid
    > ExecReload=/bin/kill -USR2 $MAINPID
    > 
    > [Install]
    > WantedBy=multi-user.target
    > EOF
    [root@lb haproxy-2.4.0]# systemctl daemon-reload
    

    重启服务

    [root@lb haproxy-2.4.0]# systemctl enable --now haproxy 
    [root@lb haproxy-2.4.0]# ss -anlt
    State   Recv-Q  Send-Q   Local Address:Port    Peer Address:Port  Process  
    LISTEN  0       128            0.0.0.0:80           0.0.0.0:*              
    LISTEN  0       128            0.0.0.0:22           0.0.0.0:*              
    LISTEN  0       128            0.0.0.0:8189         0.0.0.0:*              
    LISTEN  0       128               [::]:22              [::]:*              
    LISTEN  0       80                   *:3306               *:*         
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    更多相关内容
  • 这是的的 Git (不要与haproxy上游提供的任何官方haproxy镜像混淆)。 有关如何使用此 Docker 映像的完整自述文件以及有关贡献和问题的信息,请参阅。 的 生成/维护,特别是。 看到此处合并的更改尚未显示在 Docker...
  • HAProxy CORS Lua库 Lua库,用于在HAProxy中启用CORS。 背景 跨域请求共享使您可以允许在不同域中运行的客户端代码调用服务。 该模块扩展了HAProxy,以便: 设置一个Access-Control-Allow-Methods标头以响应预检...
  • zabbix_haproxy 用于监控 haproxy 的 Zabbix 脚本 用法: zhaproxy.py -d :发现前端/后端配置 zhaproxy.py -c : 检查所有前端/后端配置 zhaproxy.py -p <proxy> -s <server> -v <attribute> : 获取指定值 用户...
  • kube2haproxy kube2haproxy是一个守护进程,可为Kubernetes上部署的服务自动配置Keepalived&HAProxy。 它具有以下特点: 高可用性HAProxy,支持ip故障转移。 根据您的模板自动配置Keepalived&HAProxy配置文件...
  • Kubernetes入口控制器-HAProxy 维护者:尼克·舒赫 用于HAPRoxy的Kubernetes入口控制器。 发展 入门 要进行此项目,您首先需要在计算机上安装Go。 手动设定 首先,请确保正确安装Go,并且已设置GOPATH。 您还需要将...
  • haproxy-1.8.23 RPM包 for Centos7 rpm -ivh 安装即可,软件目录:/usr/local/haproxy-1.8.23 配置文件: /etc/haproxy/haproxy.cfg 可通过 systemctl 来进行 start 、stop 、restart 可通过 systemctl enable...
  • 一个典型的Haproxy_exporter的监控metric例子 包含指标 haproxy_backend_bytes_in_total haproxy_backend_bytes_out_total haproxy_backend_client_aborts_total haproxy_backend_compressor_bytes_bypassed_total ...
  • HAProxy

    2022-01-01 14:25:12
    编译安装haproxyhaproxy的调度算法,haproxy的搭建监控页面,基于haproxy,实现网页动静分离以及实现https。

    一、编译安装haproxy

    解决lua环境(Centos7)

    由于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

    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
    

    global:全局配置段参数详解

    官方文档: 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作为代理服务器,将web服务代理至后端两台nginx

    haproxy代理服务器:172.20.21.131

    nginx后端服务器1: 172.20.21.70

    nginx后端服务器2: 172.20.21.70

    配置后端nginx服务器

    ##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

    修改haproxy服务器配置文件对应的后端服务器

    [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调度算法

    HAProxy通过固定参数balance指明对后端服务器的调度算法,该参数可以配置在listen或backend选项中。

    HAProxy的调度算法分为静态和动态调度算法,但是有些算法可以根据参数在静态和动态算法中相互转换。

    官方文档:http://cbonte.github.io/haproxy-dconv/2.1/configuration.html#4-balance

    静态算法

    静态算法:按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、链接数和响应速度等,且无法实时修改权重,只能靠重启HAProxy生效。静态算法有两种:static-rr和first

    注:静态算法无法利用工具socat对服务器动态权重调整

    static-rr

    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%'.

    first

    [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

    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

    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

    其他算法

    其它算法即可作为静态算法,又可以通过选项成为动态算法

    source

    源地址hash,基于用户源地址hash并将请求转发到后端服务器,默认为静态即取模方式,但是可以通过hash-type支持的选项更改,后续同一个源地址请求将被转发至同一个后端web服务器,比较适用于session会话保持但不支持cookie和缓存的场景。此方式当后端服务器数据量发生变化时,会导致很多用户的请求转发至新的后端服务器,这个算法一般是在不插入Cookie的TCP模式下使用,也可给拒绝会话cookie的客户提供最好的会话粘性,适用于session会话保持但不支持cookie和缓存的场景。

    源地址有两种转发客户端请求到后端服务器的服务器选取计算方式,分别是取模法和一致性hash

    hash-type:哈希算法

      map-based:除权取余法,哈希数据结构是静态的数组;静态;

      consistent:一致性哈希,哈希数据结构是一个树;动态;

    map-based取模法

    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示意图:后端服务器在线与离线的调度方式

    一致性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的左半部分或整个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_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

    hdr

    针对用户每个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

    rdb-cookie

    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

    random

    在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  #很少使用

    haproxy监控界面

    通过web界面,显示当前HAProxy的运行状态

    官方文档HAProxy version 2.1.12 - Configuration Manual

    状态页配置项

    stats enable         #基于默认的参数启用stats page
    stats hide-version   #将状态页中haproxy版本隐藏
    stats refresh <delay> #设定自动刷新时间间隔,默认不自动刷新
    stats uri <prefix>   #自定义stats page uri,默认值:/haproxy?stats
    stats realm <realm>  #账户认证时的提示信息,示例:stats realm HAProxy\ Statistics
    stats auth <user>:<passwd> #认证时的账号和密码,可使用多次,默认:no authentication,可有多行用户
    stats admin { if | unless } <cond> #启用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

    四 基于haproxy,实现网页动静分离

    访问控制列表(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

    ACL示例-基于文件后缀名实现动静分离

    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
    <?php
      phpinfo();
    ?>
    
    [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

    相关配置

    #配置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 }

    https配置示例

    ##证书制作
    [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

    展开全文
  • HAProxy入口控制器 负载控制器实现。 HAProxy Ingress是Kubernetes入口控制器:它配置HAProxy实例,以将传入请求从外部网络路由到集群内应用程序。 路由配置是从Kubernetes集群读取规范而构建的。 对群集所做的更新...
  • Windows Haproxy-2.0.2.zip

    2020-05-15 16:17:18
    HAProxy特别适用于那些负载特大的web站点, 这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, ...
  • 1.Haproxy与Keepalived VRRP 介绍 软件:haproxy---主要是做负载均衡的7层,也可以做4层负载均衡 apache也可以做7层负载均衡,但是很麻烦。实际工作中没有人用。 负载均衡是通过OSI协议对应的 7层负载均衡:用的7层...
  • windows版本已编译Haproxy-2.3.5稳定版
  • Haproxy

    2021-10-17 14:29:55
    一、haproxy概述 haproxy是一款高性能的负载均衡软件。因为其专注于负载均衡这一些事情,因此与nginx比起来在负载均衡这件事情上做更好,更专业。 haproxy的特点 支持tcp / http 两种协议层的负载均衡,使得其负载...

    一、Haproxy概述

    haproxy是一款高性能的负载均衡软件。因为其专注于负载均衡这一些事情,因此与nginx比起来在负载均衡这件事情上做更好,更专业。

    haproxy的特点

    • 支持tcp / http 两种协议层的负载均衡,使得其负载均衡功能非常丰富。
    • 支持8种左右的负载均衡算法,尤其是在http模式时,有许多非常实在的负载均衡算法,适用各种需求。
    • 性能非常优秀,基于单进程处理模式(和Nginx类似)让其性能卓越。
    • 拥有一个功能出色的监控页面,实时了解系统的当前状况。
    • 功能强大的ACL支持,给用户极大的方便。

    haproxy算法:

    • 1.roundrobin
      基于权重进行轮询,在服务器的处理时间保持均匀分布时,这是最平衡,最公平的算法.此算法是动态的,这表示其权重可以在运行时进行调整.

    • 2.static-rr
      基于权重进行轮询,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效.不过,其在后端服务器连接数上没有限制

    • 3.leastconn
      新的连接请求被派发至具有最少连接数目的后端服务器.

    haproxy官网

    二、Haproxy负载均衡http

    环境说明:

    主机名ip职责
    item192.168.91.134Haprosy
    task1192.168.91.135web界面
    task2192.168.91.137web界面
    item 准备工作
    // 关闭防火墙和selinux
    [root@item ~]# systemctl disable --now firewalld
    Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
    Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
    [root@item ~]# setenforce 0
    
    task1 准备工作
    // 关闭防火墙和selinux
    [root@task1 ~]# systemctl disable --now firewalld
    Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
    Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
    [root@task1 ~]# setenforce 0
    
    // 启动httpd,添加web内容
    [root@task1 ~]# yum -y install httpd
    [root@task1 ~]# systemctl enable --now httpd
    Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
    [root@task1 ~]# echo "amu" > /var/www/html/index.html
    [root@task1 ~]# curl 127.0.0.1
    amu
    
    task2准备工作
    // 关闭防火墙和selinux
    [root@task2 ~]# systemctl disable --now firewalld
    Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
    Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
    [root@task2 ~]# setenforce 0
    
    // 启动httpd,添加web内容
    [root@task2 ~]# yum -y install httpd
    [root@task2 ~]# systemctl enable --now httpd
    Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
    [root@task2 ~]# echo "gf" > /var/www/html/index.html
    [root@task2 ~]# curl 127.0.0.1
    gf
    
    安装haproxy
    // 安装编译工具以及依赖包
    [root@item ~]# yum -y install make gcc pcre-devel bzip2-devel openssl-devel systemd-devel vim
    
    // 创建一个服务用户
    [root@item ~]# useradd -r -M -s /sbin/nologin haproxy
    [root@item ~]# id haproxy
    uid=994(haproxy) gid=991(haproxy) groups=991(haproxy)
    
    // 把之前下好的haproxy包传上去
    [root@item ~]# ls
    anaconda-ks.cfg  haproxy-2.4.0.tar.gz
    // 解压编译
    [root@item ~]# tar xf haproxy-2.4.0.tar.gz 
    [root@item ~]# ls
    anaconda-ks.cfg  haproxy-2.4.0  haproxy-2.4.0.tar.gz
    [root@item ~]# cd haproxy-2.4.0
    [root@item haproxy-2.4.0]# make clean
    [root@item haproxy-2.4.0]# make -j $(grep 'processor' /proc/cpuinfo |wc -l)  \
    TARGET=linux-glibc  \
    USE_OPENSSL=1  \
    USE_ZLIB=1  \
    USE_PCRE=1  \
    USE_SYSTEMD=1
    [root@item haproxy-2.4.0]# make install PREFIX=/usr/local/haproxy
    
    // copy启动文件
    [root@item haproxy-2.4.0]# cd /usr/local/haproxy/sbin/
    [root@item sbin]# ls
    haproxy
    [root@item sbin]# cp haproxy /usr/sbin/
    [root@item sbin]# which haproxy
    /usr/sbin/haproxy
    
    配置各个内核的负载参数
    [root@item sbin]# cd
    [root@item ~]# echo 'net.ipv4.ip_nonlocal_bind = 1' >>  /etc/sysctl.conf
    [root@item ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
    [root@item ~]# sysctl  -p
    net.ipv4.ip_nonlocal_bind = 1
    net.ipv4.ip_forward = 1
    
    提供配置文件
    [root@item ~]# mkdir /etc/haproxy
    [root@item ~]# vim /etc/haproxy/haproxy.cfg
    [root@item ~]# cat /etc/haproxy/haproxy.cfg 
    #--------------全局配置----------------
    global
        log 127.0.0.1 local0  info
        #log loghost local0 info
        maxconn 20480
    #chroot /usr/local/haproxy
        pidfile /var/run/haproxy.pid
        #maxconn 4000
        user haproxy
        group haproxy
        daemon
    #---------------------------------------------------------------------
    #common defaults that all the 'listen' and 'backend' sections will
    #use if not designated in their block
    #---------------------------------------------------------------------
    defaults
        mode http
        log global
        option dontlognull
        option httpclose
        option httplogZZZZ
        #option forwardfor
        option redispatch
        balance roundrobin
        timeout connect 10s
        timeout client 10s
        timeout server 10s
        timeout check 10s
        maxconn 60000
        retries 3
    #--------------统计页面配置------------------
    listen admin_stats
        bind 0.0.0.0:8189
        stats enable
        mode http
        log global
        stats uri /haproxy_stats
        stats realm Haproxy\ Statistics
        stats auth admin:admin
        #stats hide-version
        stats admin if TRUE
        stats refresh 30s
    #---------------web设置-----------------------
    listen webcluster
        bind 0.0.0.0:80
        mode http
        #option httpchk GET /index.html
        log global
        maxconn 3000
        balance roundrobin
        cookie SESSION_COOKIE insert indirect nocache
        server task1 192.168.91.135:80 check inter 2000 fall 5  //task1 服务器ip
        server task2 192.168.91.137:80 check inter 2000 fall 5  //task2 服务器ip
    
    haproxy.service文件编写
    [root@item ~]# vim /usr/lib/systemd/system/haproxy.service
    [root@item ~]# cat /usr/lib/systemd/system/haproxy.service
    [Unit]
    Description=HAProxy Load Balancer
    After=syslog.target network.target
    
    [Service]
    ExecStartPre=/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg   -c -q
    ExecStart=/usr/local/haproxy/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg  -p /var/run/haproxy.pid
    ExecReload=/bin/kill -USR2 $MAINPID
    
    [Install]
    WantedBy=multi-user.target
    
    // 重新加载进程
    [root@item  ~]# systemctl daemon-reload
    
    x 启动日志// 修改日志文件[root@item ~]# vim /etc/rsyslog.conf # Save boot messages also to boot.loglocal0.*                                                /var/log/boot.log​// 重启日志[root@item ~]# systemctl restart rsyslog
    
    启动haproxy服务
    [root@item ~]# ss -antl
    State  Recv-Q Send-Q Local Address:Port   Peer Address:Port Process                                                     
    LISTEN 0      128          0.0.0.0:80          0.0.0.0:*                                                                
    LISTEN 0      128          0.0.0.0:22          0.0.0.0:*                                                                
    LISTEN 0      128          0.0.0.0:8189        0.0.0.0:*                                                                
    LISTEN 0      128             [::]:22             [::]:*   
    

    web 页面访问
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    三、Haproxy配置负载均衡(https)

    还是以上面这些主机为例

    task1上安装mod_ssl
    [root@task1 ~]# yum -y install mod_ssl
    // 这里就不做证书,使用默认的证书,重启服务查看443是否启动
    [root@task1 ~]# systemctl restart httpd
    [root@task1 ~]# ss -antl
    State  Recv-Q Send-Q Local Address:Port   Peer Address:Port Process                                                     
    LISTEN 0      128          0.0.0.0:22          0.0.0.0:*                                                                
    LISTEN 0      128                *:80                *:*                                                                
    LISTEN 0      128             [::]:22             [::]:*                                                                
    LISTEN 0      128                *:443               *:*   
    
    task2上安装mod_ssl
    [root@task2 ~]# yum -y install mod_ssl
    // 这里就不做证书,使用默认的证书,重启服务查看443是否启动
    [root@task2 ~]# systemctl restart httpd
    [root@task2 ~]# ss -atnl
    State  Recv-Q Send-Q Local Address:Port   Peer Address:Port Process                                                     
    LISTEN 0      128          0.0.0.0:22          0.0.0.0:*                                                                
    LISTEN 0      128                *:80                *:*                                                                
    LISTEN 0      128             [::]:22             [::]:*                                                                
    LISTEN 0      128                *:443               *:*   
    
    修改配置文件
    [root@item ~]# vim /etc/haproxy/haproxy.cfg 
    [root@item ~]# cat /etc/haproxy/haproxy.cfg 
    global
        log 127.0.0.1 local2  info
        maxconn 20480
        chroot /usr/local/haproxy
        pidfile /var/run/haproxy.pid
        stats socket  /var/lib/haproxy/haproxy.sock mode 600 level admin
        user haproxy
        group haproxy
        daemon
        nbproc 1
        nbthread 4
        spread-checks 5
    
    defaults
        mode http
        log global
        option dontlognull
        option httpclose
        option  http-keep-alive
        option redispatch
        balance roundrobin
        timeout connect 60s
        timeout client 30s
        timeout server 30s
        timeout check 10s
        maxconn 60000
        retries 3
    
    listen https
        bind 0.0.0.0:443
        log global
        mode tcp
        balance  roundrobin 
        server task1 192.168.91.135:443 check inter 2s fall 3 rise 5  // 修改端口为443
        server task2 192.168.91.137:443 check inter 2s fall 3 rise 5  // 修改端口为443
        
    [root@item ~]# mkdir /var/lib/haproxy
    [root@item ~]# systemctl restart haproxy
    
    [root@localhost ~]# ss -ant
    State      Recv-Q Send-Q         Local Address:Port                        Peer Address:Port                
    LISTEN     0      128                        *:80                                     *:*                  
    LISTEN     0      128                        *:22                                     *:*                  
    LISTEN     0      100                127.0.0.1:25                                     *:*                  
    LISTEN     0      128                        *:443                                    *:*              
    LISTEN     0      128                       :::22                                    :::*                  
    LISTEN     0      100                      ::1:25                                    :::*                  
    

    请添加图片描述
    请添加图片描述

    展开全文
  • HAProxy介绍   HAProxy是高性能TCP(第四层)/HTTP(第七层)反向代理负载均衡服务器。(The Reliable, High Performance TCP/HTTP Load Balancer) HAProxy安装部署 查看列表 $ yum list | grep haproxy yum安装...
  • haproxy-2.1.3 for windows

    2020-02-25 09:34:21
    haproxy-2.1.3 提供 高可用性 、负载均衡 以及基于TCP和HTTP应用的代理,它是免费、快速 并且可靠的一种解决方案
  • haproxy-2.3.2-win64

    2021-01-03 15:27:28
    Cygwin64编译的
  • 主要介绍了CentOS7—HAProxy安装与配置详解,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
  • haproxy镜像

    2018-11-25 09:24:18
    haproxy镜像
  • Web界面(用户友好的Web GUI,警报,监视和安全),用于管理HAProxy,Nginx和Keepalived服务器。 留下您的 参与其中 ,订阅! 关于HAProxy-WI的,欢迎进行讨论和提问 示范现场 登录名/密码:admin / admin。 ...
  • haproxy-sdk haproxy-sdk为 HAProxy 的“stats”套接字提供了一个 Javascript 原生的、基于 Promise 的开发库。 从这个库中,用户可以启用/禁用服务器和前端、管理后端、查询统计信息等等。 HAProxy 是一个多进程...
  • HAProxy文档转换器 在当前状态下,HAProxy正在将HAProxy文档.txt文件转换为HTML。 该项目的目的是最终将HAProxy文档转换为更通用的格式(例如:ReStructuredText),从而可以更轻松地传播各种输出文件(.pdf,.html...
  • 根据百度的上文档将目前最新版的Haproxy2.0.2打包成Windows下可执行的Haproxy.exe 最新版支持动态的ssl证书,经过测试以该Windows 下的版本已经可以支持。如果你觉得好用,劳烦给个好评。谢谢
  • 由于在生产环境使用了mysqlcluster,需要实现高可用负载均衡,这里提供了keepalived+haproxy来实现.  keepalived主要功能是实现真实机器的故障隔离及负载均衡器间的失败切换.可在第3,4,5层交换.它通过VRRPv2(Virtual ...
  • 官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
  • Ansible 模块 HAProxy 一个 Ansible 模块,用于使用套接字处理来自 haproxy 的状态启用/禁用服务器。 显示后端服务器的当前和当前权重是两种状态的默认值,如果在启用后端服务器时提供,它也会为服务器设置权重。 ...
  • prometheus监控HAProxy

    2021-01-07 19:12:40
    从Prometheus官方网站可以看到,官方网站已经有支持对HAProxy软件的exporter,我们从官方网站下载下来进行使用,也可以通过下载HAProxy的项目地址,通过编译进行部署。 github项目地址 ...
  • node-haproxy --ipc )并使用ipc var ipcClient = require ('node-haproxy/src/ipc-client'通信( var ipcClient = require ('node-haproxy/src/ipc-client' )或使用api直接( var haproxy = require('node-...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 54,027
精华内容 21,610
关键字:

haproxy

友情链接: DSPcode.zip