HAproxy简易反向代理速度极慢问题排查求助
兄弟,这种慢到让人抓狂的情况我太懂了!结合HAproxy+OpenVPN的场景,我帮你梳理几个最可能的坑,一个个排查试试:
1. OpenVPN的MTU设置大概率是首坑
VPN隧道会给数据包额外加封装头,默认以太网1500的MTU会导致大量分片重传,直接拖垮速度。
- 排查方法:在HAproxy服务器和后端机器上分别执行
ping -M do -s 1400 <对方VPN内IP>,如果丢包就说明MTU太大。 - 解决办法:
- 在OpenVPN配置文件里加
tun-mtu 1400和mssfix 1360,手动适配隧道可用MTU;或者用mtu-test让OpenVPN自动探测最优值。 - 后端服务器上开启MTU探测:
sysctl -w net.ipv4.tcp_mtu_probing=1,避免分片阻塞。
- 在OpenVPN配置文件里加
2. HAproxy的连接复用与超时配置不合理
如果每次请求都新建VPN内的TCP连接,开销会被VPN放大N倍。
- 排查方法:查看HAproxy日志,有没有大量
conn_closed或者超时相关的记录。 - 解决办法:
- 开启HTTP长连接:在backend配置里加
option http-keep-alive,让HAproxy复用和后端的连接。 - 调整超时参数(适配VPN延迟):
timeout connect 5s # 连接后端的超时,别设太长 timeout client 30s timeout server 30s timeout http-request 10s - 如果是TCP代理场景,加
option tcp-check和tcp-keepalive维持连接。
- 开启HTTP长连接:在backend配置里加
3. OpenVPN的加密/压缩配置过载
太耗CPU的加密算法或不必要的双重压缩,会让服务器CPU跑满拖慢速度。
- 排查方法:用
htop看OpenVPN进程的CPU占比,如果持续很高就是加密的锅。 - 解决办法:
- 换成高效的加密算法,比如
AES-256-GCM(自带认证,比CBC模式快很多),在OpenVPN配置里加cipher AES-256-GCM。 - 如果后端传输的是已经压缩的内容(比如Jenkins的静态资源、gzip过的HTML),直接关掉OpenVPN的压缩:
compress none,避免双重压缩浪费CPU。 - 优先用UDP协议:OpenVPN配置里设
proto udp,TCP over TCP容易出现队头阻塞,UDP在VPN场景下通常更高效。
- 换成高效的加密算法,比如
4. 系统级TCP参数优化适配VPN链路
默认Linux TCP参数可能不适合高延迟的VPN链路,调整后能明显提升吞吐量。
- 编辑
/etc/sysctl.conf加入以下配置:net.ipv4.tcp_congestion_control = bbr # BBR算法比默认Cubic更适合高延迟链路 net.ipv4.tcp_window_scaling = 1 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216 - 执行
sysctl -p生效后再测试速度。
5. Jenkins专属优化(针对你的仪表盘慢问题)
Jenkins本身的资源加载特性,加上VPN延迟会放大问题:
- 在HAproxy里给Jenkins的静态资源加缓存头:
acl is_jenkins_static path_beg /css /js /images http-response set-header Cache-Control "public, max-age=3600" if is_jenkins_static - 在Jenkins后台(
Manage Jenkins > Configure System)设置正确的反向代理URL,开启反向代理适配选项,避免Jenkins生成错误的资源路径。 - 禁用不必要的Jenkins插件,减少页面加载的资源数量。
建议先从MTU和HAproxy连接复用开始排查,这俩是这类场景下最常见的元凶。测试静态页面和Jenkins的差异,也能帮你区分是链路问题还是应用本身的问题。
内容的提问来源于stack exchange,提问作者Joel Bodenmann




