最近用到的,Haproxy做前端负载服务器,碰到的一些问题记录。

1、后端负载多个服务器后,登录页面出现的验证码错误问题

这种情况一般都是会话保持没有做好,加入以下配置:

cookie SRV insert indirect nocache

使其变为:

listen HTTP-4481
    bind 0.0.0.0:4481  
    mode http
    option httplog  
    retries 3
    option httpclose
    option forwardfor
    balance roundrobin
    timeout connect 5000
    timeout client  50000
    timeout server  50000
    cookie SRV insert indirect nocache
    server WEB-1 192.168.1.1:4481 cookie WEB-1 check weight 1 maxconn 50000 check inter 5000
    server WEB-2 192.168.1.2:4481 cookie WEB-2 check weight 1 maxconn 50000 check inter 5000

2、frontend、backend、Listen之间的区别及关系

frontend:接收请求的前端虚拟节点,Frontend可以更加规则直接指定具体使用后端的backend
backend : 后端服务集群的配置,真实服务器,一个Backend对应一个或者多个实体服务器,也就是跟随者Frontend,两者结合使用。
通常Frontend和backend一并使用,如:

frontend http-4480
    bind *:80
    mode http
    option httplog  
    default_backend  HTTP-A-4480

backend HTTP-A-4480
    server WEB-1 192.168.198.1:80 cookie WEB-1 check weight 1 maxconn 8000 check inter 5000
    server WEB-2 192.168.198.2:80 cookie WEB-2 check weight 1 maxconn 8000 check inter 5000

Listen : (可以理解为Fronted和backend的组合体) 比如haproxy实例状态监控部分配置。
Listen是上面两者的结合体,是一种老的展现方式,现在依然可用,其配置如:

listen HTTP-4481
   bind 0.0.0.0:4481  
   mode http
   option httplog  
   retries 3
   option httpclose
   option forwardfor
   balance roundrobin
   cookie SRV insert indirect nocache
   server WEB-1 192.168.1.1:4481 cookie WEB-1 check weight 1 maxconn 5000 check inter 5000
   server WEB-2 192.168.1.2:4481 cookie WEB-2 check weight 1 maxconn 5000 check inter 5000

3、haproxy global部分配置说明

        log    global         #引入global定义的日志格式
        mode    http          #所处理的类别(7层代理http,4层代理tcp)
        maxconn 50000         #最大连接数
        option  httplog       #日志类别为http日志格式
        option  httpclose     #每次请求完毕后主动关闭http通道
        option  dontlognull   #不记录健康检查日志信息
        option  forwardfor    #如果后端服务器需要获得客户端的真实ip,需要配置的参数,可以从http header 中获取客户端的IP
        retries 3             #3次连接失败就认为服务器不可用,也可以通过后面设置
        option redispatch     #上述选项意思是指serverID 对应的服务器挂掉后,强制定向到其他健康的服务器, 当使用了 cookie时,haproxy将会将其请求的后端服务器的serverID插入到cookie中,以保证会话的SESSION持久性;而此时,如果后端的服务器宕掉了,但是客户端的cookie是不会刷新的,如果设置此参数,将会将客户的请求强制定向到另外一个后端server上,以保证服务的正常
        stats refresh 30       #设置统计页面刷新时间间隔
        option abortonclose    #当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接
        balance roundrobin     #设置默认负载均衡方式,轮询方式
        #balance source        #设置默认负载均衡方式,类似于nginx的ip_hash      
        #contimeout 5000        #设置连接超时时间
        #clitimeout 50000       #设置客户端超时时间
        #srvtimeout 50000       #设置服务器超时时间
        timeout http-request    10s  #默认http请求超时时间
        timeout queue           1m   #默认队列超时时间
        timeout connect         10s  #默认连接超时时间
        timeout client          1m   #默认客户端超时时间
        timeout server          1m   #默认服务器超时时间
        timeout http-keep-alive 10s  #默认持久连接超时时间
        timeout check           10s  #设置心跳检查超时时间

更详细的可参考:HAproxy指南之haproxy配置详解

4、真实服务器参数详解

server  web2 192.168.2.1:80 cookie 2 weight 3 check inter 2000 rise 2 fall 3
    # web1/web2:自定义服务器别名
    # 192.168.2.10:80:服务器IP:Port
    # cookie 1/2:表示serverid
    # weight: 服务器权重,数字越大分配到的请求数越高
    # check: 接受定时健康检查 
    # inter 2000: 检查频率
    # rise 2: 两次检测正确认为服务器可用
    # fall 3: 三次失败认为服务器不可用

5、在ubuntu中为haproxy打开日志记录

vi  /etc/rsyslog.d/haproxy.conf

添加以下:

$ModLoad imudp
$UDPServerRun 514
local0.*     /var/log/haproxy.log

重启rsyslog和haproxy

service rsyslog restart
service haproxy restart

6、Ubuntu 12.04中默认安装的haproxy无法启动问题解决

vi /etc/default/haproxy

修改:ENABLED 的值 为 1 ,重启haproxy服务:

service haproxy start

即可。

7、在HA中配置SSL,启用HTTPS转发

方法一:
此方法只需在HAProxy中配置SSL即可,无需在后端服务器中配置SSL。

frontend https_frontend
      bind *:443 ssl crt /etc/ssl/certs/xxx.com_bundle.pem
      mode http
      option httpclose
      option forwardfor
      reqadd X-Forwarded-Proto:\ https
      default_backend web_server

backend web_server
      mode http
      balance roundrobin
      cookie SERVERID insert indirect nocache
      server s1 172.16.157.9:80 check cookie s1
      server s2 172.16.157.10:80 check cookie s2

方法二:
此方法无需在Haproxy中配置SSL,需要在后端服务中配置,如Nginx或Apache中配置SSL。

frontend https_frontend
  bind *:443
  mode tcp
  default_backend web_server

backend web_server
  mode tcp
  balance roundrobin
  stick-table type ip size 200k expire 30m
  stick on src
  server s1 172.16.157.9:443 check cookie s1
  server s2 172.16.157.9:443 check cookie s2

注意,这种模式下mode 必须是tcp 模式

8、HTTP跳转为HTTPS

frontend unsecured
        bind 0.0.0.0:80
        mode http
        redirect location https://www.xxx.com/