设为首页 收藏本站
查看: 1301|回复: 0

[经验分享] haproxy (3)

[复制链接]

尚未签到

发表于 2019-1-1 09:34:39 | 显示全部楼层 |阅读模式
  3.17 option httplog
  

  option httplog [ clf ]
  

  启用记录HTTP请求、会话状态和计时器的功能。
  

  clf:使用CLF格式来代替HAProxy默认的HTTP格式,通常在使用仅支持CLF格式的特定日志分析器时才需要使用此格式。
  

  默认情况下,日志输入格式非常简陋,因为其仅包括源地址、目标地址和实例名称,而“option httplog”参数将会使得日志格式变得丰富许多,其通常包括但不限于HTTP请求、连接计时器、会话状态、连接数、捕获的首部及cookie、“frontend”、“backend”及服务器名称,当然也包括源地址和端口号等。
  

  3.18 option logasap
  no option logasap
  

  option logasap
  no option logasap
  

  启用或禁用提前将HTTP请求记入日志,不能用于“backend”区段。
  

  默认情况下,HTTP请求是在请求结束时进行记录以便能将其整体传输时长和字节数记入日志,由此,传较大的对象时,其记入日志的时长可能会略有延迟。“option logasap”参数能够在服务器发送complete首部时即时记录日志,只不过,此时将不记录整体传输时长和字节数。此情形下,捕获“Content-Length”响应首部来记录传输的字节数是一个较好选择。下面是一个例子。
  

  listen http_proxy 0.0.0.0:80
  mode http
  option httplog
  option logasap
  log 172.16.100.9 local2
  

  3.17 option httplog
  

  option httplog [ clf ]
  

  启用记录HTTP请求、会话状态和计时器的功能。
  

  clf:使用CLF格式来代替HAProxy默认的HTTP格式,通常在使用仅支持CLF格式的特定日志分析器时才需要使用此格式。
  

  默认情况下,日志输入格式非常简陋,因为其仅包括源地址、目标地址和实例名称,而“option httplog”参数将会使得日志格式变得丰富许多,其通常包括但不限于HTTP请求、连接计时器、会话状态、连接数、捕获的首部及cookie、“frontend”、“backend”及服务器名称,当然也包括源地址和端口号等。
  

  3.18 option logasap
  no option logasap
  

  option logasap
  no option logasap
  

  启用或禁用提前将HTTP请求记入日志,不能用于“backend”区段。
  

  默认情况下,HTTP请求是在请求结束时进行记录以便能将其整体传输时长和字节数记入日志,由此,传较大的对象时,其记入日志的时长可能会略有延迟。“option logasap”参数能够在服务器发送complete首部时即时记录日志,只不过,此时将不记录整体传输时长和字节数。此情形下,捕获“Content-Length”响应首部来记录传输的字节数是一个较好选择。下面是一个例子。
  

  listen http_proxy 0.0.0.0:80
  mode http
  option httplog
  option logasap
  log 172.16.100.9 local2
  

  3.20 errorfile
  

  errorfile  
  

  在用户请求不存在的页面时,返回一个页面文件给客户端而非由haproxy生成的错误代码;可用于所有段中。
  

  :指定对HTTP的哪些状态码返回指定的页面;这里可用的状态码有200、400、403、408、500、502、503和504;
  :指定用于响应的页面文件;
  

  例如:
  errorfile 400 /etc/haproxy/errorpages/400badreq.http
  errorfile 403 /etc/haproxy/errorpages/403forbid.http
  errorfile 503 /etc/haproxy/errorpages/503sorry.http
  

  3.21 errorloc 和 errorloc302
  

  errorloc  
  errorloc302  
  

  

  请求错误时,返回一个HTTP重定向至某URL的信息;可用于所有配置段中。
  

  :指定对HTTP的哪些状态码返回指定的页面;这里可用的状态码有200、400、403、408、500、502、503和504;
  :Location首部中指定的页面位置的具体路径,可以是在当前服务器上的页面的相对路径,也可以使用绝对路径;需要注意的是,如果URI自身错误时产生某特定状态码信息的话,有可能会导致循环定向;
  

  需要留意的是,这两个关键字都会返回302状态吗,这将使得客户端使用同样的HTTP方法获取指定的URL,对于非GET法的场景(如POST)来说会产生问题,因为返回客户的URL是不允许使用GET以外的其它方法的。如果的确有这种问题,可以使用errorloc303来返回303状态码给客户端。
  

  3.22 errorloc303
  

  errorloc303  
  

  请求错误时,返回一个HTTP重定向至某URL的信息给客户端;可用于所有配置段中。
  

  :指定对HTTP的哪些状态码返回指定的页面;这里可用的状态码有400、403、408、500、502、503和504;
  :Location首部中指定的页面位置的具体路径,可以是在当前服务器上的页面的相对路径,也可以使用绝对路径;需要注意的是,如果URI自身错误时产生某特定状态码信息的话,有可能会导致循环定向;
  

  例如:
  

  backend webserver
  server 172.16.100.6 172.16.100.6:80 check maxconn 3000 cookie srv01
  server 172.16.100.7 172.16.100.7:80 check maxconn 3000 cookie srv02
  errorloc 403 /etc/haproxy/errorpages/sorry.htm
  errorloc 503 /etc/haproxy/errorpages/sorry.htm
  

  timeout http-request
  面对客户端的UI大请求事件,默认是毫秒(单位可改)

  

  timeout queue
  让客户端等待队列最大的时间,一般超时返回503

  timeout connect
  不在队列的前提下,服务器响应过慢,服务器超时

  timeout client
  定义TCP超时时间,客户端tcp超时

timeout server
服务器与客户端建立tcp会话的超时时间


timeout http-keep-alive
保持连接的超时时间,客户端长连接一侧多长时间


timeout check
健康状态检测的超时




  

  

  cookie:启用后端服务器会话粘性的功能。目的是注重客户端的身份信息。haproxy如何篡改客户端和server发来的cookie。
  rewrite:重写,server提供新的cookie
  insert:server在响应用户名请求时,server附加cookie信息,haproxy内部插入haproxy认为要插入的信息

  prefix:在cookie上家前缀


  cookie功能:第一次会话,server生成随机cookie提供给客户使用,客户将cookie保存在自己的缓存中,后面访问server时,都会附加用户,会话标识。

  

  

  nocache:一旦由cookie,通知缓存服务器怒要缓存用户数据

  cookie的粘性设置
  [root@node200 ~]# vim /etc/haproxy/haproxy.cfg
  81 backend appsrvs
  82     balance     roundrobin
  83     option httpchk
  84     cookie SERVERID insert indirect nocache
  85     server  node2 192.168.112.130:80 check inter 2 rise 1 fall 3 cookie node2
  86     server  node3 192.168.112.140:80 check inter 2 rise 1 fall 3 cookie node3
  87 #    server  app3 127.0.0.1:5003 check
  88  #   server  app4 127.0.0.1:5004 check
  89 listen stats_pages
  90 bind *:9001
  91 stats enable
  92 stats uri /haproxyadmin?stats
  [root@node200 ~]# service haproxy restart
  停止 haproxy:                                             [确定]
  正在启动 haproxy:                                         [确定]

  

  

  option forwordfor:后端服务器知道那个客户端过来请求,使用日志查看,通过x-forward-for。在haproxy上附加客户端的IP地址,结果haproxy,封装后给后端服务器。

  [root@node200 ~]# vim /etc/haproxy/haproxy.cfg
   73 backend appsrvs
  74     balance     roundrobin
  75     mode http
  76    # option httpchk
  77    # cookie SERVERID insert indirect nocache
  78     server  node2 192.168.112.130:80 check
  79     server  node3 192.168.112.140:80 check
  80     option forwardfor except 127.0.0.1(可以不写)
  


  [root@node2 ~]# vim /etc/httpd/conf/httpd.conf
  LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
  [root@node2 ~]# service httpd reload
  重新载入 httpd:

  [root@node2 ~]# tail /var/log/httpd/access_log

  192.168.112.200 - - "GET / HTTP/1.1" 200 16 "-" "Mozilla/5.0 (X11; Linux
  192.168.112.200 - - "GET / HTTP/1.1" 200 16 "-" "Mozilla/5.0 (X11; Linux
  192.168.112.200 - - "GET / HTTP/1.1" 200 16 "-" "Mozilla/5.0 (X11; Linux
  192.168.112.1 - - "GET / HTTP/1.1" 200 16 "-" "Mozilla/5.0 (Windows NT 6
  192.168.112.1 - - "GET / HTTP/1.1" 200 16 "-" "Mozilla/5.0 (Windows NT 6
  192.168.112.1 - - "GET / HTTP/1.1" 200 16 "-" "Mozilla/5.0 (Windows NT 6
  192.168.112.1 - - "GET / HTTP/1.1" 200 16 "-" "Mozilla/5.0 (Windows NT 6
  192.168.112.1 - - "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 6.



  

  option http-server-close;no option http-server-close
  长连接超时,主动关闭服务器连接;
  注意:如果启用长连接,必须启动此选项
  

  option http-pretend-keeplived;no option http-pretend-keeplived
  haproxy通告webserver是否假装长连接,保持长连接;客户端一侧长连接,web端需要长连接。
  

  option httpclose;no option httpclose
  一般是第一次请求,haproxy分析并发送webserver,然后第二次haproxy不会检查,管道直接连接webserver(当粘性定位)。
  option httpclos:haproxy会对每个请求做作请求。首部:“connection:close”的时候会做检查。
  

  option redispatch;no option redispatch
  当连接发生错误时,是否需要重新会话调度。
  

  redirect

  URL重定向
  示例:acl secure dst_port 8080
  acl login_page url_beg /login
  acl secure dst_port 8080
  redirect prefix http://zye.com if login_page !secure(之间是与的关系)
  注意:acl相同属于“或”的关系。
  

  五 ACL
  

  haproxy的ACL用于实现基于请求报文的首部、响应报文的内容或其它的环境状态信息来做出转发决策,这大大增强了其配置弹性。其配置法则通常分为两步,首先去定义ACL,即定义一个测试条件,而后在条件得到满足时执行某特定的动作,如阻止请求或转发至某特定的后端。定义ACL的语法格式如下。
  

  acl   [flags] [operator]  ...
  

  :ACL名称,区分字符大小写,且其只能包含大小写字母、数字、-(连接线)、_(下划线)、.(点号)和:(冒号);haproxy中,acl可以重名,表示或关系,这可以把多个测试条件定义为一个共同的acl;
  :测试标准,即对什么信息发起测试;测试方式可以由[flags]指定的标志进行调整;而有些测试标准也可以需要为其在之前指定一个操作符[operator];
  [flags]:目前haproxy的acl支持的标志位有3个:
  -i:不区分中模式字符的大小写;
  -f:从指定的文件中加载模式;
  --:标志符的强制结束标记,在模式中的字符串像标记符时使用;
  :acl测试条件支持的值有以下四类:
  整数或整数范围:如1024:65535表示从1024至65535;仅支持使用正整数(如果出现类似小数的标识,其为通常为版本测试),且支持使用的操作符有5个,分别为eq、ge、gt、le和lt;
  字符串:支持使用“-i”以忽略字符大小写,支持使用“\”进行转义;如果在模式首部出现了-i,可以在其之前使用“--”标志位;
  正则表达式:其机制类同字符串匹配;
  IP地址及网络地址
  

  同一个acl中可以指定多个测试条件,这些测试条件需要由逻辑操作符指定其关系。条件间的组合测试关系有三种:“与”(默认即为与操作)、“或”(使用“||”操作符)以及“非”(使用“!”操作符)。
  

  5.1 常用的测试标准(criteria)
  

  5.1.1 be_sess_rate
  

  be_sess_rate(backend)
  

  用于测试指定的backend上会话创建的速率(即每秒创建的会话数)是否满足指定的条件;常用于在指定backend上的会话速率过高时将用户请求转发至另外的backend,或用于阻止ddos***行为。例如:
  

  backend dynamic
  mode http
  acl being_scanned be_sess_rate gt 50
  redirect location /error_pages/denied.html if being_scanned
  

  5.1.2 fe_sess_rate
  

  fe_sess_rate(frontend)
  

  用于测试指定的frontend(或当前frontend)上的会话创建速率是否满足指定的条件;常用于为frontend指定一个合理的会话创建速率的上限以防止服务被滥用。例如下面的例子限定入站邮件速率不能大于50封/秒,所有在此指定范围之外的请求都将被延时50毫秒。
  

  frontend mail
  bind :25
  mode tcp
  maxconn 500
  acl too_fast fe_sess_rate ge 500
  tcp-request inspect-delay 50ms(以50秒做TCP访问控制)
  tcp-request content accept if ! too_fast
  tcp-request content accept if WAIT_END
  标注:tcp-request:tcp层次中做访问控制
  

  5.1.3 hdr
  

  hdr(header)
  

  用于测试请求报文中的所有首部或指定首部是否满足指定的条件;指定首部时,其名称不区分大小写,且在括号“()”中不能有任何多余的空白字符。测试服务器端的响应报文时可以使用shdr()。例如下面的例子用于测试首部Connection的值是否为close。
  

  hdr(Connection) -i close
  

  5.1.4 method
  

  method
  

  测试HTTP请求报文中使用的方法。
  

  5.1.5 path_beg
  

  URL scheme://host:port/path/to/somewhere 中的 /path/to/somewhere
  

  用于测试请求的URL是否以指定的模式开头。下面的例子用于测试URL是否以/static、/images、/javascript或/stylesheets头。
  

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

  5.1.6 path_end
  

  用于测试请求的URL是否以指定的模式结尾。例如,下面的例子用户测试URL是否以jpg、gif、png、css或js结尾。
  

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

  

  5.1.7 hdr_beg
  

  用于测试请求报文的指定首部的开头部分是否符合指定的模式。例如,下面的例子用记测试请求是否为提供静态内容的主机img、video、download或ftp。
  

  acl host_static hdr_beg(host) -i img. video. download. ftp.
  

  5.1.8 hdr_end
  

  用于测试请求报文的指定首部的结尾部分是否符合指定的模式。例如,下面的例子用记测试请求是否为
  

  其它的creterion:
  dst_port, src_port, src, dst, url_beg, url_end, path, url_reg, path_reg
  动静分离

  [root@node200 ~]# vim /etc/haproxy/haproxy.cfg
  63 frontend  main
  64     bind *:80
  65      acl url_static       path_beg       -i /static /images /javascript /stylesheets
  66     acl url_static       path_end       -i .jpg .gif .png .css .js
  67 mode http
  68     use_backend static          if url_static
  69     default_backend             appsrvs
  70 #---------------------------------------------------------------------
  71 # static backend for serving up images, stylesheets and such
  72 #---------------------------------------------------------------------
  73 backend static
  74 balance roundrobin
  75 server static1 192.168.112.131 check
  76 server static2 192.168.112.120 check
  77
  78 backend appsrvs
  79     balance     roundrobin
  80     mode http
  81     option httpchk
  82     cookie SERVERID insert indirect nocache
  83     server  node2 192.168.112.130:80 check cookie node2
  84     server  node3 192.168.112.140:80 check cookie node3
  

  reqadd:客户端请求报文发送至后端服务器,在http尾部添加首部,目的时对后端服务器的日志,程序调用。
  reqadd  [{if|unless} ]
  acl is-ssl dst_port 81
  regadd X-proto:\ is ssl
  

  rsp [{if|unless} ]
  从后端服务器响应客户端时,在http添加首部在响应报文。
acl is-ssl dst_port 81
regadd X-proto:\ is ssl
  

  构建响应报文
  [root@node200 ~]# vim /etc/haproxy/haproxy.cfg
  63 frontend  main
  64     bind *:80
  65     rspadd X-Via:\ zye
  67 #     acl url_static       path_beg       -i /static /images /javascri    pt /stylesheets
  68 #    acl url_static       path_end       -i .jpg .gif .png .css .js
  69
  70 mode http
  71   #  use_backend static          if url_static
  72     default_backend             appsrvs
  73 #---------------------------------------------------------------------
  74 # static backend for serving up images, stylesheets and such
  75 #---------------------------------------------------------------------
  76 #backend static
  77 #balance roundrobin
  78 #server static1 192.168.112.131 check
  79 #server static2 192.168.112.120 check
  80

  

  

  配置案例
  

  1. http服务器配置示例
  

  #---------------------------------------------------------------------
  # Global settings
  #---------------------------------------------------------------------
  global
  # to have these messages end up in /var/log/haproxy.log you will
  # need to:
  #
  # 1) configure syslog to accept network log events.  This is done
  #    by adding the '-r' option to the SYSLOGD_OPTIONS in
  #    /etc/sysconfig/syslog
  #
  # 2) configure local2 events to go to the /var/log/haproxy.log
  #   file. A line like the following can be added to
  #   /etc/sysconfig/syslog
  #
  #    local2.*                       /var/log/haproxy.log
  #
  log         127.0.0.1 local2
  

  chroot      /var/lib/haproxy
  pidfile     /var/run/haproxy.pid
  maxconn     4000
  user        haproxy
  group       haproxy
  daemon
  

  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                 30000
  

  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-in
  bind *:80
  mode http
  log global
  option httpclose
  option logasap
  option dontlognull
  capture request  header Host len 20
  capture request  header Referer len 60
  default_backend servers
  

  frontend healthcheck
  bind :1099
  mode http
  option httpclose
  option forwardfor
  default_backend servers
  

  backend servers
  balance roundrobin
  server websrv1 192.168.10.11:80 check maxconn 2000
  server websrv2 192.168.10.12:80 check maxconn 2000
  

  

  2. 负载均衡MySQL服务的配置示例
  

  #---------------------------------------------------------------------
  # Global settings
  #---------------------------------------------------------------------
  global
  # to have these messages end up in /var/log/haproxy.log you will
  # need to:
  #
  # 1) configure syslog to accept network log events.  This is done
  #    by adding the '-r' option to the SYSLOGD_OPTIONS in
  #    /etc/sysconfig/syslog
  #
  # 2) configure local2 events to go to the /var/log/haproxy.log
  #   file. A line like the following can be added to
  #   /etc/sysconfig/syslog
  #
  #    local2.*                       /var/log/haproxy.log
  #
  log         127.0.0.1 local2
  

  chroot      /var/lib/haproxy
  pidfile     /var/run/haproxy.pid
  maxconn     4000
  user        haproxy
  group       haproxy
  daemon
  

  defaults
  mode                    tcp
  log                     global
  option                  httplog
  option                  dontlognull
  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                 600
  

  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 mysql
  bind *:3306
  mode tcp
  log global
  default_backend mysqlservers
  

  backend mysqlservers
  balance leastconn
  server dbsrv1 192.168.10.11:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300
  server dbsrv2 192.168.10.12:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300
  

  

  

  





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-658149-1-1.html 上篇帖子: HAproxy配置文件详解以及HAproxy的ACL详解 下篇帖子: Haproxy 使用攻略
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表