热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HAProxy配置文件详解

HAProxy的配置文件分为两个部份,第一部份为全局配置段(Globalsetting),第二部份为代理配置段(Proxies)。全局配置段设置haproxy运行工作的一些特性,这

  HAProxy的配置文件分为两个部份,第一部份为全局配置段(Global setting),第二部份为代理配置段(Proxies)。   全局配置段设置haproxy运行工作的一些特性,这一部份主要有与进程管理和安全相关的指令,与性能调整的指令和与调试相关的指令。而代理配置段又可以分为四个部份,一是"defaults ",这一部份设置的指令代表公共配置,即如果在后边的配置中没有显式的指定某个参数及值时,默认时就采用defaults中设置的值;二是"frontend ",这是定义一个面向客户端的配置,定义一系列监听的套接字,这些套接字可接受客户端请求并与之建立连接;三是"backednd ",这是定义上游服务器组,定义一系列“后端”服务器,代理将会将对应客户端的请求转发至这些服务器;四是"listen ",通过关联“前端”和“后端”定义了一个完整的代理,通常只对TCP流量有用,这是一个可以替代frontend和backend的指令,即可以把前端与后端都定义在一个listen中。所有代理的名称只能使用大写字母、小写字母、数字、-(中线)、_(下划线)、.(点号)和:(冒号),此外,ACL名称会区分字母大小写。

    下面对全局配置段中的部份指令作一个简单介绍:

与进程管理和安全相关的指令:

chroot

修改haproxy的工作目录至指定的目录并在放弃权限之前执行chroot()操作,可以提升haproxy的安全级别,不过需要注意的是要确保指定的目录为空目录且任何用户均不能有写权限;

daemon

让haproxy以守护进程的方式工作于后台,其等同于“-D”选项的功能,当然,也可以在命令行中以“-db”选项将其禁用;

gid

以指定的GID运行haproxy,建议使用专用于运行haproxy的GID,以免因权限问题带来风险;

group

同gid,不过指定的组名;

 log   [max level [min level]]

定义全局的syslog服务器,最多可以定义两个;

 log-send-hostname []

在syslog信息的首部添加当前主机名,可以为“string”指定的名称,也可以缺省使用当前主机名; 

 nbproc

指定启动的haproxy进程个数,只能用于守护进程模式的haproxy;默认只启动一个进程,鉴于调试困难等多方面的原因,一般只在单进程仅能打开少数文件描述符的场景中才使用多进程模式;

pidfile

pid文件路径;

uid

以指定的UID身份运行haproxy进程;

user

同uid ,只是这里指定的是用户名称;

ulimit-n

设定每进程所能够打开的最大文件描述符数目,默认情况下其会自动进行计算,因此不推荐修改此选项;

stats socket

定义统计信息保存位置

node

定义当前节点的名称,用于HA场景中多haproxy进程共享同一个IP地址时;

description

当前实例的描述信息。

这些与进程管理与安全相关的指令大多都不用指定,只作了解即可。


与性能调整相关的指令:

maxconn

设定每个haproxy进程所接受的最大并发连接数,其等同于命令行选项“-n”,在“进程管理与安全相关的指令”中的"“ulimit-n”的值会根据maxconn自动调整;

maxpipes

haproxy使用pipe完成基于内核的tcp报文重组,此选项则用于设定每进程所允许使用的最大pipe个数;每个pipe会打开两个文件描述符,因此,“ulimit -n”自动计算时会根据需要调大此值;默认为maxconn/4,其通常会显得过大;

noepoll

在Linux系统上禁用epoll机制;

nokqueue

在BSE系统上禁用kqueue机制;

nopoll

禁用poll机制;

nosepoll

在Linux禁用启发式epoll机制;

nosplice

禁止在Linux套接字上使用内核tcp重组,这会导致更多的recv/send系统调用;不过,在Linux 2.6.25-28系列的内核上,tcp重组功能有bug存在;

spread-checks <0..50, in percent>

在haproxy后端有着众多服务器的场景中,在精确的时间间隔后统一对众服务器进行健康状况检查可能会带来意外问题;此选项用于将其检查的时间间隔长度上增加或减小一定的随机时长,这是对健康检测的一种优化;

 tune.bufsize

设定buffer的大小,同样的内存条件小,较小的值可以让haproxy有能力接受更多的并发连接,较大的值可以让某些应用程序使用较大的COOKIE信息;默认为16384,其可以在编译时修改,不过强烈建议使用默认值;

tune.chksize

设定检查缓冲区的大小,单位为字节;更大的值有助于在较大的页面中完成基于字符串或模式的文本查找,但也会占用更多的系统资源;不建议修改;

tune.maxaccept

设定haproxy进程内核调度运行时一次性可以接受的连接的个数,较大的值可以带来较大的吞吐率,默认在单进程模式下为100,多进程模式下为8,设定为-1可以禁止此限制,一般不建议修改;

tune.maxpollevents  

设定一次系统调用可以处理的事件最大数,默认值取决于OS;其值小于200时可节约带宽,但会略微增大网络延迟,而大于200时会降低延迟,但会稍稍增加网络带宽的占用量;

tune.maxrewrite

设定为首部重写或追加而预留的缓冲空间,建议使用1024左右的大小;在需要使用更大的空间时,haproxy会自动增加其值;

tune.rcvbuf.client

定义在客户端内核套接字接收缓冲区的大小,单位为字节,建议不要调整此值;

tune.rcvbuf.server

设定内核套接字中服务端接收缓冲的大小,单位为字节;强烈推荐使用默认值;

tune.sndbuf.client

定义在客户端内核套接字发送缓冲区的大小,单位为字节,建议不要调整此值;

tune.sndbuf.server:

定义在服务端内核套接字发送缓冲区的大小,单位为字节,建议不要调整此值;

上边的这些指令大多也是作为了解即可,在实际中并不常会调整这些参数。


与调试相关的指令:

debug

在调度haproxy时可以启用此参数,但在生产环境不应该启用;

quiet

haproxy启动后不会显示任何相关信息,这与在命令行启动haproxy时加上参数“-q”相同

与代理相关的配置涉及太多,官方文档中用了一个章节来介绍,在各代理配置段的各个部份都有相应的可用指令,请参考http://cbonte.github.io/haproxy-dconv/configuration-1.4.html#4,这里我以一个配置文件实例来简单介绍。

[root@nod0 haproxy]# cat haproxy.cfg
#---------------------------------------------------------------------
# Example configuration for a possible web application.  See the
# full configuration options online.
#
#   http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
#
#---------------------------------------------------------------------
#---------------------------------------------------------------------
# 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
    #
#设置把haproxy的日志发往本地的rsyslog服务
    log         127.0.0.1 local2
#把haproxy进程限定在chroot指定的目录运行,此目录权限需要设定为除了haproxy用户有写权限限外其他的用户没有,并且是一个空目录
    chroot      /var/lib/haproxy
#pid文件的路径
    pidfile     /var/run/haproxy.pid
#设置proxy允许的最大并发连接数,如果在backend中没有指定server的maxconn的值,则可继承此值
    maxconn     4000
#运行haproxy的用户
    user        haproxy
#运行haproxy的组
    group       haproxy
#让haproxy以守护进程运行在后台
    daemon
    # turn on stats unix socket
#定义统计信息保存的位置
    stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the ‘listen‘ and ‘backend‘ sections will
# use if not designated in their block
#---------------------------------------------------------------------
#默认设置
defaults
#设置haproxy的运行模式,有三种{http|tcp|health}
    mode                    http
#设置日志继承全局配置段的设置
    log                     global
#表示开始打开记录http请求的日志功能,详细的应查看官方文档的的关键字矩阵部分
    option                  httplog
#如果产生了一个空连接,那这个空连接的日志将不会记录
    option                  dontlognull
#打开http协议中服务器端关闭功能,使得支持长连接,使得会话可以被重用,使得每一个日志记录都会被记录
    option http-server-close
#如果上游服务器上的应用程序想记录发起请求的客户端的IP地址,HAProxy会把客户端的IP信息发送给上游服务器,在HTTP请求中添加"X-Forwarded-For"字段,但当是haproxy自身的健康检测机制去访问上游服务器时是不应该把这样的访问日志记录到日志中的,所以用except来排除127.0.0.0,即haproxy身。
    option forwardfor       except 127.0.0.0/8
#当与上游服务器的会话失败(服务器故障或其他原因)时,把会话重新分发到其他健康的服务器上,当原来故障的服务器恢复时,会话又被定向到已恢复的服务器上。还可以用"retries"关键字来设定在判定会话失败时的尝试连接的次数,
    option                  redispatch
#当haproxy负载很高时,自动结束掉当前队列处理比较久的链接
    option    abortonclose
#向上游服务器尝试连接的最大次数,超过此值就认为后端服务器不可用
    retries                 3
#客户端发送http请求的超时时间
    timeout http-request    10s
#当上游服务器在高负载响应haproxy时,会把haproxy发送来的请求放进一个队列中,timeout queue定义放入这个队列的超时时间。
    timeout queue           1m
#haproxy与后端服务器连接超时时间,如果在同一个局域网可设置较小的时间
    timeout connect         5s
#定义客户端与haproxy连接后,数据传输完毕,不再有数据传输,即非活动连接的超时时间
    timeout client          1m
#定义haproxy与上游服务器非活动连接的超时时间
    timeout server          1m
#设置新的http请求连接建立的最大超时时间,时间较短时可以尽快释放出资源,节约资源
    timeout http-keep-alive 10s
#健康检测的时间的最大超时时间
    timeout check           10s
#最大并发连接数
    maxconn                 3000
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
#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
#######监控统计页面设置############
listen stats
#监听端口
    bind 0.0.0.0:1088
#日志设置,级别有[emerg  alert  crit   err    warning notice info  debug]
    log 127.0.0.1 local3 err
#启用统计报告,是一个默认的参数
    stats enable
#隐藏统计页面上haproxy的版本信息
    stats hide-version
#统计页面刷新时间
    stats refresh 10s
#进入统计页面密码框上的提示文字
    stats realm Haproxy\ Stats
#进入统计页面输入的用户名及密码
    stats auth admin:admin
#统计页面的登陆uri地址
    stats uri /admin?admin
#当统计页面打开后再打开对后端服务器的管理功能
    stats admin if TRUE
####frontend配置######
frontend server1_80_in
#绑定任何地址的80端口
    bind *:80
#haproxy以http的方式运行
    mode http
#定义两个能实现匹配静态文件的acl
    acl is_static path_beg -i /static /image /Javascript
    acl is_static path_end -i .html .png .jpg .gif .jpeg .css .js
#定义当匹配到is_static的acl后转发到static_servers这个后端服务器组
    use_backend  static_servers if is_static
#默认的转发规则
    default_backend app_servers
####backend配置#######
backend static_servers
#静态服务器组采用roundrobin算法
    balance roundrobin
#定义上游服务器及各个属性,对服务器每隔1500毫秒进行一次健康检测,如果连续3次无法联系服务器那就认为此服务器故障,如果连接连续检测到2次务都在线,那就认为此服务可用
    server nod2_static_192.168.0.202 192.168.0.202:80 minconn 10 maxconn 2000 check inter 1500 fastinter 1000 downinter 1000 rise 2 fall 3 weight 1
backend app_servers
#定义动态服务器的调度算法为source,并提供了hash-type参数,使source成为一个动态算法    
    balance source
    hash-type consistent
    server nod1_appserver_192.168.0.201 192.168.0.201:80 minconn 10 maxconn 200 check inter 1500 rise 3 fall 3 weight 1

这个配置文件实现了简单的动静分离的效果,各个配置行的意义都在配置文件中给出了注释。

参考资料:

马哥课堂笔记

http://cbonte.github.io/haproxy-dconv/configuration-1.4.html


本文出自 “专注运维,与Linux共舞” 博客,请务必保留此出处http://zhaochj.blog.51cto.com/368705/1659610

HAProxy配置文件详解


推荐阅读
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
author-avatar
伊人憔悴儡
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有