简介

HAProxy 提供高可用性、负载均衡以及基于 TCP 和 HTTP 应用的代理,支持虚拟主机,

它是免费、快速并且可靠的一种解决方案。

HAProxy 特别适用于那些负载特大的 web 站点, 这些站点通常又需要会话保持或七层处理。HAProxy 运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中.

同时可以保护你的 web 服务器不被暴露到网络上.

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

实验环境

rhel6.5 selinux and iptables disabled

实验主机:haproxy    172.25.12.1(server1.example.com)

haback 172.25.12.4(server4.example.com)

web1 172.25.12.2(server2.example.com)

web2 172.25.12.3(server3.example.com)

软件下载:http://haproxy.1wt.eu/

安装

@源码方式:

tar zxf haproxy-1.4.23.tar.gz

cd haproxy-1.4.23

make TARGET=linux26(*内核版本号) ARCH=x86_64 USE_PCRE=1 PREFIX=/usr/local/haproxy install

@yum源安装

yum install haproxy –y         [enable yum repo `HighAvailability LoadBalancer packages` ]

 

配置:

vim/etc/haproxy/haproxy.cfg

global段:设定全局参数,属于进程级的配置,通常和操作系统的配置相关

maxconn 设定每个haproxy进程可接受的最大并发连接数。此选项等同于ulimt –n.一般设定大写 maxconn 65535

    daemon 后台运行

    user/uid,group/gid指定运行的属主

    nbproc <number>:启动进程个数,推荐使用默认的1个进程。如果设定多进程,也不要超过CPU的个数;

 

defaults段:设定默认参数。

    mode:

tcp:服务器和客户端建立一个全双工的连接,Haproxy充当路由。不会对七层报文做任何的检测

http:客户端与haproxy建立一次连接,haproxy和服务端建立一次连接。

health:直接不用

    retries:设定连接后端服务器失败重试次数

    timeout connect:haproxy连接RS最长时间

    timeout client:客户端发送数据时最长等待时间

    timeout server: 服务器回应给客户端数据最长等待时间

 

frontend段:设定监听端口,配置ACL,使用的后端RS pool。

    option httplog: 详细的记录http的请求信息,如果记录访问数据到文件的话。默认记录很简单,源目IP

    option httpclose 表示在客户端和服务端完成第一次数据请求后,Haproxy将主动关闭此选项。另外Haproxy在http mode下支持五种连接相应模式。默认是keep alive(option http-keep-alive),连接保持开放但是在相应结束之前和下一个新的请求来之间是空闲的。另外的tunnel ("option http-tunnel")在1.0-1.5-dev21的默认模式,只有第一个请求和响应才会出来,其他的只转发不做处理。不能用在http请求,问题很多。还有另外的两种:server close ("option http-server-close")、forced close ("option forceclose")

 

backend段:设定RS,一般的调度算法也在这里配置。还有RS健康检查

    算法:常见的

  1. roundrobin:基于权重的轮询,适用于RS处理能力相近的情况。不过后端服务器是有限定的
  2. static-rr: 和rr差不多的,静态的,后端服务器没有限定
  3. source:根据source IP进行hash,然后与服务器的总权数相除,选出后端的服务器。常用于session的保持。顺带提下参数hash-type [map-based,consistent]。map-based设定中,hash表包含所有在线服务器的静态数组。consitent是树状的结构。相当于MC的一致性hash,因此hash均衡性更好,适用于后端服务器经常调整。
  4. leastconn:选出连接数最少的,一般用于长连接的处理,如mysql,ldap等。不适用http这种短连接。
  5. uri基于uri生成hash表的算法,主要用于后端是缓存服务器。

    len 基于多少个字符的uri

    depth 基于多少个目录层次的uri

    例子: http://test.com/a/b/c/d/e/a.jpg

len 3 hash的uri是/a/

depth 3 hash的uri是/a/b/c/

     两个都指定的话,只要一个匹配到就停止

  1. url_params根据url的参数来调度,用于将同一个用户的信息,都发送到同一个后端server
  2. hdr(name):基于http的首部hash,不满足条件时,使用rr

cookie:表示允许向cookie插入serverid

option httpchk <method> <uri> <version>:启动http的检测功能

        method:GET、POST、HEAD(常用、只返回状态码,200为正常,不返回数据)

        version:http的版本号

    server:check [port num]启用监控、inter 2000间隔2秒、rise 1检测成功1次再次添加至正常RS pool中、fall 2检测两次失败就剔除、cookie设定cookie用于回话保持、weight <0-255>权重、backup备机

 

listen段:frontend和backend的结合体,一般配置haproxy的监控页面

 

@测试实验效果:

修改haproxy的配置文件(注释,添加规则)

#frontend main *:5000

# acl url_static path_beg -i /static /images /javascript /stylesheets

# acl url_static path_end -i .jpg .gif .png .css .js

#

# use_backend static if url_static

# default_backend app

#

#---------------------------------------------------------------------

# static backend for serving up images, stylesheets and such

#---------------------------------------------------------------------

#backend static

# balance roundrobin

# server static 127.0.0.1:4331 check

#

#---------------------------------------------------------------------

# round robin balancing between the various backends

#---------------------------------------------------------------------

# round robin balancing between the various backends

#---------------------------------------------------------------------

#backend app

# balance roundrobin

# server app1 127.0.0.1:5001 check

# server app2 127.0.0.1:5002 check

# server app3 127.0.0.1:5003 check

# server app4 127.0.0.1:5004 check

 

listen www.haproxy.com *:80

balance
roundrobin

server web1 172.25.12.2 check

server web2 172.25.12.3 check

实验结果为在web1.web2之间轮询

 

@看状态:

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

stats     uri     /status    /添加此行

 

@设置权重

listen www.haproxy.com *:80

        balance roundrobin

        server web1 172.25.12.2 check weight 2

        server web2 172.25.12.3 check weight 1

 

@建立备机

listen www.haproxy.com *:80

        balance roundrobin

        server web1 172.25.12.2 check weight 2

        server web2 172.25.12.3 check weight 1

server backup 172.25.12.1:8080 backup

如果web1web2都down了那haproxy就顶上。但是如果只有还有一个存活,backup就不会启动。

当有多个备机时,haproxy默认当所有主机都挂了只会选择其中一个来作为备机,如果认为一个不够,可以使用option allbackups

 

当然,需要把haproxy的http    监听的端口改成8080.因为haproxy已经把redhat1的80端口占了.用途可以是    服务器故障,在haproxy发布此信息

[root@server1 haproxy]# cat /var/www/html/index.html

sorry! the server is broken, please try again later.

 

@配置前端后端

frontend www.haproxy.com *:80

    default_backend webbalance

 

backend webbalance

    balance roundrobin

    server web1 172.25.12.2:80 check weight 2

    server web2 172.25.12.3:80 check weight 1

    server backup 172.25.12.1:8080 backup

 

@监控界面添加用户名密码(注意删除上面的测试stats uri /status)

listen stats_auth *:1889

    stats enable

    stats uri /status

    stats auth wxl:redhat            #管理帐号和密码,可以建立多个,换行重写

    stats auth qiandan:love*you        

    stats refresh 5s                    #刷新频率

stats realm     Haproxy\ Staticstic    #输入密码时显示的提示

 

@HAproxy访问控制

语法:acl acl名称    acl方法    -i [匹配路径、主机等]

acl方法:常见的

hdr_reg(host),根据主机的正则匹配。

    acl store hdr_reg(host) –i ^(www.wxl.com|www.qiandan.com)

hdr_dom (host), 主机名

        acl bbs hdr_dom(host) –i bbs.wxl.com

    hdr_beg(host),主机名以什么开始

    url_sub,    url中包含的子串

    path_beg,path_end.路径的以什么开始或结尾

应用 use_backend backend_name if|unless acl1 acl2 or acl3

    block if acl4

注意:if acl1 || acl2 acl3 表示。acl1和acl2 或者 acl2和acl3为一组

 

控制特定IP的访问

拒绝:

frontend www.haproxy.com *:80

    acl wxl src 172.25.12.250 172.25.12.4

    tcp-request content reject if wxl

    default_backend webbalance

只允许

frontend www.haproxy.com *:80

    acl wxl src 172.25.12.250 172.25.12.4

    tcp-request content if wxl

tcp-request content reject

    default_backend webbalance

@重定向:

redirect location <loc> [code <code>] <option> [{if | unless} <condition>]

redirect prefix <pfx> [code <code>] <option> [{if | unless} <condition>]

redirect scheme <sch> [code <code>] <option> [{if | unless} <condition>]

 

frontend www.haproxy.com *:80

    acl wxl src 172.25.12.250

    redirect location http://server2.example.com/ if wxl

#结果是一直在server2.exmaple.com上,当然地址栏中显示是server2的信息地址

    default_backend webbalance

 

一些例子:

#定向login的URL到https

acl clear dst_port 80

acl secure dst_port 8080

acl login_page url_beg /login

acl logout url_beg /logout

acl uid_given url_reg /login?userid=[^&]+

acl cookie_set hdr_sub(cookie) SEEN=1

 

redirect prefix https://mysite.com set-cookie SEEN=1 if !cookie_set

redirect prefix https://mysite.com if login_page !secure

redirect prefix http://mysite.com drop-query if login_page !uid_given

redirect location http://mysite.com/ if !login_page secure

redirect location / clear-cookie USERID= if logout

 

对于URL结尾没有"/"定向到有"/"

acl missing_slash path_reg ^/article/[^/]*$

redirect code 301 prefix / drop-query append-slash if missing_slash

 

在定向http到https

redirect scheme https if !{ ssl_fc }

 

在主机前添加www.

http-request redirect code 301 location www.%[hdr(host)]%[req.uri] \

unless { hdr_beg(host) -i www }

 

重定向到错误页:代码支持400, 403, 408, 500, 502, 503, and 504.不支持404

frontend www.haproxy.com *:80

    acl wxl src 172.25.12.250

    block if wxl

    errorloc 403 http://172.25.12.1:8080 if wxl

    default_backend webbalance

 

还有文件的形式,但是受限也比较多的,文件大小在8-16k,否则太大被截断。

errorfile 400 /etc/haproxy/errorfiles/400badreq.http

errorfile 408 /dev/null # workaround Chrome pre-connect bug

errorfile 403 /etc/haproxy/errorfiles/403forbid.http

errorfile 503 /etc/haproxy/errorfiles/503sorry.http

 

 

动静分离(注意用户访问的网页在web1上一定是存在的。如

    http://www.haproxy.com/test.php.那么web1上就有test.php)

frontend www.haproxy.com *:80

    acl php    path_end -i .php

    use_backend phpapp if php

    default_backend webbalance

 

backend webbalance

    balance roundrobin

    server web1 172.25.12.2:80 check weight 2

    server web2 172.25.12.3:80 check weight 1

    server backup 172.25.12.1:8080 backup

 

backend phpapp

    server web1 172.25.12.2:80 check

 

    

 

@定义haproxy日志

log 127.0.0.1 local0 err            

日志级别err、warning、info、debug。一般选择err,性能才不会影响

 

# vi /etc/rsyslog.conf #接受 haproxy 日志

$ModLoad imudp             #imudp模块名,支持UDP协议

$UDPServerRun 514

local0.*             /var/log/haproxy.log

还需修改/etc/sysconfig/rsyslog

SYSLOGD_OPTIONS="-c 2 -r -m 0"

/etc/init.d/rsyslog restart

 

 

后端获取客户端IP

haproxy设定:option forwardfor [expect <network>] [header <name>] [if-none]

一般定义在listen段

 

# Public HTTP address also used by stunnel on the same machine

frontend www

mode http

option forwardfor except 127.0.0.1 # stunnel already adds the header

 

# Those servers want the IP Address in X-Client

backend www

mode http

option forwardfor header X-Client

 

Nginx日志中获取访客真实IP

log_format main '$remote_addr - $remote_user [$time_local] '
                '"$request" $status $body_bytes_sent "$http_referer" '
               '"$http_user_agent" "$http_x_forwarded_for"' ;
  access_log /var/log/nginx/localhost.access.log  main;

Apache:    

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

将其修改为:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{X-Forwarded-For}i\" " combined

Tomcat

1、修改tomcat的server.xml,如:vi /usr/local/tomcat7/conf/server.xml。

2、修改pattern为pattern='%{X-Forwarded-For}i %h %l %u %t "%r" %s %b',则会记录headers头中的X-Forwarded-For信息。

 

生产环境haproxy的Iptables

一般情况下,由于Haproxy的所接受的流量都比较大,所以基本上要把本机的iptables关闭,而是使用专门的硬件防火墙

高可用Haproxy

与keepalived结合(高可用+负载均衡)

在haproxy haback 上安装keepalived

yum install -y keepalived.x86_64 --nogpgcheck(提示key有问题)

编写keepalives调用haproxy的脚本

[root@server1 keepalived]# cat check_haproxy.sh

#!/bin/bash

service haproxy status &> /dev/null || service haproxy restart &> /dev/null

 

if [ $? -ne 0 ];then

service keepalived stop &> /dev/null

fi

测试脚本。并给以执行权限 +x 否则 keepalived对haproxy的检测不成功

MAster端haproxy的keepalived配置文件

[root@server1 keepalived]# cat keepalived.conf

! Configuration File for keepalived

 

vrrp_script check_haproxy {

    script "/etc/keepalived/check_haproxy.sh"

 

#检测的另一种方式

#script "killall -0 haprxy"        #设置探测Haproxy访问运行状态

    

interval 2

    weight 2

}

    

global_defs {

notification_email {

root@localhost

}

notification_email_from keepalived@server1.example.com

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id LVS_DEVEL

}

 

vrrp_instance VI_1 {

state MASTER            #BACKUP

interface eth0

virtual_router_id 51

priority 100                 #BACKUP端小于此值

advert_int 1

    nopreempt                #设定主机恢复后,不回切

authentication {

auth_type PASS

auth_pass 1111

}

 

    #配置报警

    notify_master "/path/to/alert_scripts.py master"

notify_backup "/path/to/alert_scripts.py backup"

notify_falut "/path/to/alert_scripts.py fault"

 

 

virtual_ipaddress {

172.25.12.100

}

track_script {

check_haproxy

}

}

如果有多个VIP的话,可以考虑做双主,keepalived启多个vrrp_instance

Haproxy常见用法的更多相关文章

  1. Linux中find常见用法

    Linux中find常见用法示例 ·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \; find命令的参数 ...

  2. php中的curl使用入门教程和常见用法实例

    摘要: [目录] php中的curl使用入门教程和常见用法实例 一.curl的优势 二.curl的简单使用步骤 三.错误处理 四.获取curl请求的具体信息 五.使用curl发送post请求 六.文件 ...

  3. Guava中Predicate的常见用法

    Guava中Predicate的常见用法 1.  Predicate基本用法 guava提供了许多利用Functions和Predicates来操作Collections的工具,一般在 Iterabl ...

  4. find常见用法

    Linux中find常见用法示例 ·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \; find命令的参数 ...

  5. iOS 开发多线程篇—GCD的常见用法

    iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...

  6. iOS开发多线程篇—GCD的常见用法

    iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...

  7. [转]EasyUI——常见用法总结

    原文链接: EasyUI——常见用法总结 1. 使用 data-options 来初始化属性. data-options是jQuery Easyui 最近两个版本才加上的一个特殊属性.通过这个属性,我 ...

  8. NSString常见用法总结

    //====================NSStirng 的常见用法==================== -(void)testString { //创建格式化字符串:占位符(由一个%加一个字 ...

  9. [转]Linux中find常见用法示例

    Linux中find常见用法示例[转]·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \;find命令的参 ...

随机推荐

  1. BZOJ 1617 [Usaco2008 Mar]River Crossing渡河问题:dp

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1617 题意: Farmer John以及他的N(1 <= N <= 2,500 ...

  2. html5--4-1 video/视频播放

    html5--4-1 video/视频播放 学习要点 掌握video元素的基本用法 直到现在,在网页中的大多数视频是通过插件(比如 Flash)来显示的.然而,并非所有浏览器都拥有同样的插件. HTM ...

  3. 用php描述二分查找法

    //二分查找 $arr = array(0,1,2,3,4,5,6,7,8,9); function bin_sch($array, $low, $high, $k){ if ($low <= ...

  4. multi_socket

    threading_test.py #threading #为什么在命令行可以执行,F5不能执行 #线程处理能导致同步问题 from socketserver import TCPServer,Thr ...

  5. [PA 2011] Journeys

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3073 [算法] 考虑线段树优化建图 建立两棵线段树 , 一棵为入树 , 一棵为出树 ...

  6. 利用openssl进行base64的编码与解码

    openssl可以直接使用命令对文件件进行base64的编码与解码,利用openssl提供的API同样可以做到这一点. 废话不多说,直接上代码了.需要注意的是通过base64编码后的字符每64个字节都 ...

  7. npm安装cnpm淘宝镜像

      npm set registry https://registry.npm.taobao.org # 注册模块镜像 npm set disturl https://npm.taobao.org/d ...

  8. 三、mysql登录详解及版本号查询

    1.用window+r,输入cmd,用mysql -uuser -ppassword登录时出现‘mysql’不是有效的内部命令? 答:这是因为没有配置MySQL的环境变量path所致. MySQL的环 ...

  9. 修改SQL Server 2005的默认端口

    修改SQL Server 2005的默认端口 1.打开SQL Server的配置管理程序 Microsoft SQL Server 2005->配置工具->SQL Server Confi ...

  10. Flutter实战视频-移动电商-10.首页_FlutterSwiper轮播效果制作

    10.首页_FlutterSwiper轮播效果制作 博客地址: https://jspang.com/post/FlutterShop.html#toc-5c2 flutter_swiper http ...