Chinaunix首页 | 论坛 | 博客
  • 博客访问: 262804
  • 博文数量: 19
  • 博客积分: 1608
  • 博客等级: 上尉
  • 技术积分: 335
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-10 10:05
文章分类

全部博文(19)

文章存档

2012年(3)

2011年(6)

2010年(7)

2009年(3)

分类: LINUX

2011-05-31 17:32:21

 3 带cookie插入的简单HTTP/HTTPS负载均衡
这是跟示例1相同的情况下,但是Web server使用的是https
                +-------+
                |clients|  clients
                +---+---+
                    |
                   -+-----+--------+----
                          |       _|_db
                       +--+--+   (___)
                       | SSL |   (___)
                       | web |   (___)
                       +-----+
                   192.168.1.1   192.168.1.2
由于haproxy不能处理SSLSSL这一部分将不得不从server中提取出来(腾出更多的资源),而安装在load-balancer上。在一个box上安装haproxyapache+mod_ssl,把该box的负载分散至新的box上。Apache运行在SSLreverse-proxy-cache模式下。如果应用程序设计的合理,甚至可能会降低其负载。不过,由于现在是一个与客户端和缓存的haproxy,一些安全必须采取措施,以确保插入的cookies不被缓存。

  192.168.1.1    192.168.1.11-192.168.1.14   192.168.1.2
 -------+-----------+-----+-----+-----+--------+----
        |           |     |     |     |       _|_db
     +--+--+      +-+-+ +-+-+ +-+-+ +-+-+    (___)
     | LB1 |      | A | | B | | C | | D |    (___)
     +-----+      +---+ +---+ +---+ +---+    (___)
     apache         4 cheap web servers
     mod_ssl
     haproxy 

LB1上的配置:

-------------------------

listen 127.0.0.1:8000

       mode http

       balance roundrobin

       cookie SERVERID insert indirect nocache

       option httpchk HEAD /index.html HTTP/1.0

       server webA 192.168.1.11:80 cookie A check

       server webB 192.168.1.12:80 cookie B check

       server webC 192.168.1.13:80 cookie C check

       server webD 192.168.1.14:80 cookie D check

描述:

-------------------------

- LB1上的apache443端口上接收clients的请求

- apache前传请求至绑定在127.0.0.1:8000上的haproxy

- 如果request不带cookie,则被前传至一台有效的server

- 在回复时,haproxy会在回复中插入一个包含server名称(如:A)的"SERVERID" cookie,和一个"Cache-control: private" header。那样apache就不会cache带这样cookiepage

- 如果client再次访问时带了"SERVERID=A" cookie,则LB1会知道必须把该request前传至server Ahaproxy会删除该cookie,而server不会看到它;

- 如果server "webA"宕机,request会被前传至另外一个有效的server,而cookie会被重置;


提示:

-------------------------

- 如果cookie工作在"prefix"模式下,haproxy就不需要配置"nocache"选项。因为,这个application cookie会被修改,并且application flags会被保留;

- 如果haproxy的前段使用了apache1.3,则它会一直禁用后端HTTP keep-alive,因此可以不必在haproxy上配置 "httpclose"

- 如果application需要知道client's IP,则在apache上配置X-Forwarded-For header,而不要在haproxy上配置;


数据流:

-------------------------

(apache)                           (haproxy)                         (server A)

  >-- GET /URI1 HTTP/1.0 ------------> |

               ( no cookie, haproxy forwards in load-balancing mode. )

                                       | >-- GET /URI1 HTTP/1.0 ---------->

                                       | <-- HTTP/1.0 200 OK -------------<

               ( the proxy now adds the server cookie in return )

  <-- HTTP/1.0 200 OK ---------------< |

      Set-Cookie: SERVERID=A           |

      Cache-Control: private           |

  >-- GET /URI2 HTTP/1.0 ------------> |

      Cookie: SERVERID=A               |

      ( the proxy sees the cookie. it forwards to server A and deletes it )

                                       | >-- GET /URI2 HTTP/1.0 ---------->

                                       | <-- HTTP/1.0 200 OK -------------<

   ( the proxy does not add the cookie in return because the client knows it )

  <-- HTTP/1.0 200 OK ---------------< |

  >-- GET /URI3 HTTP/1.0 ------------> |

      Cookie: SERVERID=A               |

                                    ( ... )


3.1 使用Stunnel的替代方案

如果只需要SSL而不需要cache,则stunnel是一个比Apache+mod_ssl更廉价的解决方案。stunnel默认不出HTTP并且不能增加X-Forwarded-For header,但是在haproxy的官方网站上有针对最新stunnel versions版本支持该特性的patch。这时,stunnel只是处理HTTPS而不处理HTTP。这也意味着haproxy会接收所有的HTTP访问。因此,haproxy需要在HTTP访问中增加X-Forwarded-For header,而不用对HTTPS访问做处理。因为,stunnel已经做过处理了。我们可以使用"except"关键字告诉haproxy,来自本地的连接已经有有效的header了。


  192.168.1.1    192.168.1.11-192.168.1.14   192.168.1.2

 -------+-----------+-----+-----+-----+--------+----

        |           |     |     |     |       _|_db

     +--+--+      +-+-+ +-+-+ +-+-+ +-+-+    (___)

     | LB1 |      | A | | B | | C | | D |    (___)

     +-----+      +---+ +---+ +---+ +---+    (___)

     stunnel        4 cheap web servers

     haproxy 


stunnel(LB1)上的配置:

    cert=/etc/stunnel/stunnel.pem

    setuid=stunnel

    setgid=proxy

    socket=l:TCP_NODELAY=1

    socket=r:TCP_NODELAY=1

    [https]

    accept=192.168.1.1:443

    connect=192.168.1.1:80

    xforwardedfor=yes

haproxy(LB1)上的配置:

    listen 192.168.1.1:80

       mode http

       balance roundrobin

       option forwardfor except 192.168.1.1

       cookie SERVERID insert indirect nocache

       option httpchk HEAD /index.html HTTP/1.0

       server webA 192.168.1.11:80 cookie A check

       server webB 192.168.1.12:80 cookie B check

       server webC 192.168.1.13:80 cookie C check

       server webD 192.168.1.14:80 cookie D check

描述:

-------------

- LB1上的stunnel会在443上接收clientrequests

- stunnel前传request至绑定在80haproxy

- haproxy会在80端口接收HTTP client request,在同一个端口(80)上解析来自stunnelSSL requests

- stunnel增加X-Forwarded-For headerSSL 请求)

- haproxy在除了来自本地的地址(stunnel)的每个request中增加X-Forwarded-For header


阅读(11121) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~