Linux学习-HaProxy代理后端Nginx

Linux学习-HaProxy代理后端Nginx,第1张

代理作用:web缓存(加速),反向代理、内容路由(根据流量及内容类型将请求转发至特定服务器),转码器 缓存作用:减少冗余内容传输,节省带宽、缓解网络瓶颈,降低对原始服务器压力,降低传输延迟 Haproxy: 适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作 评估负载均衡器的性能 会话率会话并发能力数据率 haproxy使用
#配置文件
#----------------------- 全局配置
#-------进程管理及安全相关参数
# - chroot 修改haproxy的工作目录至指定目录并放弃权限之前执行chroot() *** 作,可以提升haproxy的安全级别,不过要注意确保指定目录为空目录肯任何用户均不能有写权限
# - daemon:让haproxy以守护进行的方式工作于后台,其等同开【-D】选项功能,也可在命令行中以【-db】选项将其禁用
# - gid:指定的GID运行haproxy,建议使用专用于haproxy的GID,以免权限问题带来风险
# - group :同gid,指定用户组
# - log [max level [min level]]:定义全局的syslog服务器,最多可定义2个
# - log-send-hostname [
# - nbproc :指定启动的haproxy进程的个数,只用于守护进程模式的haproxy,默认只启动1个进程,鉴于调试困难等多方面原因,一般在单进程仅能打开少数文件描述符的场景中才使用多进程模式
# - pidfile:指定pid文件目录
# - uid:以指定的UID身份运行haproxy进程
# - ulimit -n:设定每进程所能够打开的最大文件描述符数目,默认情况下其会自动进行计算,不推荐修改此项
# - user:同uid,指定使用的用户名
# - stats:打开套接字,通过共享内存方式运行
# - node:定义当前节点的名称,用于HA场景中多haproxy进程共享同一IP地址
# - description:当前实例的描述信息 
#-------进程管理及安全相关参数
#-------性能调整相关参数
# - maxconn :设定每个haproxy进程所接受的最大并发连接数,等同于命令行选项"ulimit -n"
# - maxpipes :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 :设定检查缓冲区大小,单位字节,更大的值有助于在较大页面中完成基于字符串或模式的文本查找,但也会占用更多的系统资源,不建议修改
# - tune.bufsize :设置buffer的大小,同样内存条件下,较小的值可以让haproxy有能力接受更多的并发连接,较大的值可以让某些应用程序使用较大的cookie信息:默认16384,可以在编译时修改,强烈建议使用默认值
# - tune.maxaccept :设定haproxy进程内核调度运行时一次性可以接受的连接数量,较大的值可以带来较大的吞吐率,默认在单进程模式下为100,多进程模式下为8,设定-1可以禁止此限制,不建议修改
# - tune.maxpollevents :设定一次系统调用可以处理的事件最大数,默认取决于OS,其值小于200时可节约带宽,但会略微增大网络延迟,大于200时会降低延迟,会增加网络带宽的占用量
# - tune.maxrewrite :设定首部重写或追加而预留的缓冲空间,建议使用1024左右的大小,在需要使用更大空间时,haproxy会自动增加其值
# - tune.rvcbuf.client 
# - tune.rvcbuf.server :设定内核套接字中服务端或客户端接收缓冲的大小,单位为字节,强烈推荐使用默认值
#-------性能调整相关参数
#-------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:通过为URL指定的参数在每个HTTP GET请求中将会被检索,如找到了指定的参数且其通过等于号被赋予了一个值,那么此值将被执行hash运算并被服务器的总权重相除后派发至某匹配的服务器,此算法可以通过追踪请求中的用户标识进而确保同一个用户ID的请求将被送往同一个特定的服务器,除非服务器的总权重发生了变化,如果某请求中没有出现指定的参数或没有有效值,则使用轮叫算法对相应请求进行调度,此算法为静态的,不过可以使用hash-type修改此特性
# hdr():对于每个http请求,通过指定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.
# ----------------- 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 :定义用于将hash码映射至后端服务器的方法:不能用于frontend区段,可用方法map-based和consistent,在大多数场景中推荐使用默认的map-based方法
# map-based:hash表是一个包含了所有在线服务器的静态数组,其hash值将会非常平滑,会将权重考虑在列,但其为静态方法,对在线服务器的权重进行调整将不会生效,意味着其不支持慢速启动,此外挑选服务器是根据其在数组中的位置进行的,因此,当一台服务器宕机或添加一台新服务器时,大多数据连接将会被重新派发至一个与此前不同的服务器上,对于缓存服务器的工作场景来说,此方法不甚适用。
# consistent:hash表是一个由各服务器填充而成的树状结构,基于hash键在hash树中查找相应的服务器时,最近的服务器将被选中,此方法是动态的,支持在运行时修改服务器权重,因此兼容慢速启动的特性,添加一个新的服务器时,仅会对一小部分讲求产生影响,因此,尤其适用于后端服务器为cache服务器,不过,此算法不甚平滑,派发至各服务器的请求未必能达到理想的均衡效果,因此需要不是的调整服务器的权重以获得更好的均衡性。
# -----------------hash-type
#----------------------- 代理配置
#安装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 "`hostname`" >/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"

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/926333.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存