ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

HAProxy负载均衡配置实战:安装、参数与高可用方案解析

HAProxy负载均衡配置实战:安装、参数与高可用方案解析 Haproxy 这东西我在生产环境里摸爬滚打了五六年从最开始拿它做单纯的四层TCP转发到后来把七层HTTP路由、ACL分流、会话保持、TLS卸载全堆在上面踩过的坑差不多都能写成一本书。很多朋友一开始接触它就觉得“这不就是个反向代理吗”真用起来才发现光是一堆配置参数就能把人绕晕。这篇博文就老老实实说一说Haproxy的安装过程和核心配置参数把我平时干活时验证过的方案直接摆出来方便你直接抄作业也顺便讲讲每个参数背后的道理。这篇内容适合谁看刚接触负载均衡的运维新手或者已经用Nginx做代理、想引入Haproxy做流量入口的开发者都能从中找到实用的东西。我先不废话直接进入正题。1. 整体思路拆解为什么选Haproxy而不是Nginx或LVS1.1 一条流量入口的自我修养做后端服务的人都会面临一个问题服务端多开几个实例之后用户的请求到底打到哪台机器上最简单的办法是DNS轮询但后端一台机器挂了DNS不会自动感知用户就会间歇性请求失败。所以我们需要一个“流量总管”它看得到每台后端服务器的健康状态能决定把请求分给谁还能在某一台机器挂掉的时候立刻把流量切走——这就是负载均衡器的核心价值。Haproxy、Nginx、LVS都能干这个活但在不同的场景下有各自的优势。我自己选择Haproxy主要是因为它在**四层代理TCP模式**上的表现非常稳定而且配置语言特别直观。Nginx更偏向七层HTTP处理像缓存、rewrite、gzip这些内容层的功能非常丰富但做TCP流量的通用转发时Haproxy的灵活性更高。LVS工作在内核态性能确实是王者级别但部署在网络层需要配合keepalived做虚拟IP配置门槛高日常调试也麻烦。所以我的通用选型结论是团队规模小、不想维护复杂VIP方案的优先用Haproxy做统一入口如果要处理大规模静态内容、要做HTTP缓存再在Haproxy后面加一层Nginx。Haproxy足够轻单进程就能抗住十万级并发连接足以应付大多数业务场景。1.2 Haproxy的核心工作模式Haproxy支持两种模式这也是配置时第一个要确定的点四层模式tcp模式只管建立TCP连接然后把字节流透明转发给后端的某一台服务器。它不关心上层协议是什么HTTP、MySQL、Redis、WebSocket只要走TCP就能代理。七层模式http模式能读懂HTTP协议可以依据域名、URL路径、请求头、Cookie来决定转发到哪个后端组还能做SSL卸载、内容改写等高级功能。打个不那么精确、但很好懂的比方四层模式像是快递公司的分拣员只看包裹上写的地址整包转给对应片区的派送员七层模式则像是业务客服会打开包裹看看里面是什么再根据物品特性决定转给哪个部门。理解了这两者的区别后面对配置参数的理解就顺了。下面从安装说起。2. Haproxy安装全过程实录2.1 环境准备与版本选择我推荐在Linux环境下部署HaproxyCentOS、Ubuntu、Debian都可以。选版本时不要盲目追新建议选择官方长期维护的稳定版本。写这篇内容时2.6和2.8系列是当前生产环境用得较多的版本如果你的系统比较老2.4也完全够用。先确认系统环境cat /etc/os-release uname -a安装之前检查一下依赖工具是否齐全。用源码编译时需要make和gcc用在线包管理器安装则不需要。我个人习惯用源码编译因为可以自定义编译参数比如开启Prometheus监控插件或者调整某些模块。生产环境图省事的话直接用包管理器安装也没问题二者选其一即可。2.2 源码编译安装完整流程从官网下载源码包以2.8版本为例cd /usr/local/src wget https://www.haproxy.org/download/2.8/src/haproxy-2.8.5.tar.gz tar xzf haproxy-2.8.5.tar.gz cd haproxy-2.8.5编译之前先看一下支持的编译选项make help实际编译时我一般这样指定make clean make -j $(nproc) \ TARGETlinux-glibc \ USE_OPENSSL1 \ USE_PCRE1 \ USE_SYSTEMD1 \ USE_PROMEX1参数说明编译选项作用TARGETlinux-glibc指定目标平台基于glibc的Linux系统用这个USE_OPENSSL1启用SSL/TLS支持做HTTPS代理必备USE_PCRE1启用正则表达式支持ACL配置里用正则时必须开USE_SYSTEMD1生成systemd集成支持方便用systemctl管理USE_PROMEX1启用Prometheus监控指标输出2.4版本后可用TARGET这个参数特别容易踩坑老版本里面用TARGETlinux2628来指定内核版本新版本已经弃用直接用linux-glibc就能通吃主流发行版。如果你的系统是CentOS 6那种老古董可能会需要linux-glibc加额外的兼容设置这种情况我建议干脆用包管理器安装更好。编译完成后安装到指定目录make install PREFIX/usr/local/haproxy安装完检查一下版本/usr/local/haproxy/sbin/haproxy -v2.3 用系统包管理器快速安装如果不想折腾编译用包管理器非常快。CentOS/RHEL系列yum install -y haproxyUbuntu/Debian系列apt update apt install -y haproxy但用包管理器装的版本可能不是最新版。CentOS 7默认仓库里是1.5版本很多新特性没有例如http-check send这类语法就不同。这种情况可以添加官方仓库或使用第三方仓库。我自己的建议是内网测试环境随便装生产环境最好用源码编译固定版本避免yum源一更新就出现行为变化。2.4 systemd启动与开机自启设计源码编译安装后Haproxy不会自动注册systemd服务需要自己写服务文件。在/etc/systemd/system/haproxy.service新建如下内容[Unit] DescriptionHAProxy Load Balancer Afternetwork-online.target Wantsnetwork-online.target [Service] ExecStartPre/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c ExecStart/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg -D ExecReload/bin/kill -USR2 $MAINPID Restartalways RestartSec5 LimitNOFILE1048576 [Install] WantedBymulti-user.target这里有三个细节值得注意ExecStartPre里加了-c参数它会在启动前先对配置做一次语法检查配置写错了服务根本起不来会直接报错。这个习惯能救命特别是在线上reload之前。ExecReload用的是USR2信号做“无缝重载”。Haproxy对存量连接的处理很优雅旧进程继续处理已有连接新连接交给新进程基本无感知。LimitNOFILE这个参数一定要调大否则连接数一高就会报“Too many open files”。软限制最好也通过全局配置的ulimit-n同步调整。然后启动并设置开机自启systemctl daemon-reload systemctl enable haproxy systemctl start haproxy3. 配置参数详解与应用要点3.1 配置文件结构先看骨架Haproxy的配置不是随手写的它有明确的逻辑分层。一个标准配置文件由四大部分组成global # 全局级配置进程级别参数 defaults # 默认配置会被frontend/backend继承 frontend main # 前端入口监听客户端请求 backend web_servers # 后端服务器组定义真实服务器列表另外还有一个listen类型的配置块它是frontendbackend的合体适用于简单的TCP转发场景listen mysql_proxy bind :3306 mode tcp balance roundrobin server db1 192.168.1.10:3306 check用listen写简短的端口转发非常方便但架构复杂之后还是拆成frontend和backend更利于维护。你可以把frontend理解为“门卫处”负责接收访客、根据访客身份引导到不同的楼层把backend理解为“各楼层的接待室”知道具体有哪些员工在岗以及他们的健康状态。3.2 global段进程级别参数详解global段中最常用的一组参数我通常这样配置global maxconn 100000 ulimit-n 200000 nbproc 1 nbthread 4 cpu-map auto 1-4 0-3 log /var/log/haproxy.log local0 info chroot /var/lib/haproxy user haproxy group haproxy daemon stats socket /var/lib/haproxy/stats mode 600 level admin ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384 ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11挑几个关键参数展开说maxconn是单进程能接受的最大并发连接数。这个值不是随便填的填大了如果系统文件句柄不够反而会出问题。Linux系统层面每个进程默认打开文件数有限必须同步调高。ulimit-n建议设置成maxconn的两倍左右。为什么是两倍因为每个连接不只是占用一个socket如果开启日志、缓冲区分配等实际open fd数会大于连接数保守起见翻倍搞。nbproc与nbthread。老版本的Haproxy用nbproc开多进程但多进程带来的问题是每个进程各自维护连接和统计排障很痛苦。新版本更推荐单进程配合多线程。我的配置是nbproc 1、nbthread 4也就是单进程开4个线程配合cpu-map把线程绑定到不同CPU核心上这样的性能表现已经非常好了。stats socket是Unix Socket用于运行时动态调整。通过这个socket可以启用或禁用后端的某台服务器不需要reload配置文件。执行方式echo show servers state | socat stdio /var/lib/haproxy/stats echo disable server web_servers/web1 | socat stdio /var/lib/haproxy/statschroot是安全选项把进程锁在指定目录里即使被攻破也不能访问系统其他路径。设置chroot后要确保该目录存在且haproxy用户有写入权限。3.3 defaults段超时参数如何定defaults段定义了一组继承属性。除非在frontend或backend中覆盖否则所有配置块都会沿用这里面的值。看一组经典配置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 5s timeout connect 5s timeout client 30s timeout server 30s timeout http-keep-alive 10s timeout check 5s maxconn 50000超时时间这里非常有讲究长了会让系统堆积大量僵尸连接短了会让正常的慢请求被误杀。我遇到过两次线上事故都是超时时间没调好。一次是timeout server设得太短后端一个报表接口正常耗时40秒结果30秒就被掐断用户端疯狂报错另一次是timeout client设得太长大量恶意连接占满连接池。工程上一个经验范围是timeout connect内网服务一般3-5秒足够跨机房的话适当加到10秒timeout client和timeout server普通的HTTP接口给30秒如果是文件上传接口建议调到300秒以上如果是WebSocket长连接直接用timeout tunnel单独控制timeout http-keep-alive保持长连接的时间通常5-10秒option redispatch值得单独提一下。当后端服务器返回503或者连接断开时如果启用了option redispatchHaproxy会尝试把请求重新分给其他健康的服务器。这在会话保持场景下有一定风险因为重新派发可能打破会话一致性需要结合Cookie的会话粘性来权衡。但如果不开启后端某台机器突然重启正在往它发请求的用户就只能看到错误页面了。3.4 后端均衡算法选型这是配置里我最想划重点的部分。Haproxy支持多种负载均衡算法选对了算法系统性能才能发挥出来。几类常用算法如下算法特点适合场景roundrobin轮流分配权重生效后端机器配置差异不大时leastconn连接数少的优先长连接场景例如数据库连接池、WebSocketsource对客户端IP做哈希需要保持同一IP始终打到同一台机器时uri对URI做哈希缓存命中友好的场景hdr对指定请求头做哈希按用户ID或设备ID做会话保持first优先填充第一台满了再到下一台特殊场景比如需要把空闲机器优先跑起来我举一个最典型的悲伤案例有个朋友做即时通讯服务网关用了最简单的roundrobin结果连接一多有的后端机器被压得CPU告警有的还很空闲。问题在于WebSocket是长连接轮询算法只在新连接建立时做分配长连接建立后就不会再变了导致连接数分布不均匀。改成leastconn后新连接会优先落到连接数最少的机器上局面立刻缓解。对于HTTP短请求服务roundrobin基本够用。但有一个很重要的前提后端服务器的处理能力要大致相当。如果一台老机器和一台新机器混用要给老机器设置较小的权重server web_old 192.168.1.8:8080 weight 1 check server web_new 192.168.1.9:8080 weight 4 check3.5 健康检查参数fall、rise、inter的工程取值健康检查是Haproxy自动摘除故障服务器的关键。每个server后面的check参数就是开启检查而inter、fall、rise这三个参数定义了检查的频率和判定阈值。server web1 192.168.1.10:8080 check inter 3s fall 3 rise 2inter每间隔多少秒检查一次fall连续失败多少次判定服务器为“down”rise连续成功多少次从“down”恢复为“up”这三个参数之间有联动关系。inter 3s fall 3意味着在3秒 × 3 9秒内连续失败才能确认宕机。如果inter设成10秒、fall设成5那么故障发现时间就是整整50秒这个时间窗口内用户请求会持续打向故障机器。生产环境下我建议inter 2s、fall 3这样可以大致在6秒内感知故障。但在频繁抖动场景下fall太小又会造成误判。比如后端机器GC暂停时间超过2秒会被误认为挂了请求被导走恢复后又导回来反而引发不稳定。如果你不了解后端应用的GC停顿特征建议把fall至少设置为3。HTTP模式下还可以做更精细的业务层检查server web1 192.168.1.10:8080 check inter 3s fall 3 rise 2 http-check expect status 200 http-check send meth GET uri /healthcheck让后端提供一个专门的健康检查接口比如/healthcheck返回200这个接口里最好同步检查数据库连接池、缓存等核心依赖。这样就不只是“进程活着”而是“业务可用”。3.6 会话保持的两种实现方式很多应用需要同一个用户始终访问同一台后端服务器比如用户登录状态存在本地Session里。Haproxy实现会话保持有两条路第一基于Cookie的会话粘性。这是HTTP模式下的推荐做法。Haproxy会给客户端种一个Cookie记录它被分配给了哪台后端服务器backend web_servers balance roundrobin cookie SERVERID insert indirect nocache server web1 192.168.1.10:8080 cookie web1 check server web2 192.168.1.11:8080 cookie web2 check核心参数是insert indirect nocache。insert表示如果客户端没带Cookie就插入一个indirect表示如果客户端已经带了别的同名Cookie则不主动覆盖nocache表示告诉中间缓存设备不要缓存带Cookie的响应。如果后端某台机器挂了由于请求会重新分配Cookie对应的机器不在了用户会丢失会话这时候可以加上option redispatch配合处理。第二基于source的IP哈希。适用于TCP层或者不方便操作Cookie的场景backend mysql_servers mode tcp balance source hash-type consistent server db1 192.168.1.20:3306 check server db2 192.168.1.21:3306 checkhash-type consistent启用一致性哈希在新增或移除后端机器时只有极少比例的客户端映射会改变对缓存类服务特别有意义。3.7 自定义错误页与状态码处理默认情况下后端全部宕机时Haproxy会返回一个简单错误页。在面向用户的场景下这个错误页实在不够友好。可以自定义错误页面backend web_servers errorfile 503 /etc/haproxy/errors/503.http errorfile 502 /etc/haproxy/errors/502.http errorfile 504 /etc/haproxy/errors/504.httperrorfile后面的HTTP文件有特定格式要求必须是完整的HTTP响应头加消息体。例如503页面HTTP/1.1 503 Service Unavailable Content-Type: text/html; charsetUTF-8 Cache-Control: no-cache Connection: close html body h1系统维护中请稍后重试/h1 /body /html注意HTTP文件里响应头结束后要有一个空行否则Haproxy解析不了。这是一个很隐蔽的坑我第一次配置时折腾了很久才发现是空行问题。3.8 统计页与日志配置Haproxy自带的统计页面非常好用通过stats enable开启frontend stats bind *:8404 stats enable stats uri /stats stats refresh 5s stats realm Haproxy\ Statistics stats auth admin:your_password stats admin if LOCALHOST这张页面能实时看到每台后端服务器的状态UP/DOWN、当前连接数、会话速率、队列长度、流量趋势等关键指标。我个人每排查问题必先打开这个页面看状态比什么监控都直观。注意stats admin if LOCALHOST限制了只能在服务器本机执行管理操作避免远程误点。日志方面Haproxy默认通过syslog输出。在系统层面配置好rsyslog接收后配置里这样写global log /dev/log local0 info defaults log global option httplogoption httplog会把每个HTTP请求的详细访问日志记录下来包括源IP、请求时间、后端响应时间、后端服务器名称等排障时价值极大。启动排障模式还可以用option log-health-checks开启后健康检查的成功/失败也会写日志但这个日志量很大排障期结束后建议关掉。4. 一个典型的高可用负载均衡配置案例4.1 场景描述与需求拆解假设有一个在线商城系统架构如下前端只有一个公网入口需要对外提供HTTPS服务后端有3台Web服务器跑NginxPHP监听8080端口3台机器之间有一个全量同步的Session共享机制所以不需要Cookie会话保持可以自由轮询希望用户请求按照不同的路径分流/api/开头的请求转到API服务组其他请求转到Web服务组需要统计实时流量希望能在监控系统里看到Haproxy自身指标4.2 完整配置示例与逐段解释下面是实现这个需求的完整配置我加了适量注释global maxconn 50000 ulimit-n 100000 nbproc 1 nbthread 4 log /dev/log local0 info user haproxy group haproxy daemon stats socket /var/lib/haproxy/stats mode 600 level admin defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor option redispatch retries 3 timeout http-request 10s timeout connect 5s timeout client 60s timeout server 60s timeout http-keep-alive 10s timeout check 5s # 前端入口接收HTTPS流量并做SSL卸载 frontend web_frontend bind :80 bind :443 ssl crt /etc/haproxy/certs/example.com.pem http-request redirect scheme https unless { ssl_fc } default_backend web_servers # 根据URL路径分流API请求走单独的后端组 use_backend api_servers if { path_beg /api/ } # Web后端组 backend web_servers balance roundrobin option httpchk GET /healthcheck http-check expect status 200 server web1 192.168.1.10:8080 weight 4 check inter 3s fall 3 rise 2 server web2 192.168.1.11:8080 weight 4 check inter 3s fall 3 rise 2 server web3 192.168.1.12:8080 weight 2 check inter 3s fall 3 rise 2 # API后端组 backend api_servers balance leastconn option httpchk GET /api/healthcheck http-check expect status 200 server api1 192.168.1.20:8080 weight 4 check inter 2s fall 3 rise 2 server api2 192.168.1.21:8080 weight 4 check inter 2s fall 3 rise 2前端部分的逻辑拆解bind :80和bind :443 ssl crt让Haproxy同时监听80和443端口。crt后面指定的是PEM格式的证书文件同时包含证书和私钥用cat example.crt example.key example.com.pem可以生成。http-request redirect scheme https unless { ssl_fc }的意思很直白如果当前请求不是HTTPSssl_fc即“SSL已建立连接”的标志未命中就强制跳转到HTTPS。use_backend api_servers if { path_beg /api/ }表示当URL的路径以/api/开头时分流到api_servers。注意这行和default_backend的顺序use_backend是优先匹配的不匹配才落到default_backend。后端的HTTP健康检查配置里option httpchk GET /healthcheck会向每台服务器的/healthcheck路径发起GET请求返回的HTTP状态码必须匹配http-check expect status 200才算健康。API组的检查间隔设成了2秒比Web组的3秒短原因是API服务的故障影响面更大需要更快感知。4.3 配置文件校验与热加载配置写完之后一定先做语法检查/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c看到Configuration file is valid就说明语法没问题。这里要强调语法检查通过不代表逻辑一定正确只能说明没有拼写和结构性问题。真正验证逻辑的办法是看统计页面上后端服务器是否都变成了UP。验证通过后用systemd热加载配置systemctl reload haproxyHaproxy的热加载不中断现有连接它的工作方式是新起一个进程加载新配置监听相同的端口并接收新连接旧进程继续服务已有连接直到全部断开。这个过程对用户几乎无感知可以放心在线上操作。4.4 压测与验证过程配置生效后我用wrk或curl验证一下实际转发效果# 查看统计页是否正常 curl http://127.0.0.1:8404/stats # 测试强制跳转HTTPS curl -I http://192.168.1.100 # 测试API路径分流 curl -H Host: shop.example.com http://192.168.1.100/api/user/info # 用wrk做一次基础压测 wrk -t4 -c200 -d60s http://127.0.0.1:80/压测时重点关注的不是每秒请求数这个峰值数据而是看错误率和连接建立时间是否稳定。如果压测过程中出现大量timeout需要回看timeout connect和timeout server的取值也要看后端服务器的实际处理能力。很多人上来就喷Haproxy性能不行一查是后端应用线程池满了属于被后端拖累。另外在压测前建议把系统参数也调一下sysctl -w net.core.somaxconn65535 sysctl -w net.ipv4.ip_local_port_range1024 65535 sysctl -w net.ipv4.tcp_max_syn_backlog65535net.core.somaxconn控制的是每个监听端口上等待accept的TCP连接队列长度。高并发场景下如果这个值太小连接会在内核里排队超时而失败日志里会出现大量“connection reset by peer”。这个参数不是Haproxy配置能覆盖的必须要在系统层调大。5. 常见问题与排查技巧实录5.1 高频故障速查表现象可能原因排查/解决配置检查报错 “No enabled listener found”bind语法错误或端口被占用检查bind行用ss -lntp确认端口占用启动失败且日志无输出chroot目录不存在或无权限提前创建目录并chown给haproxy用户压测请求大量503健康检查失败后端被标记down查看统计页后端状态curl后端健康检查接口确认后端已恢复但流量仍不进入rise值过大恢复判定耗时太长调小rise至2加快恢复确认HTTP请求的客户端真实IP全是代理IP未配置option forwardfor开启后后端用X-Forwarded-For取真实IP网页加载极慢后端CPU未跑满超时设置太长导致连接堆积调低timeout server和timeout client并观察连接数reload后老进程进程数暴涨设置了nbproc多进程改用nbproc 1nbthread N5.2 排障思路分享遇到Haproxy相关故障我有一套固定的排查顺序效率很高。第一步看进程和监听端口ps aux | grep haproxy ss -lntp | grep 443第二步看统计页面的后端状态。所有后端显示DOWN的话优先怀疑健康检查路径和防火墙部分DOWN的话单独curl那台机器的健康检查接口对比正常机器差别。curl -v http://192.168.1.10:8080/healthcheck curl -v http://192.168.1.11:8080/healthcheck第三步看系统日志里的Haproxy信息journalctl -u haproxy -n 200 --no-pager grep haproxy /var/log/syslog | tail -n 100第四步通过Unix Socket做运行时检查echo show info | socat stdio /var/lib/haproxy/stats echo show stat | socat stdio /var/lib/haproxy/statsshow stat输出的字段很多包含每台后端的累计请求数、失败数、重试数这些数据能直接看出流量分配是否均匀。举个例子所有机器总请求数差不多是正常的但其中一台的失败数异常高那基本就是那台机器自身有问题。5.3 日志分析几个实战要点option httplog开启后的日志每一行很有价值。看一行日志样例[14/Jul/2026:14:32:10.516] frontend web_frontend/1: 192.168.1.100:52340 [14/Jul/2026:14:32:09.125] web_servers/web1 0/0/1/85/86 200 2456 - - ---- 1/1/1/1/0 0/0web_servers/web1说明了真正处理请求的后端是哪台机器那段0/0/1/85/86代表“客户端请求等待/连接队列/后端响应前等待/后端处理时长/总时长”单位是毫秒200是状态码2456是响应字节数排障时看85这个数字它表示请求从Haproxy发到后端之后、后端返回数据前等待了85毫秒。如果这个数字持续飙高说明瓶颈在后端应用不在Haproxy。5.4 性能调优要动弦的三个点第一文件句柄限制。Haproxy连接数高时Too many open files错误会直接让新请求失败。除了systemd服务里的LimitNOFILE还要检查全局配置global ulimit-n 200000第二连接队列溢出。高并发下net.core.somaxconn、net.ipv4.tcp_max_syn_backlog要调大否则握手阶段就会丢包。具体数值可以参考4.4小节。第三零拷贝转发。四层TCP转发场景下设置如下参数可以明显降低CPU占用defaults option splice-request option splice-responsesplice利用内核的零拷贝机制直接在内核态把数据从一个socket搬移到另一个socket跳过用户态和内存拷贝。但注意HTTP模式下如果启用了内容解压或SSL卸载splice效果会打折扣因为处理逻辑本身就涉及数据修改。5.5 一个隐蔽但真实的坑多进程时代残留的坑前面提过老版本推荐多进程部署。如果你是从老配置迁移过来的可能还会看到如下写法global nbproc 4在多进程模式下每个进程各自监听端口会引发两个问题。一是停机reload时每个进程都要平滑过渡管理复杂度高二是进程之间不共享连接计数某个进程被占满其他进程却空闲影响负载均衡效果。新版本2.4以上已经默认支持多线程模型把nbproc改成1用nbthread控制线程数量才是正确姿势。如果你手上的配置还保留nbproc 4建议趁早改掉。我在一次压测中实测过单进程四线程和四进程模式在同等配置下单进程的吞吐量反而更高CPU调度也更稳。这是因为多线程模式下连接分配和状态存储都是共享的不存在跨进程的负载倾斜问题。6. 从实际运行中沉淀的几个习惯配置Haproxy这件事单纯看懂语法只是第一步真正到了生产环境有几个习惯我强烈建议养成。其一配置文件的变动要纳入版本管理。我见过太多人直接在服务器上vim改配置改出问题来回找原因找半天。正确做法是在本地或者CI环境里维护好haproxy.cfg改动后先做语法检查再同步到服务器上热加载。出了问题想看历史变更git log一目了然。其二每个版本的配置变更都建议写个小注释。比如改了超时时间顺手在配置里写一句“调整为30秒原因是某某接口压测需要更长响应时间”。有些人嫌注释啰嗦但几个月后回来排查问题这些注释比什么都管用。其三统计页和监控要前置。Haproxy的PromeTheus指标暴露接口一定要开起来配合Grafana做展示。连接数、队列长度、后端状态这些指标能提前告诉你系统在什么时候会出问题。我排障时有一个经验问题往往不是突然发生的而是慢慢累积的。比如队列长度持续走高时如果不做干预过半小时就会出现大量超时。监控的意义就在于提前半小时做出反应而不是等用户报障。其四变更后一定要观察一段时间。Haproxy的配置大多立即生效但有些参数的影响是“温水煮青蛙”比如权重调整后流量分布变化可能需要几分钟才显现。热加载完成不代表任务结束至少还要盯十分钟的监控数据。这些经验和踩坑都摆在明面上了你可以从上手安装开始逐步把配置参数吃透再根据自己业务的流量特征做调整。实际用起来Haproxy的稳定表现会让你觉得当初花时间搭建这个入口是非常值得的一件事。
返回列表