Linux学习-HaProxy代理后端Nginx

代理作用:web缓存(加速),反向代理、内容路由(根据流量及内容类型将请求转发至特定服务器),转码器
缓存作用:减少冗余内容传输,节省带宽、缓解网络瓶颈,降低对原始服务器压力,降低传输延迟
Haproxy:
  • 适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上
  • 实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作
评估负载均衡器的性能
  • 会话率
  • 会话并发能力
  • 数据率
haproxy使用
#配置文件
#----------------------- 全局配置
#-------进程管理及安全相关参数
# - chroot <jail dir>修改haproxy的工作目录至指定目录并放弃权限之前执行chroot()操作,可以提升haproxy的安全级别,不过要注意确保指定目录为空目录肯任何用户均不能有写权限
# - daemon:让haproxy以守护进行的方式工作于后台,其等同开【-D】选项功能,也可在命令行中以【-db】选项将其禁用
# - gid<number>:指定的GID运行haproxy,建议使用专用于haproxy的GID,以免权限问题带来风险
# - group <group name>:同gid,指定用户组
# - log <address><facility>[max level [min level]]:定义全局的syslog服务器,最多可定义2个
# - log-send-hostname [<string]:在syslog信息首部添加当前主机名,可以为“string”指定的名称,也可以缺省使用当前主机名
# - nbproc <number>:指定启动的haproxy进程的个数,只用于守护进程模式的haproxy,默认只启动1个进程,鉴于调试困难等多方面原因,一般在单进程仅能打开少数文件描述符的场景中才使用多进程模式
# - pidfile:指定pid文件目录
# - uid:以指定的UID身份运行haproxy进程
# - ulimit -n:设定每进程所能够打开的最大文件描述符数目,默认情况下其会自动进行计算,不推荐修改此项
# - user:同uid,指定使用的用户名
# - stats:打开套接字,通过共享内存方式运行
# - node:定义当前节点的名称,用于HA场景中多haproxy进程共享同一IP地址
# - description:当前实例的描述信息 
#-------进程管理及安全相关参数
#-------性能调整相关参数
# - maxconn <number>:设定每个haproxy进程所接受的最大并发连接数,等同于命令行选项"ulimit -n"
# - maxpipes <number>:haproxy使用pipe完成基于内核的tcp报文重组,此选项用于设定每进程所允许使用的最大pipe数,每个pipe会打开两个文件描述符,因此【ulimit -n】自动计算时会根据需要调大此值,默认为maxconn/4,通常会显得更大
# - noepoll:在Linux系统禁用epoll机制
# - nokqueue:在BSD系统禁用kqueue机制
# - nopoll:禁用poll机制
# - nosepoll:在Linux系统禁用启发式epoll机制
# - nosplice:禁止在Linux套接字上使用内核TCP重组,会导致更多的recv/send系统调用,在2.6.25-28系列的内核上,tcp重组有bug存在
# - spread-checks <0..50,in percent>:在haproxy后端有着众多服务器场景中,精确的时间间隔后统一对服务器进行健康检查可能会带来意外问题,此选项用于将其检查的时间间隔长度上增加或减少一定的随机时长
# - tune.chksize <number>:设定检查缓冲区大小,单位字节,更大的值有助于在较大页面中完成基于字符串或模式的文本查找,但也会占用更多的系统资源,不建议修改
# - tune.bufsize <number>:设置buffer的大小,同样内存条件下,较小的值可以让haproxy有能力接受更多的并发连接,较大的值可以让某些应用程序使用较大的cookie信息:默认16384,可以在编译时修改,强烈建议使用默认值
# - tune.maxaccept <number>:设定haproxy进程内核调度运行时一次性可以接受的连接数量,较大的值可以带来较大的吞吐率,默认在单进程模式下为100,多进程模式下为8,设定-1可以禁止此限制,不建议修改
# - tune.maxpollevents <number>:设定一次系统调用可以处理的事件最大数,默认取决于OS,其值小于200时可节约带宽,但会略微增大网络延迟,大于200时会降低延迟,会增加网络带宽的占用量
# - tune.maxrewrite <number>:设定首部重写或追加而预留的缓冲空间,建议使用1024左右的大小,在需要使用更大空间时,haproxy会自动增加其值
# - tune.rvcbuf.client <number>
# - tune.rvcbuf.server <number>:设定内核套接字中服务端或客户端接收缓冲的大小,单位为字节,强烈推荐使用默认值
#-------性能调整相关参数
#-------Debug相关参数
# - debug:打开debug
# - quiet:静默模式
#-------Debug相关参数
#----------------------- 全局配置
#----------------------- 代理配置
- defaults <name>:用于为所有其它配置段提供默认参数,配置默认配置参数可由下一个"defaults"重新设定
- frontend <name>:定义一系列监听的套接字,接受客户端请求并与之建立连接
- backend <name>:定义一系列后端服务器,代理将对应客户端请求转发至这些服务器
- listen <name>:通过关联“前端”和“后端”定义了一个完整的代理,通常只对TCP流量有用
# 注:所有代理的名称只能使用大写字母、小写字母、数字、-(中线)、_(下划线)、.(点号)、:(冒号),ACL名称会区分大小写
# ----------------- balance
# balance :指定调度算法
#    - 动态:权重可动态调整
#    - 静态:调整权重不会实时生效
# roundrobin:基于权重进行轮叫,在服务器处理时间保持均匀分布时,这是最平衡、最公平算法,此算法是动态的,表示其权重可在运行时进行调整,不过在设计上,每个后端服务器仅能最多接受4128个连接
# static-rr:基于权重进行轮叫,与roundrobin类似,但为静态方法,在运行时调整其服务器权重不会生效,不过,在后端服务器连接数上无限制
# leastconn:新的连接请求被派发至具有最少连接数目的后端服务器,在有着较长时间会话的场景中推荐使用此算法,如LDAP、SQL等,其并不适用于较重会话的应用层协议,如HTTP,此算法是动态的,可在运行时调整其权重
# source:将请求的源地址进行Hash运算,并由后端服务器的权重总数相除后派发至某匹配的服务器,可以使得同一个客户端IP的请求始终被派发至特定的服务器,不过,当服务器权重总数发生变化时(如服务器宕机或添加了服务器,许多客户请求可能会被派发至此前请求不同的服务器,常用于负载均衡无cookie功能的基于TCP的协议,默认为静态,不过可以使用hash-type修改此特性)
# uri:对URI的左半部分或整个URI进行hash运算,并由服务器的总权重相除后派发至某匹配服务器,可以使得同一个UrI的请求总是被派发至某特定服务器,除非服务器的权重总数发生了变化,此算法常用于代理缓存或反病毒代理以提高缓存的命中率,此算法仅应用于HTTP后端服务器场景,默认为静态算法,可以通过hash-type修改
# url_param:通过<argument>为URL指定的参数在每个HTTP GET请求中将会被检索,如找到了指定的参数且其通过等于号被赋予了一个值,那么此值将被执行hash运算并被服务器的总权重相除后派发至某匹配的服务器,此算法可以通过追踪请求中的用户标识进而确保同一个用户ID的请求将被送往同一个特定的服务器,除非服务器的总权重发生了变化,如果某请求中没有出现指定的参数或没有有效值,则使用轮叫算法对相应请求进行调度,此算法为静态的,不过可以使用hash-type修改此特性
# hdr(<name>):对于每个http请求,通过<name>指定HTTP首部将会被检索,如果相应首部没有出现或其没有有效值,则使用轮叫算法对相应讲求进行调度,其有一个可选项"use_domain_only",可在指定检索类似Host类的首部时仅计算域名部分(如通过www.tye.com,仅计算tye字符串的hash)以降低hash算法的运算量,此算法默认为静态,可通过hash-type修改此特性。
# rdp-cookie
# rdp-cookie(name)
# ----------------- balance
# ----------------- bind
bind [<address>]:<port_range>[,...]
bind [<address>]:<port_range>[,...] interface <interface>
#此指令用于frontend和listen区段,用于定义一个或几个监听的套接字
# <address>:可选选项,其可以为主机名、IP地址或*,省略此选项、将其指定为*或0.0.0.0时,将监听当前系统的所有IPV4地址
# <port_range>:可以是一个特定TCP端口,也可以是一个端口范围(如5005-5010),代理服务器通过指定的端口来接收客户端请求,每组监听的套接字#<address:port>在同一个实例上只能使用1次,而且小于1024的端口需要有特定权限的用户才可以使用,这需要通过uid参数来定义
# <interface>:指定物理接口的名称,仅能在linux系统上使用,不能使用接口别名,而仅能使用物理接口名称,而且只有管理有权限指定绑定的物理接口。
frontend  main
    bind *:80
    bind *:8080
    default_backend             websrvs
# ----------------- bind
# ----------------- mode
# mode {tcp|http|health}:设定实例的运行模式或协议,当实现内容交换时,前端和后端必须工作于同一种模式(一般HTTP模式),否则无法启动实例
# -tcp:运行于纯TCP模式,在客户端和服务器端之间将建立一个全双工的连接,且不会对7层报文做任何类型的检查,此为默认模式,通常用于SSL、SSH、SMTP等应用
# -http:运行于HTTP模式,客户端请求在转发至后端服务器之前将被深度分析,所有不与RFC格式兼容的请求都会被拒绝
# -health:工作于health模式,其对入站请求仅响应“OK”信息并关闭连接,且不会记录任何日志信息,此模式将用于响应外部组件的健康状态检查请求,此模式已废弃,因为tcp或http模式中的monitor关键字可完成类似功能。
# ----------------- mode
# -----------------hash-type
# hash-type <method>:定义用于将hash码映射至后端服务器的方法:不能用于frontend区段,可用方法map-based和consistent,在大多数场景中推荐使用默认的map-based方法
# map-based:hash表是一个包含了所有在线服务器的静态数组,其hash值将会非常平滑,会将权重考虑在列,但其为静态方法,对在线服务器的权重进行调整将不会生效,意味着其不支持慢速启动,此外挑选服务器是根据其在数组中的位置进行的,因此,当一台服务器宕机或添加一台新服务器时,大多数据连接将会被重新派发至一个与此前不同的服务器上,对于缓存服务器的工作场景来说,此方法不甚适用。
# consistent:hash表是一个由各服务器填充而成的树状结构,基于hash键在hash树中查找相应的服务器时,最近的服务器将被选中,此方法是动态的,支持在运行时修改服务器权重,因此兼容慢速启动的特性,添加一个新的服务器时,仅会对一小部分讲求产生影响,因此,尤其适用于后端服务器为cache服务器,不过,此算法不甚平滑,派发至各服务器的请求未必能达到理想的均衡效果,因此需要不是的调整服务器的权重以获得更好的均衡性。
# -----------------hash-type
# -----------------log
# log global
# log <address> <facility>[<level>[<minlevel>]]
# 为每个实例启用事件和流量日志,可用于所有区段,每个实例最多可以指定两个log参数,不过,如果使用了"log global"用global段已经定义了两个log参数时,多余的log参数将被忽略
# global:当前实例的日志系统参数同"global"段中的定义时,将使用此格式,每个实例仅能定义一次"log global"语句,且其没有任何额外参数
# <address>:定义日志发往的位置,其格式1:<ipv4_address:port>,其中port为UDP协议端口,默认为514;格式2:unix套接字文件路径,但需要留心chroot应用及用户的读写权限
# <facility>:可以为syslog系统的标准facility之一
# <level>:定义日志级别,即输出信息过滤器,默认为所有信息,指定级别时,所有等于或高于此级别的日志信息将被发送
# -----------------log
# -----------------maxconn
# maxconn <conns>:设定前端最大并发连接数,因此,不能用于backend区段,对于大于站点来说,可以尽可能提高此值以便让haproxy管理连接队列,从而避免无法应答用户请求,当然此最大值不有超出"global"段中的定义,此外,haproxy会为每个连接维护两个缓冲,每个缓冲大小8K,再加上其他数据,每个连接将大约占用17k的RAM空间,意味着经过适当优化后,1G的可用RAM将能维护40000-50000并发连接。
#注:如为<conns>指定了一个过大值,极端场景下,其最终占据的空间可能会超出当前主机的可用内存,可能会带来意想不到的结果,因此将其设定一个可接受值为明智决定,默认为2000
# -----------------maxconn
# -----------------default_backend
# default_backend <backend>:在没有匹配的"use_backend"规则时为实例指定使用默认后端,因此,不可应用于backend区段,在"frontend"和"backend"之间进行内容交换时,通常使用"use-backend"定义其匹配规则,而没有被规则匹配到的请求将由此参数指定的后端接收。
# <backend>:指定使用的后端名称
# 注:案例:
#----- use_backend   dynamic  if url_dyn
#----- use_backend   static   if url_css url_img extension_img
#----- default_backend dynamic
# -----------------default_backend
# -----------------server
# server <name> <address>[:port][param*]:为后端声明一个server,因此不能用于defaults和frontend区段
# <name>:为此服务器指定的内部名称,其将出现在日志及警告信息中,如果设定了"http-send-server-name"还将被添加至发往此服务器的请求首部中
# <address>:此服务器的IPV4地址,也支持使用可解析的主机名,只不过在启动时需要解析主机名至相应IPV4地址
# [:port]:指定将连接请求所发往的此服务器的目标端口,其为可选项,未设定时,使用客户端请求时的同一端口
# [param*]:为此服务器设定的一系列参数,其可用的参数非常多,以下说明几个常用参数
# 服务器或默认服务器参数
# -- backup:设定为备用服务器,仅在负载均衡场景中的其它server均不可用于启用此server
# -- check:启用对此server执行健康状态检查,其可以借助于额外的其它参数完成更精细的设定,如
#      -- inter<delay>:设定健康状态检查的时间间隔,单位为毫秒,默认2000,可以使用fastinter和downinter来根据服务器状态优化引时间延迟
#      -- rise<count>:设定健康检查中,某离线server从离线转换至正常状态需要成功检查的次数
#      --fall<count>:确认server从正常状态转换为不可用状态需要检查的次数
#      --cookie<value>:指定server设定cookie值,此处指定的值将在请求入站时被检查,第一次为此值挑选的server将在后续的请求中被选中,其目的在于实现持久连接的功能
#      --maxconn<maxconn>:指定服务器接受的最大并发连接数,如果发往此服务器的连接数目高于此处指定的值,其将被放置于请求队列,以等待其它连接被释放
#      --maxqueue<maxqueue>:设定请求队列的最大长度
#      --observe<mode>:通过观察服务器的通信状态来判断其健康状态,默认为禁用,其支持的类型"layer4"和"layer7","layer7"仅用于http代理场景
#      --redir<prefix>:启用重定向功能,将发往此服务器的GET和HEAD请求均以302状态码响应,需注意在prefix后面不能使用/,且不能使用相对地址,以免造成循环,如:server srv1 192.168.88.101:80 redir http://imageserver.tye.com check
#      --weight:权重,默认为1,最大值256,0表示不参与负载均衡
# -----------------server
# -----------------对后端server进行健康检测时选项
#检查方法:
option httpchk
option htpchk <uri>
option httpchk <method> <uri>
option httpchk <method> <uri> <version>:不能用于frontend段
backend https_relay
  mode tcp
  option httpchk OPTION * HTTP/1.1\r\nHost:\www.tye.com
  server nginx01 192.168.88.101:443 check port 80

#使用案例
server first 192.168.88.101:1080 cookie first check inter 1000
server first 192.168.88.102:1080 cookie second check inter 1000
# -----------------对后端server进行健康检测时选项
# -----------------启用状态页
# stats enable:启用基于程序编译时默认设置的统计报告,不能用于"frontend"区段,只要没有另外的设置,配置如下:
 - stats uri:/haproxy?stats
 - stats realm:"HAProxy Statistics"
 - stats auth:no authentication
 - stats scope:no restriction
#注:尽管"stats enable"一条就能够启用统计报告,但还建议设定其它所有的参数,以免其依赖于默认设定而带来非预期后果,配置案例如下:
backend public_www
  server websrv1 192.168.88.101:80
  stats enable
  stats hide-version
  stats scope .
  stats uri /haproxy?stats
  stats realm:"HAProxy Statistics"
  stats auth:statsadmin:password
  stats auth:statsmaster:password

# stats hide-version:启用统计报告并隐藏haproxy版本报告,不能用于"frontend"区段,默认情况下,统计页面会显示一些有用信息,包含haproxy版本号,向所有人公开haproxy版本号是有风险的,它能帮助恶意用户快速定位版本的缺陷和漏洞,尽管"stats hide-version"一条就
# -----------------启用状态页
# -----------------捕获请求首部
# capture request header <name> len <length>
# 捕获并记录指定的请求首部最近一次出现时的第一个值,仅能用于"frontend"和"listen"区段,捕获的首部值使用花括号{}括起来记录至日志中,如果需要捕获多个首部,它个将以指定的次序出现在日志中,并以竖线"|"作为分隔符,不存在的首部记录为空字符串,最需要捕获的首部包括在虚拟机环境中使用的"Host"、上传请求首部中的"Content-length"、快速区别真实用户和网络机器人的"User-Agent"以及代理环境中记录真实请求来源的"X-Forward-For"
# <name>:需要捕获的首部名称,此名称不区字符分大小写,建议与它们出现在首部中的格式相同,比如大写首字母,记录在日志的是首部对应的值,而非首部名称
# <length>:指定记录首部值时所记录的精确长度,超出部分将被忽略
# 注:可以捕获的请求首部的个数没有限制,但每个捕获最多只能记录64个字符,为保证同一个frontend日志格式统一性,首部捕获仅能在"frontend"中定义
# <length>
# -----------------捕获请求首部
# -----------------捕获响应首部
# capture response header <name> len <length>
# 捕获并记录响应首部,其格式和要点同请求首部
# -----------------捕获响应首部
# -----------------启用HTTP请求、会话状态和计时器
# option httplog [clf]:启用HTTP请求、会话状态和计时器
# clf:使用CLF格式来代替HAPROXY默认的HTTP格式,通常在使用仅支持CLF格式的特定日志分析器时才需要此格式
# 默认情况下,日志输入格式非常简陋,因为仅包含源地址、目标地址和实例名称,而"option httplog"参数将会使得日志格式变得丰富许多,通常包括但不限于HTTP请求、连接计时器、会话状态、连接数、捕获的首部及cookie、"frontend","backend"及服务器名称,也包含源地址和端口号等。
# -----------------启用HTTP请求、会话状态和计时器
# -----------------启用或禁用提前将HTTP请求写入日志,不能用于"backend"段
# option logasap
# no option logasap
# 默认情况下,HTTP请求是在请求结束时进行记录以便能将其整体传输时长和字节数写入日志,由此传输较大的对象时,其写入日志的时长可能会有延迟,"option logasap"参数能够在服务器发送complete首部时即时记录日志,只不过,此时将不记录整体传输时长和字节数,此情形下,捕获"Content-Length"响应首部来记录传输的字节数是一个较好选择。如下例
 listen http_proxy 0.0.0.0:80
     mode http
     option httplog
     option logasap
     log 192.168.88.114 local2
# -----------------启用或禁用提前将HTTP请求写入日志,不能用于"backend"段
# -----------------请求首部插入X-Forward-For首部
# option forwardfor [ except <network> ][header <name>][if-none]
# 允许在发住服务器的请求首部中插入“X-Forwarded-For”首部
# <network>:可选参数,指定源地址为匹配至此网络中的请求都禁用此功能
# <name>:可选参数,可使用一个自定义首部,如“X-Client”来替代"X-Forwarded-For",有些独特的web服务器需要用一个独特的首部
# if-none:仅在此首部不存在时才将其添加至请求报文首部中
# Haproxy工作于反向代理模式,其发往服务器的请求中的客户端IP均为Haproxy主机地址而非真正客户端地址,这会使得服务器端的日志信息记录不了真正的请求来源,"x-forwarded-for"首部则可用于解决此问题,haproxy可以向每个发往服务器的请求上添加此首部,并以客户端IP为其value.
#注:需要注意的是haproxy工作于隧道模式,其仅检查每一个连接的第一个请求,因此仅第一个请求报文被附加此首部,如果想为每一个请求都附加首部,请确保同时使用了"option httpclose"、"option forceclose"和"option http-server-close"几个option
# 例:
frontend www
    mode http
    option forwardfor except 127.0.0.1
# -----------------请求首部插入X-Forward-For首部
# -----------------用户请求不存在的页面时,返回错误代码
# errorfile <code><file>:在用户请求不存在的页面时,返回一个页面文件给客户端而非由haproxy生成的错误代码:可用于所有段中
# <code>:指定对HTTP的哪些状态码返回指定的页面,这里可用的状态码有200,400,403,408,500,502,503和504
# <file>:指定用于响应的页面文件
# 例:
errorfile 400 /etc/haproxy/errorpages/400badreq.http
errorfile 403 /etc/haproxy/errorpages/403forbid.http
errorfile 503 /etc/haproxy/errorpages/503sorry.http
# -----------------用户请求不存在的页面时,返回错误代码
# -----------------请求错误时,返回一个重定向至某URL的信息
# errorloc <code><url>
# errorloc302 <code><url>
# 请求错误时,返回一个HTTP重定向至某URL的信息,可用于所有配置段中
# <code>:指定对HTTP的哪些状态码返回指定的页面:这里可用的状态码有200,400,403,408,500,502,503,504
# <url>:Location首部中指定的页面位置的具体路径,可以是当前服务器上的页面的相对路径,也可以使用绝对路径,如果URI自身错误时产生某特定状态码信息的话,有可能会导致循环定向
# 注:这两个关键字都会返回302状态码,使客户端使用同样的HTTP方法获取指定的URL,对于非GET方法的场景(POST)来说会产生问题,因为返回客户的URL是不允许使用GET以外的其它方法的,如果确有这种问题,可以使用errorloc303来返回303状态码给客户端
# errorloc303 <code><url>
# 请求错误时,返回一个HTTP重定向至某URL的信息给客户端,可用于所有配置段中
# <code>:指定对HTTP的哪些状态码返回指定的页面:这里可用的状态码有200,400,403,408,500,502,503,504
# <url>:Location首部中指定的页面位置的具体路径,可以是当前服务器上的页面的相对路径,也可以使用绝对路径,如果URI自身错误时产生某特定状态码信息的话,有可能会导致循环定向
# 例:
backend websrvs
  server 192.168.88.101 192.168.88.101:80 check maxconn 3000 cookie srv01
  server 192.168.88.102 192.168.88.102:80 check maxconn 3000 cookie srv02
  errorloc 403 /etc/haproxy/errorpages/sorry.html
  errorloc 503 /etc/haproxy/errorpages/sorry.html
# -----------------请求错误时,返回一个重定向至某URL的信息
# -----------------http-server-close
option http-server-close
no option http-server-close
# 在服务器端启用和禁用http-server-close
# -----------------http-server-close
# -----------------http-pretend-keepalive
# option http-pretend-keepalive
# no option http-pretend-keepalive
# 定义haproxy是否向后端server宣称为连接状态
# 当运行"option http-server-close"或"option forceclose"时,haproxy向后端server发送请求时会添加"Connection:close"头
# 不幸的是,当后端server收到此header时,他们会自动避免对长度未知的响应使用分块编码,而这是完全无关的
# 当设置了"option http-pretend-keepalive"时,haproxy使server相信保持活动连接
# 不建议默认开启此项,很多servers都能在最后包到达后有效的关闭连接和更早的释放buffers
# -----------------http-pretend-keepalive
# -----------------httpclose
option httpclose
no option httpclose
# 启用和停用被动HTTP连接功能
# 1.默认情况下,当客户端连接服务器时,haproxy将仅分析、记录和处理每个连接的第一个请求
# 2.如设定“option httpclose”,将为校验"Connection:close"头是否设定,如没有,则添加
# 3.每次结束将对此作出反应,在每次传输后主动关闭TCP连接,从而切换到http关闭模式
# -----------------httpclose
# -----------------redispatch
option redispatch
no option redispatch
# 是否启用连接失败后session重新分配
# 1.在HTTP模式下,如果由cookie指定的服务器关闭,客户端肯定会坚持使用它,因为他们无法刷新cookie,因此他们将无法再访问该服务
# 2.指定"option redispatch"将允许代理中断持久性并重新分配他们至一个工作的服务器
# -----------------redispatch
# -----------------redirect
redirect location <to> [code <code>]<option>[{if|unless}<condition>]
redirect prefix <to> [code <code>]<option>[{if|unless}<condition>]
#当if/unless条件匹配时,返回一个HTTP重定向
# -----------------redirect
# -----------------reqadd
reqadd <string>[{if|unless}<cond>]
# 在HTTP请求首部的末尾添加一个头信息,在haproxy向后端服务器发送请求时添加
# <string>:添加完整的行,必须使用反斜杠转义任何空格或已知分隔符
# <cond>:是从ACL生成的可选匹配条件
# -----------------reqadd
# -----------------rspadd
rspadd <string>[{if|unless}<cond>]
# 在HTTP响应末尾添加头信息,在haproxy响应至client端时添加
# -----------------rspadd
# -----------------timeout
timeout http-request <timeout>
# 设定一个完整的HTTP请求所允许的最大等待时长,默认为毫秒,但如果数字以单位作为后缀,则可以使用任何其他单位,这将在无数据发送时有效的保护已经建立的连接
time connect <timeout>
# 设定与server建立连接的最大等待时长
timeout client <timeout>
# 当客户端不活动时的超时时长
timeout http-keep-alive <timeout>
# haproxy与客户端保持连接时长
timeout check <timeout>
# 定义额外的check超时时长
# -----------------timeout
# -----------------ACL
# ACL用于实现基于请求报文的首部、响应报文的内容或其它的环境状态信息来做出转发决策,这大大增强了其配置弹性,配置分为两步,首先定义ACL,即定义一个测试条件,而后在条件得到满足时执行某特定的动作,如阻止请求或转发至某特定的后端,语法如下:
acl <aclname> <criterion>[flags][operator]<value>...
# <aclname>:ACL名称,区分字符大小写,且其只能包含大小写字母、数字、-(连接线)、_(下划线)、.(点号)、:(冒号)
# <criterion>:测试标准,即对什么信息发起测试,测试方式可以由[flags]指定的标志进行调整,而有些测试标准也可以需要为其在<value>之前指定一个操作符[operator]
# [flags]:目前haproxy支持的标志位有3个
#   -i:不区分<value>中模式字符的大小写
#   -f:从指定的文件中加载模式
#   --:标志符的强制结束标记,在模式中的字符串像标记符时使用
# <value>:acl测试条件支持的值有以下四类:
#   1.整数或整数范围:如1024:65535表示从1024至65535,仅支持使用正整数,且支持使用的操作符有5个,分别为eq,ge,gt,le和lt
#   2.字符串:支持使用"-i"以忽略字符大小写,支持使用"\"进行转义,如果在模式首部出现了-i,可以在其之前使用"--"标志位
#   3.正则表达式:其机制类同字符串匹配
#   4.IP地址及网络地址
# 同一个ACL中可以指定多个测试条件,这些测试条件需要由逻辑操作符指定其关系,条件间的组合测试关系有三种“与&”默认操作,“或||”,“非!”
# 常用的测试标准(criteria)
#  be_sess_rate <integer>:
   be_sess_rate(backend)<integer>用于测试指定的backend上会话创建的速率(即每秒创建的会话数)
#   是否满足指定的条件:常用于指定backend上的会话速率过高时将用户请求转发至另外的backend,或用于阻止攻击行为,例:
backend dynamic
  mode http
  acl being_scanned be_sess_rate gt 50
  redirect location /error_pages/denied.html if being_scanned
#   fe_sess_rate <integer>
    fe_sess_rate(frontend) <integer>
#   用于测试指定的frontend上的会话创建速率是否满足指定的条件:常用于为frontend指定一个合适的会话创建速率的上限,以防止服务被滥用,如限定入站邮件速率不能大于50封/秒,在此指定范围之外的请求都将被延时50毫秒
frontend mail
  bind :25
  mode tcp
  maxconn 500
  acl too_fast fe_sess_rate ge 50
  tcp-request inspect-delay 50ms
  tcp-request content accept if ! too_fast
  tcp-request content accept if WAIT_END
#    hdr <string>
     hdr(header) <string>
#    用于测试请求报文中的所有首部或指定首部是否满足指定的条件,指定首部时,其名称不区分大小写,且在括号“()”中不能有任何多余的空白字符,测试服务器端的响应报文时可以使用shdr(),如下面例子用于测试首部Connetion的值是否为close
hdr(Connection) -i close
#    method <string>
#    用于测试HTTP请求报文中使用的方法
#    path_beg<string>
#    用于测试请求的URL是否以<string>指定的模式开头,下面的例子测试URL是否以/static,/images,/javascript,/stylesheets开头
acl url_static path_beg -i /static /images /javascript /stylesheets
#    path_end<string>
#    测试请求的URL是否以<string>指定的模式结尾,如下面例子测试URL是否以jpg,gif,png,css或js结尾
acl url_static path_end -i .jpg .gif .png .css .js
#    hdr_beg<string>
#    测试请求报文的指定首部的开头部分是否符合<string>指定的模式,例如,下面例子用于测试请求是否为提供静态内容的主机img,video,download或ftp.
acl host_static hdr_beg(host) -i img. video. download. ftp.
#    hdr_end <string>
#    测试请求报文指定首部的结尾部分是否符合<string>指定的模式。
#    动静分离示例:
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
  acl url_static path_beg -i /static /images /javascript /stylesheets
  acl url_static path_end -i .jpg .jpeg .gif .png .css .js
  use_backend static_srvs    if url_static
  default_backend dynamic_srvs
backend static_srvs
  balance roundrobin
  server imgsrv1 192.168.88.101:80 check maxconn 6000
  server imgsrv2 192.168.88.102:80 check maxconn 6000
backend dynamic_srvs
  cookie srv insert nocache
  balance roundrobin
  server websrv1 192.168.88.105:80 check maxconn 1000 cookie websrv1
  server websrv2 192.168.88.106:80 check maxconn 1000 cookie websrv2
# -----------------ACL
# -----------------ACL访问控制
# http-request {allow|deny|auth[realm<realm>]}[{if|unless} <condition>]
acl nagios src 192.168.88.1
acl local_net src 192.168.88.0/24
acl auth_ok http_auth(L1)
http-request allow if nagios
http-request allow if local_net auth_ok
http-request auth realm Gimmie if loal_net auth_ok
http-request deny
# tcp-request
# -----------------ACL访问控制
#----------------------- 代理配置
#安装haproxy
[root@repo ~]# yum install haproxy -y
#配置文件/etc/haproxy/haproxy.cfg
[root@repo ~]# vim /etc/haproxy/haproxy.cfg 
haproxy代理后端web服务器
#后端主机192.168.88.101,192.168.88.102,在两台主机上安装nginx,启动并测试
[root@nginx01 ~]# yum install nginx -y
#修改首页内容
[root@nginx01 ~]# echo "<h1>`hostname`</h1>" >/usr/share/nginx/html/index.html 
#启动nginx,测试
[root@nginx01 ~]# systemctl start nginx
[root@nginx01 ~]# curl 192.168.88.101
<h1>nginx01</h1>
#-------------修改haproxy配置文件
global
    #定义日志,需要在rsyslog配置文件中进行配置
    log         127.0.0.1 local2
    #以/var/lib/haproxy为根目录运行
    chroot      /var/lib/haproxy
    #pid文件
    pidfile     /var/run/haproxy.pid
    #最大连接数
    maxconn     4000
    #运行haproxy时使用的用户和组
    user        haproxy
    group       haproxy
    #以守护进程方式运行haproxy
    daemon
    #打开套接字,通过共享内存方式运行
    stats socket /var/lib/haproxy/stats
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                 3000
frontend  main *:80
    default_backend             websrvs
backend websrvs
    balance     roundrobin
    server      web1 192.168.88.101:80 check
    server      web2 192.168.88.102:80 check
#-------------修改haproxy配置文件
#启动nginx01和nginx02主机上nginx服务,测试代理情况
[root@repo ~]# curl 192.168.88.114
<h1>nginx02</h1>
[root@repo ~]# curl 192.168.88.114
<h1>nginx01</h1>
启用haproxy日志功能
#在/etc/rsyslog.conf配置文件中修改以下行
#将下面两行注释去掉
$ModLoad imudp
$UDPServerRun 514
#添加以下行
local2.*                                                /var/log/haproxy.log
#修改完成后,重新启动rsyslog服务,查看514端口是否监听
[root@repo ~]# netstat -unlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
udp        0      0 127.0.0.1:323           0.0.0.0:*                           893/chronyd         
**udp        0      0 0.0.0.0:514             0.0.0.0:*                           2552/rsyslogd**       
udp        0      0 0.0.0.0:622             0.0.0.0:*                           874/rpcbind         
udp        0      0 0.0.0.0:52196           0.0.0.0:*                           2164/haproxy        
udp        0      0 0.0.0.0:68              0.0.0.0:*                           2219/dhclient       
udp        0      0 0.0.0.0:111             0.0.0.0:*                           874/rpcbind         
udp6       0      0 ::1:323                 :::*                                893/chronyd         
**udp6       0      0 :::514                  :::*                                2552/rsyslogd**       
udp6       0      0 :::622                  :::*                                874/rpcbind         
udp6       0      0 :::111                  :::*                                874/rpcbind  
#访问haproxy,查看日志
[root@repo ~]# curl 192.168.88.114
<h1>nginx02</h1>
[root@repo ~]# curl 192.168.88.114
<h1>nginx01</h1>
[root@repo ~]# curl 192.168.88.114
<h1>nginx02</h1>
[root@repo ~]# curl 192.168.88.114
<h1>nginx01</h1>
[root@repo ~]# cat /var/log/haproxy.log 
May 15 10:55:39 localhost haproxy[2165]: 192.168.88.114:33766 [15/May/2022:10:55:39.897] main websrvs/web2 0/0/0/0/0 200 248 - - ---- 1/1/0/0/0 0/0 "GET / HTTP/1.1"
May 15 10:55:41 localhost haproxy[2165]: 192.168.88.114:33772 [15/May/2022:10:55:41.001] main websrvs/web1 0/0/0/1/1 200 248 - - ---- 1/1/0/0/0 0/0 "GET / HTTP/1.1"
May 15 10:55:41 localhost haproxy[2165]: 192.168.88.114:33778 [15/May/2022:10:55:41.617] main websrvs/web2 0/0/0/1/1 200 248 - - ---- 1/1/0/0/0 0/0 "GET / HTTP/1.1"
May 15 10:55:42 localhost haproxy[2165]: 192.168.88.114:33782 [15/May/2022:10:55:42.121] main websrvs/web1 0/0/0/0/0 200 248 - - ---- 1/1/0/0/0 0/0 "GET / HTTP/1.1"
使用uri算法将请求代理至后端server
#修改/etc/haproxy/haproxy.cfg配置文件,在backend下修改blance为uri,hash-type为consistent
backend websrvs
    balance     uri
    hash-type   consistent
    server      web1 192.168.88.101:80 check
    server      web2 192.168.88.102:80 check
#修改完成后,测试,无论通过哪台主机访问test1.html时都会代理至nginx01服务器上
[root@repo ~]# curl 192.168.88.114/test1.html
<h1>Page 1 on nginx01</h1>
[root@nginx01 ~]# curl 192.168.88.114/test1.html
<h1>Page 1 on nginx01</h1>
使用hdr算法将请求代理至后端server
#修改/etc/haproxy/haproxy.cfg配置文件,在backend下修改blance为uri,hash-type为consistent
backend websrvs
    balance     hdr(User-Agent)
    hash-type   consistent
    server      web1 192.168.88.101:80 check
    server      web2 192.168.88.102:80 check
#测试结果
[root@nginx01 ~]# curl 192.168.88.114/test1.html
<h1>Page 1 on nginx02</h1>
[root@nginx02 ~]# curl 192.168.88.114/test1.html
<h1>Page 1 on nginx02</h1>
[root@repo ~]# curl 192.168.88.114/test1.html
<h1>Page 1 on nginx02</h1>
基于浏览器实现会话绑定
#修改/etc/haproxy/haproxy.cfg配置文件,在backend下修改cookie为SESSIONID,并在server项下添加cookie设置
#注:每个server需要有惟一的cookie标识;在backend中定义为用户请求调度完成后操作其cookie
backend websrvs
    balance     roundrobin
    cookie      SESSIONID insert
    server      web1 192.168.88.101:80 check cookie web1
    server      web2 192.168.88.102:80 check cookie web2
启用stats功能
listen statistics
    bind *:9000
    stats       enable
    stats       hide-version

在这里插入图片描述

启用stats,并使用认证
listen statistics
    bind *:9000
    stats       enable
    stats       hide-version
    stats       uri /haproxyadmin?stats
    stats realm "HAproxy statistics"
    stats auth tye:123456
    #认证成功,启用admin功能
    stats admin if TRUE

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
haproxy可以用于代理FTP流量。要配置haproxy代理FTP,你需要在haproxy配置文件中添加相应的配置。以下是一个示例配置: ``` frontend ftp_frontend bind *:21 mode tcp option tcplog default_backend ftp_backend backend ftp_backend mode tcp option tcplog server ftp_server1 10.0.0.10:21 ``` 在这个配置中,我们创建了一个名为ftp_frontend的前端,绑定到21端口。我们使用TCP模式,并启用了TCP日志记录。默认后端是ftp_backend。 在ftp_backend后端中,我们同样使用了TCP模式和TCP日志记录选项。我们定义了一个FTP服务器的地址和端口,例如10.0.0.10:21。 这样配置后,当客户端连接到haproxy的21端口时,haproxy会将流量转发到指定的FTP服务器。 请注意,这只是一个示例配置,你可能需要根据你的实际情况进行调整。另外,你还需要确保haproxy已正确安装和配置,并且FTP服务器也已正确配置。 #### 引用[.reference_title] - *1* [iptables,haproxy转发ftp(21端口)](https://blog.csdn.net/weixin_33698823/article/details/89822800)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Linux学习-HaProxy代理后端Nginx](https://blog.csdn.net/xuwenpeng/article/details/124777968)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [haproxy FTP配置](https://blog.csdn.net/xuyouzheng/article/details/9818743)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值