如何配置HAProxy将HTTP/1.0请求转为HTTP/1.1转发至后端服务器?
问题分析与解决方案
你的当前配置无法实现将HTTP/1.0请求转换为HTTP/1.1转发至后端,核心原因是HAProxy默认会沿用客户端的HTTP协议版本与后端服务器通信——当客户端发送HTTP/1.0请求时,HAProxy也会以HTTP/1.0向后端发送,触发了后端的"426 Upgrade Required"限制。
关键修改点
需要强制HAProxy与后端通信时使用HTTP/1.1,只需在default-server或server配置行中添加http-version 1.1参数即可。
修改后的完整配置
global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 40000 user haproxy group haproxy daemon stats socket /var/lib/haproxy/stats ssl-default-bind-ciphers PROFILE=SYSTEM ssl-default-server-ciphers PROFILE=SYSTEM 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 15000 listen farm_ssfti bind *:50121 http-request replace-header Host .* ssfti.test.io # 添加http-version 1.1强制向后端用HTTP/1.1通信 default-server check ssl verify none alpn http/1.1,h2 http-version 1.1 server ssfpi ssfpi.server.io:443
验证方法
用curl发送HTTP/1.0请求测试:
curl -v --http1.0 http://<HAProxy_IP>:50121
此时HAProxy会将请求转换为HTTP/1.1发送给后端,不会再收到426响应。
补充说明
option http-server-close配置本身没问题,它会让HAProxy在与后端完成请求交互后关闭连接,避免长连接占用资源,和HTTP版本转换不冲突。alpn http/1.1,h2仅影响SSL握手时的协议协商,对非SSL的客户端请求(你的bind是普通HTTP)不生效,所以必须显式指定http-version 1.1来强制协议版本。
内容的提问来源于stack exchange,提问作者Christian Zazueta
相关产品推荐
相关产品推荐

