对haproxy代理流程的数据进行抓包分析

itniaho

各模块名称以及作用

haproxy.cfg文件配置如下
  1. global 
  2.        maxconn 20480                 
  3.        log 127.0.0.1 local3          
  4.        chroot /var/haproxy           
  5.        uid 99                        
  6.        gid 99                        
  7.        daemon                        
  8.        nbproc 1                      
  9.        pidfile /var/run/haproxy.pid  
  10.        ulimit-n 65535                
  11. defaults 
  12.         log global 
  13.         mode http           
  14.         maxconn 20480       
  15.         option httplog      
  16.         option httpclose    
  17.         option dontlognull  
  18.         option forwardfor   
  19.         option redispatch   
  20.         option abortonclose 
  21.         stats refresh 30    
  22.         retries 3           
  23.         balance roundrobin  
  24.         contimeout 5000     
  25.         clitimeout 50000    
  26.         srvtimeout 50000    
  27.         timeout check 2000  
  28.  
  29. listen  admin_status                  
  30.         bind 0.0.0.0:65532           
  31.         mode http                    
  32.         log 127.0.0.1 local3 err     
  33.         stats refresh 5s             
  34.         stats uri /admin?stats       
  35.         stats realm itnihao\ itnihao 
  36.         stats auth admin:admin       
  37.         stats auth admin1:admin1     
  38.         stats hide-version           
  39.         stats admin if TRUE          
  40.         errorfile 403 /etc/haproxy/errorfiles/403.http 
  41.         errorfile 500 /etc/haproxy/errorfiles/500.http 
  42.         errorfile 502 /etc/haproxy/errorfiles/502.http 
  43.         errorfile 503 /etc/haproxy/errorfiles/503.http 
  44.         errorfile 504 /etc/haproxy/errorfiles/504.http 
  45.  
  46.         capture request  header Host           len 40 
  47.         capture request  header Content-Length len 10 
  48.         capture request  header Referer        len 200 
  49.         capture response header Server         len 40 
  50.         capture response header Content-Length len 10 
  51.         capture response header Cache-Control  len 8 
  52. listen  site_status 
  53.         bind 0.0.0.0:1081                     
  54.         mode http                             
  55.         log 127.0.0.1 local3 err              
  56.         monitor-uri /site_status              
  57.         acl site_dead nbsrv(server_web) lt 2  
  58.         monitor fail if site_dead 
  59.  
  60. frontend  http_80_in 
  61.         bind 0.0.0.0:80   
  62.         mode http         
  63.         log global        
  64.         option httplog   
  65.         option httpclose  
  66.         option forwardfor 
  67.         acl itnihao_web hdr_reg(host) -i ^(www.itnihao.cn|ww1.itnihao.cn)$ 
  68.         acl itnihao_blog hdr_dom(host) -i blog.itnihao.cn 
  69.         use_backend  server_web  if itnihao_web 
  70.         use_backend  server_blog if itnihao_blog 
  71.         default_backend server_bbs 
  72.  
  73. backend server_web 
  74.         mode http           
  75.         balance roundrobin  
  76.         cookie SERVERID     
  77.         option httpchk GET /index.html 
  78.         server web1 192.168.16.2:80 cookie web1 check inter 1500 rise 3 fall 3 weight 1 
  79.         server web2 192.168.16.3:80 cookie web2 check inter 1500 rise 3 fall 3 weight 2 
  80.  
  81. backend server_bbs 
  82.         mode http          
  83.         balance roundrobin 
  84.         cookie SERVERID    
  85.         option httpchk GET /index.html 
  86.         server bbs1 192.168.16.2:80 cookie bbs1 check inter 1500 rise 3 fall 3 weight 1 
  87.         server bbs2 192.168.16.3:80 cookie bbs2 check inter 1500 rise 3 fall 3 weight 2 

客户端192.168.16.90访问http://ww1.itnihao.cn

Haproxy的日志如下,可以看到,负载均衡到web2web1上面去了

详细日志如下所示

Jul  2 04:09:19 localhost haproxy[30015]: 192.168.16.90:4329 [02/Jul/2012:04:09:19.876] http_80_in server_web/web2 31/0/10/0/44 200 271 - - ---- 0/0/0/0/0 0/0 "GET / HTTP/1.1"

Jul  2 04:09:19 localhost haproxy[30015]: 192.168.16.90:4329 [02/Jul/2012:04:09:19.876] http_80_in server_web/web2 31/0/10/0/44 200 271 - - ---- 0/0/0/0/0 0/0 "GET / HTTP/1.1"

Jul  2 04:09:19 localhost haproxy[30015]: 192.168.16.90:4329 [02/Jul/2012:04:09:19.876] http_80_in server_web/web2 31/0/10/0/44 200 271 - - ---- 0/0/0/0/0 0/0 "GET / HTTP/1.1"

Jul  2 04:09:19 localhost haproxy[30015]: 192.168.16.90:4329 [02/Jul/2012:04:09:19.876] http_80_in server_web/web2 31/0/10/0/44 200 271 - - ---- 0/0/0/0/0 0/0 "GET / HTTP/1.1"

Jul  2 04:09:19 localhost haproxy[30015]: 192.168.16.90:4329 [02/Jul/2012:04:09:19.876] http_80_in server_web/web2 31/0/10/0/44 200 271 - - ---- 0/0/0/0/0 0/0 "GET / HTTP/1.1"

Jul  2 04:09:19 localhost haproxy[30015]: 192.168.16.90:4329 [02/Jul/2012:04:09:19.876] http_80_in server_web/web2 31/0/10/0/44 200 271 - - ---- 0/0/0/0/0 0/0 "GET / HTTP/1.1"

Jul  2 04:09:22 localhost haproxy[30015]: 192.168.16.90:4330 [02/Jul/2012:04:09:21.985] http_80_in server_web/web1 6/0/35/27/70 200 271 - - ---- 0/0/0/0/0 0/0 "GET / HTTP/1.1"

Jul  2 04:09:22 localhost haproxy[30015]: 192.168.16.90:4330 [02/Jul/2012:04:09:21.985] http_80_in server_web/web1 6/0/35/27/70 200 271 - - ---- 0/0/0/0/0 0/0 "GET / HTTP/1.1"

Jul  2 04:09:22 localhost haproxy[30015]: 192.168.16.90:4330 [02/Jul/2012:04:09:21.985] http_80_in server_web/web1 6/0/35/27/70 200 271 - - ---- 0/0/0/0/0 0/0 "GET / HTTP/1.1"

Jul  2 04:09:22 localhost haproxy[30015]: 192.168.16.90:4330 [02/Jul/2012:04:09:21.985] http_80_in server_web/web1 6/0/35/27/70 200 271 - - ---- 0/0/0/0/0 0/0 "GET / HTTP/1.1"

Jul  2 04:09:22 localhost haproxy[30015]: 192.168.16.90:4330 [02/Jul/2012:04:09:21.985] http_80_in server_web/web1 6/0/35/27/70 200 271 - - ---- 0/0/0/0/0 0/0 "GET / HTTP/1.1"

Jul  2 04:09:22 localhost haproxy[30015]: 192.168.16.90:4330 [02/Jul/2012:04:09:21.985] http_80_in server_web/web1 6/0/35/27/70 200 271 - - ---- 0/0/0/0/0 0/0 "GET / HTTP/1.1"

haproxy 192.168.16.22上面抓包【勘误】

(2012-07-31修改此处,原文是“在web2上面抓包”,其实下面的数据是在3台机器上面的,即haproxy,web1,web2上面抓包的结果分析

查看抓包数据如下

 客户端192.168.16.90首先向ww1.itnihao.cn(192.168.16.22)发送请求,haproxy代理服务器192.168.16.22收到请求,根据以下的配置文件的则,将请求用调度算法roundrobin转发给后端web2,即192.168.16.3

frontend  http_80_in

       bind 0.0.0.0:80   

       mode http         

       log global        

       option httplog    

       option httpclose  

       option forwardfor 

       acl  itnihao_web  hdr_reg(host)  -i  ^(www.itnihao.cn|ww1.itnihao.cn)$

       use_backend  server_web  if  itnihao_web   

backend server_web

       mode http

       balance roundrobin

       cookie SERVERID

       option httpchk GET /index.html 

       server  web1  192.168.16.2:80  cookie  web1 check inter 1500 rise 3 fall 3 weight 1

       server  web2  192.168.16.3:80  cookie  web2 check inter 1500 rise 3 fall 3 weight 2

可以看到,haproxy会将请求的www.itnihao.cn转发给192.168.16.3,且标记客户端的ip,如192.168.16.3有多个基于域名的虚拟主机,可以通过请求的域名来正确的识别到虚拟主机,这点无需担心

ip转发的选项是option forwardfor 转发过来的ip,如此,则端服务器可以获取到真实的客户端ip,

 192.168.16.3响应haproxy的请求,将数据index.html提供给haproxy192.168.16.22

 代理过程完成,192.168.16.22将index.html数据发送给用户端,用户端192.168.16.90完成此次的服务器请求,对用户来说是完全透明的。

同理,代理将请求转发给192.168.16.2,叙述过程不再重复,从抓包数据的结果可以看到

 以上内容为本人对haproxy的一些理解,如有误差,欢迎各位指正!

另外附录两篇对haproxy代码的分析链接

http://blog.csdn.net/chen_jianjian/article/details/7303909
haproxy工作流程分析
http://blog.csdn.net/chen_jianjian/article/details/7317758
haproxy初始化函数分析