HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速而且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点一般又须要会话保持或七层处理。HAProxy运行在时下的硬件上,彻底能够支持数以万计的并发链接。而且它的运行模式使得它能够很简单安全的整合进您当前的架构中, 同时能够保护你的web服务器不被暴露到网络上。 javascript
HAProxy实现了一种事件驱动、单一进程模型,此模型支持很是大的并发链接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,不多能处理数千并发链接。事件驱动模型由于在有更好的资源和时间管理的用户端(User-Space) 实现全部这些任务,因此没有这些问题。此模型的弊端是,在多核系统上,这些程序一般扩展性较差。这就是为何他们必须进行优化以 使每一个CPU时间片(Cycle)作更多的工做。php
yum install haproxy -y
### 主配置文件是/etc/haproxy/haproxy.conf ### 配置文件主要有: global settings: 全局配置段 主要用于定义haproxy进程自身的工做特性; proxies: 代理配置段 backend: 后端服务器组 frontend: 定义面向客户的监听的地址和端口,以及关联到的后端服务器组; listen: 组合方式直接定义frontend及相关的backend的一种机制; defaults: 定义默认配置 ################################################################################# gloab的默认选项: log 127.0.0.1 local2 # 记录日志,此时要借助于本机的rsyslod的日志服务,须要开启udp端口监听 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon stats socket /var/lib/haproxy/stats ################################################################################# defaults配置选项: mode http # 工做模式,有TCP和http,表明4层代理、7层代理 log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 # 重试次数 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 # 最大并发链接数
实验主机 | 安装软件 |
172.16.10.9 | haproxy,反向代理的前端 |
172.16.10.77 | httpd,后端主机 |
172.16.10.1 | httpd,后端主机 |
## 配置过程: 在172.16.10.1和172.16.10.77上: yum install httpd -y 建立测试页面: echo "172.16.10.1@node1.example.com" > /var/www/html/index.html echo "172.16.10.77@basic.example.com" > /var/www/html/index.html ############################################################## ## 在172.16.10.9上配置,在配置文件中添加如下内容,就能够实现: frontend http *:80 default_backend web backend web balance roundrobin server web1 172.16.10.77:80 server web2 172.16.10.1:80 ###############################################################
此时会出现负载均衡的效果:css
此时查看后端web日志:html
解决办法:前端
编辑http的配置文件中,修改如下内容:(修改记录的http的头部信息) LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 修改成: LogFormat "\"%{X-Forwarded-For}i\" %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
在上面的的使用中,使用到了balance关键字,这个关键字的做用是指定负载均衡算法的。java
### haproxy使用的调度算法:经常使用的 ### 使用范围:defaults forntend backend listen 一、roundrobin: 至关于lvs的 wrr, 是一种dynamic调度算法,支持weight指定权重。所谓的动态是 能够再服务器运行中调整,慢启动。对后端服务器数目由限制 4096 二、static-rr: wrr, static调度算法,对后端服务器数目没有限制 三、leastconn: 相似于lvs的wlc, dynamic方法 四、source: 建议用于基于TCP模式调度,且不支持使用cookie插入模式时使用; 由hash-type参数决定其为dynamic或者static等价于ipvs: sh,nginx: ip_hash 五、uri: 基于请求报文中的uri的左半部分(查询条件以前的部分)或所有的URI进行调度; 经常使用于backend server为cache server的场景中;由hash-type参数决定其为dynamic或者static 六、url_params: 经常使用于后端服务器须要对用户进行认证的场景中; 由hash-type参数决定其为dynamic或者static 七、hdr(<name>):根据用户请求报文中,指定的http首部的值进行调度 hdr(host):经常使用于实现将对同一个虚拟主机的请求始终发往同个backend server; use_domain_only: 在计算hash值时仅使用域名;由hash-type参数决定其为dynamic或者static
hash_type的取值有:node
map-based:hash表是一个包含了全部在线服务器的静态数组。 挑选服务器是根据其在数组中的位置进行的,所以,当一台服务器宕机或添加了一台新的服务器时, 大多数链接将会被从新派发至一个与此前不一样的服务器上。 对于缓存服务器的工做场景来讲,此方法不适用。 consistent:hash表是一个由各服务器填充而成的树状结构; 基于hash键在hash树中查找相应的服务器时,最近的服务器将被选中。此方法是动态的, 支持在运行时修改服务器权重。 添加一个新的服务器时,仅会对一小部分请求产生影响,所以,尤为适用于后端服务器为cache的 场景。 不过,此算法不甚平滑,派发至各服务器的请求未必能达到理想的均衡效果,所以, 可能须要不时的调整服务器的权重以得到更好的均衡性。
cookie实现根据客户端cooike信息来实现持久链接。实现的原理:mysql
cookie关键字用法说明: nocacahe:将附加cookie信息的资源不缓存于缓存服务器中 insert:插入cooike信息 rewrite:重写cookie prefix:做为前缀
测试:修改haproxy的配置文件nginx
backend web balance roundrobin cookie webser insert nocache server web1 172.16.10.77:80 cookie web1 server web2 172.16.10.1:80 cookie web2
测试:web
### 在配置文件中添加: listen stats mode http bind 0.0.0.0:1080 stats enable stats hide-version stats uri /haproxyadmin?stats stats realm Haproxy\ Statistics stats auth admin:admin stats admin if TRUE
### 修改配置文件,以下: backend web balance roundrobin server web1 172.16.10.77:80 check port 80 inter 2 fall 2 rise 1 server web2 172.16.10.1:80 check port 80 inter 2 fall 2 rise 1 server back 172.16.10.9:8080 backup
当后端主机全都不在线时,测试:
一旦手段主机从新上线,访问恢复:
此时要利用到haproxy的ACL机制:
haproxy的ACL用于实现基于请求报文的首部、响应报文的内容或其它的环境状态信息来作出转发决 策,这大大加强了其配置弹性。其配置法则一般分为两步,首先去定义ACL,即定义一个测试条件, 然后在条件获得知足时执行某特定的动做,如阻止请求或转发至某特定的后端。 定义ACL的语法格式以下。 acl <aclname> <criterion> [flags] [operator] <value> ... <aclname>:ACL名称,区分字符大小写,且其只能包含大小写字母、数字、-(链接线)、_(下划线)、 .(点号)和:(冒号);haproxy中,acl能够重名,这能够把多个测试条件定义为一个共同的acl; <criterion>:测试标准,即对什么信息发起测试;测试方式能够由[flags]指定的标志进行调整; 而有些测试标准也能够须要为其在<value>以前指定一个操做符[operator]; [flags]:目前haproxy的acl支持的标志位有3个: -i:不区分<value>中模式字符的大小写; -f:从指定的文件中加载模式; --:标志符的强制结束标记,在模式中的字符串像标记符时使用; <value>:acl测试条件支持的值有如下四类: 整数或整数范围:如1024:65535表示从1024至65535;仅支持使用正整数(若是出现相似小数的标 识,其为一般为版本测试),且支持使用的操做符有5个,分别为eq、ge、gt、le和lt; 字符串:支持使用“-i”以忽略字符大小写,支持使用“\”进行转义; 若是在模式首部出现了-i,能够在其以前使用“--”标志位; 正则表达式:其机制类同字符串匹配; IP地址及网络地址 同一个acl中能够指定多个测试条件,这些测试条件须要由逻辑操做符指定其关系。 条件间的组合测试关系有三种:“与”(默认即为与操做)、“或”(使用“||”操做符)以及 “非”(使用“!”操做符)。
示例:
acl url_static path_beg -i /static /p_w_picpaths /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js acl host_static hdr_beg(host) -i img. video. download. ftp. acl being_scanned be_sess_rate gt 50
在172.16.10.9:
一、提供haproxy的配置文件,内容以下: global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon stats socket /var/lib/haproxy/stats defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 listen stats mode http bind 0.0.0.0:1080 stats enable stats hide-version stats uri /haproxyadmin?stats stats realm Haproxy\ Statistics stats auth admin:admin stats admin if TRUE frontend http bind *:80 acl url_static path_beg -i /static /p_w_picpaths /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js use_backend static if url_static default_backend web backend static balance roundrobin server static 172.16.10.122 check backend web balance roundrobin server web1 172.16.10.77:80 check port 80 inter 2 fall 2 rise 1 server web2 172.16.10.1:80 check port 80 inter 2 fall 2 rise 1 server back 172.16.10.9:8080 backup ################################################################################### 二、提供nfs服务 mkdir /data setfacl -m d:u:48:rwx /data/ ################################################################################### 三、提供Discuzz的数据库受权用户 mysql> GRANT ALL ON discuzz.* TO disuser@'172.16.10.%' IDENTIFIED BY 'dispass'; mysql> FLUSH PRIVILEGES; ################################################################################## 启动服务: service nfs start service haproxy restart
在172.16.10.一、172.16.10.77上:
yum install php php-mysql -y mkdir /var/www/html/discuzz service httpd restart
在172.16.10.122上:
这个节点上只需响应静态页面,能够不安装php php-mysql。直接挂载
在任意一台上,挂载nfs,开始安装discuzz.这里以172.16.10.77为例:
大体步骤: 一、mount -t nfs 172.16.10.9:/data/ /var/www/html/discuzz/ 二、解压discuzz安装包,将解压后的upload中的全部文件复制到/var/www/html/discuzz/ 三、开始安装:http;//172.16.10.77/discuzz/install/index.php
按照提示解决问题并安装,最关键的是数据库信息的填写:
安装完成后,在172.16.10.122和172.16.10.1上:mount -t nfs 172.16.10.9:/data/ /var/www/html/discuzz/ 开始测试:
前端调度:
此时,将静态页面服务器172.16.10.122中止,结果:
实现了必定程度上的动静分离。
关于haproxy更多,更详细的内容,参考官方文档。