linux运维进阶-基于HAproxy实现负载均衡

本文详细介绍了HAProxy的安装方法及配置步骤,包括通过YUM安装、源码编译安装和RPM包安装三种方式,并讲解了如何配置HAProxy进行负载均衡、日志记录、访问控制等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下操作基于rhel6.5

.HAproxy 详细介绍


HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点, 这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

下图是HAProxy的架构:

下图是HAProxy的监控页面截图:

HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。

一.安装

下面介绍三种方式安装haproxy: 


方式一:yum install -y haproxy.x86_64

方式二:


下载压缩包haproxy-1.6.11.tar.gz 
tar zxf haproxy-1.6.11.tar.gz
进入解压目录
less README     #查看文档来安装
make TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 PREFIX=/usr/local/haproxy  #编译
make TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 PREFIX=/usr/local/haproxy install  #安装
#找到配置文件模板
cp /root/haproxy-1.6.11/examples/content-sw-sample.cfg /etc/haproxy/
cd /etc/haproxy
mv content-sw-sample.cfg haproxy.cfg

方式三:


cp /root/haproxy-1.6.11.tar.gz /root/rpmbuild/SOURCES
cd /root/haproxy-1.6.11/examples/
rpmbuild -bb haproxy.spec
cd rpmbuild/RPMS/x86_64/
[root@server1 x86_64]# ls
haproxy-1.6.11-1.x86_64.rpm
rpm -ivh haproxy-1.6.11-1.x86_64.rpm
#和上面一样获取配置文件

cat /etc/sysconfig/network #查看network是否为yes
修改配置文件如下:

global       #全参数的设置
        maxconn         65535    #设置最大连接数 
        stats socket    /var/run/haproxy.stat mode 600 level admin
        log             127.0.0.1 local0  #全局的日志配置
        uid             200  
        gid             200
        chroot          /var/empty           #改变当前的工作目录
        daemon                            #以守护进程的方式运行haproxy

defaults
        mode         http  #默认的模式(tcp/http/health),tcp是四层,http是7层,health只会返回ok
        log             global   #应用全局的日志配置
        option          httplog   #应用日志记录http请求,默认haproxy不会记录http请求日志
        option          dontlognull#启用该项,日志将不会记录空连接
        monitor-uri     /monitoruri
        maxconn         8000
        timeout client  30s  
        #bind            192.168.1.10:443 ssl crt /etc/haproxy/haproxy.pem 
         bind            172.25.50.100:80 name clear   #监听主机和端口
        acl bad src 172.25.50.250
        acl read method GET
        acl read method HEAD
        acl write method PUT
        acl write method POST
        #http-request deny if bad
        #errorloc 403 http://172.25.50.4:80     
        #redirect location http://172.25.50.4:80

        #use_backend     static if { hdr_beg(host) -i img }
        #use_backend     static if { path_beg /img /css   }
        #use_backend dynamic if { path_end .php }       
        #use_backend dynamic if { path_beg /images }
        use_backend static if write
        default_backend dynamic

# The static backend backend for 'Host: img', /img and /css.
backend dynamic
        balance         roundrobin
        server          web1 172.25.50.2:80 check inter 1000
        server          web2 172.25.50.3:80 check inter 1000

根据配置文件需要设置haproxy的最大并发链接数:


和nginx相同,从三个层面设置:
内核层面:
[root@server1 haproxy]# sysctl -a | grep file
fs.file-nr = 544    0   188465
fs.file-max = 188465                      #此处内核所支持的最大连接数已满足
如果不满足需要修改配置文件:
vim /etc/sysctl.conf  
  7 net.ipv4.ip_forward = 1             #开启内核路由功能
系统层面:
vim /etc/security/limits.conf        #最后一行添加
    haproxy          -      nofile          65535
应用层面:
vim /etc/haproxy/haproxy.cfg 
     最大连接设置为65535

三.配置负载均衡

 在配置文件中:

 

default_backend dynamic

# The static backend backend for 'Host: img', /img and /css.
backend dynamic
        balance         roundrobin
        server          web1 172.25.50.2:80 check inter 1000
        server          web2 172.25.50.3:80 check inter 1000

测试:
server2和server3上均开启apache服务:浏览器访问ip即可看到默认发布目录下的页面内容且以轮询的方式访问server2和server3!

在浏览器查看后端主机的情况并添加访问控制:


vim /etc/haproxy/haproxy.cfg


添加内容如下:



/etc/init.d/haproxy restart 


在浏览器访问 172.25.50.1/admin/stats 可以看到需要用户名和密码登陆!


登陆后可以通过图形界面查看后端主机的健康状况。


四.日志配置


vim /etc/rsyslog.conf 
 13 $ModLoad imudp
 14 $UDPServerRun 514

42*.info;mail.none;authpriv.none;cron.none;local0.none;             /var/log/mes    sages
62 local0.*                               /var/log/haproxy.log
/etc/init.d/rsyslog restart
日志查看:tail -f /var/log/haproxy.log

五.添加访问控制


 vim /etc/haproxy.cfg



 172.25.254.50主机在浏览器端就不能访问:172.25.50.1了


 所以对限制访问的主机添加提示页面:错误访问时重定向:

 如果遇见403的错误代码就重定向




[root@server1 haproxy]# vim /var/www/html/index.html
error
[root@server1 haproxy]# /etc/init.d/httpd start
测试:访问时会跳转到172.25.50.1:8080/index.html

 

 或者直接重定向:


 vim /etc/haproxy/haproxy.cfg




六.动静分离


[root@server1 haproxy]# vim haproxy.cfg 


server2上:
[root@server2 ~]# cd /var/www/html/
[root@server2 html]# ls
index.html
[root@server2 html]# cat index.html 
sesrver2
server3上:
[root@server3 html]# ls
index.php
[root@server3 html]# cat index.php 
<?php
phpinfo()
?>

 

测试:浏览器访问172.25.50.1 是自己写的静态页面;访问172.25.50.1/index.php 即php输出信息


七.上传下载分离


 vim /etc/haproxy/haproxy.conf 


 配置文件修改如下: 





在server2和server3上:
[root@server2 html]# ls #两者相同
index.php upload upload_file.php


测试:浏览器输入172.25.50.1/index.php 可以看到上传页面及其按钮,选择文件上传后输入172.25.50.1/upload_file.php

会看到上传文件信息

查看srevr2的upload目录下即可看到上传文件

即 使用server3上传图片(访问动态页面),却上传到server2上了(静态请求)

03-19
### IEEE 802.1Q VLAN Tagging Protocol Standard IEEE 802.1Q 是支持虚拟局域网(VLAN)的标准协议之一,通常被称为 Dot1q。该标准定义了一种用于以太网帧的 VLAN 标记系统以及交换机和桥接器处理这些标记帧的操作流程[^2]。 #### 协议结构概述 IEEE 802.1Q 的核心功能在于通过在以太网数据帧中插入特定字段来实现 VLAN 标签的功能。这种标签使得网络设备能够识别哪些流量属于哪个 VLAN,并据此执行转发决策。具体来说: - **Tag Header**: 在原始以太网帧头部增加了一个额外的 4 字节字段作为 VLAN 标签头。这四个字节包含了以下部分: - **Priority Code Point (PCP)**: 使用 3 比特表示优先级级别,范围从 0 到 7,主要用于 QoS 控制。 - **Canonical Format Indicator (CFI)**: 这是一个单比特位,在传统以太网环境中设置为零。 - **VLAN Identifier (VID)**: 使用 12 比特标识具体的 VLAN ID,理论上可以支持多达 4096 个不同的 VLAN(编号从 0 至 4095),其中某些特殊值保留给内部用途或管理目的。 #### 数据包处理机制 当一个带有 VLAN tag 的数据包进入支持 IEEE 802.1Q 的交换机时,它会依据此标签决定如何路由或者过滤该数据流。如果目标端口不属于同一 VLAN,则不会传输至其他无关联的物理接口上;反之亦然——只有相同 VLAN 成员之间才允许互相通信除非经过路由器跨网段访问[^1]。 此外,为了简化管理和配置过程并增强互操作性,还引入了一些辅助性的子协议和服务组件比如 GARP(通用属性注册协议)。GARP 可帮助分发有关 VLAN 成员资格的信息到各个连接节点以便动态调整其行为模式而无需频繁手动干预[^3]。 以下是创建带 VLAN TAG 的 Python 示例代码片段展示如何模拟构建这样的 Ethernet Frame: ```python from scapy.all import Ether, Dot1Q, IP, sendp def create_vlan_packet(src_mac="00:aa:bb:cc:dd:ee", dst_mac="ff:ff:ff:ff:ff:ff", vlan_id=100, src_ip="192.168.1.1", dst_ip="192.168.1.2"): ether = Ether(src=src_mac, dst=dst_mac) dot1q = Dot1Q(vlan=vlan_id) ip_layer = IP(src=src_ip, dst=dst_ip) packet = ether / dot1q / ip_layer return packet packet = create_vlan_packet() sendp(packet, iface="eth0") # Replace 'eth0' with your network interface name. ``` 上述脚本利用 Scapy 库生成包含指定源地址、目的地址及所属 VLAN 编号的数据报文并通过选定的网卡发送出去测试实际效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值