如何将无TLS的HTTP/2流量转换为HTTP/1.1并转发?
实现无TLS HTTP/2(h2c)到HTTP/1.1转发的简便方案
刚好之前折腾过类似的需求,给你几个简单可行的方案,不用死磕HAProxy或者Apache的限制~
方案一:Nginx 快速配置(推荐,适合已有Nginx环境)
Nginx从1.13.9版本开始原生支持h2c(无TLS的HTTP/2),配置起来非常直接,不需要额外安装模块。
下面是完整的配置示例:
server { # 监听8080端口,不加ssl参数的http2会自动处理h2c请求 listen 8080 http2; server_name localhost; location / { # 转发到你的目标后端(HTTP/1.1服务) proxy_pass http://your-target-backend:port; # 必要的头信息传递 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; # 明确指定用HTTP/1.1转发给后端 proxy_http_version 1.1; proxy_set_header Connection ""; # 清除Connection头,避免后端误解 } }
这个配置会自动处理两种h2c请求场景:
- 客户端直接发送HTTP/2的Preface(就是那个
PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n的开头) - 客户端先发送HTTP/1.1请求并带上
Upgrade: h2c头升级协议
方案二:Caddy 2 零成本配置(推荐,快速搭建)
Caddy 2对h2c的支持更友好,几乎不需要额外配置就能搞定,适合快速搭建转发服务:
# 监听8080端口 :8080 { reverse_proxy http://your-target-backend:port { # 强制用HTTP/1.1转发到后端 transport http { versions 1.1 } } }
Caddy默认会自动识别并处理无TLS端口上的h2c请求,转发逻辑完全封装好了,你只需要指定后端地址就行,省心到爆炸~
方案三:Envoy Proxy(适合复杂流量管控场景)
如果你的场景需要更灵活的流量控制(比如负载均衡、熔断、限流等),Envoy也是个不错的选择,核心配置片段如下:
listeners: - name: h2c_listener address: socket_address: { address: 0.0.0.0, port_value: 8080 } filter_chains: - filters: - name: envoy.filters.network.http_connection_manager typed_config: "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager codec_type: AUTO # 自动识别h2c或HTTP/1.x请求 stat_prefix: ingress_http route_config: name: local_route virtual_hosts: - name: backend domains: ["*"] routes: - match: { prefix: "/" } route: { cluster: target_backend } http_filters: - name: envoy.filters.http.router typed_config: {} clusters: - name: target_backend connect_timeout: 0.25s type: STRICT_DNS lb_policy: ROUND_ROBIN # 默认用HTTP/1.1转发,不需要额外配置 load_assignment: cluster_name: target_backend endpoints: - lb_endpoints: - endpoint: address: socket_address: address: your-target-backend port_value: port
Envoy的codec_type: AUTO会自动处理h2c和HTTP/1.x的请求,转发到后端时默认使用HTTP/1.1,完全满足你的需求。
为啥不推荐HAProxy和Apache?
- HAProxy:目前官方确实不支持无TLS的HTTP/2监听,HTTP/2必须依赖TLS/ALPN协商,所以h2c场景下HAProxy暂时用不了。
- Apache:虽然
mod_proxy_http2支持HTTP/2,但要实现h2c监听器非常麻烦,需要手动处理Upgrade请求,而且没有原生的h2c监听支持,配置复杂容易踩坑,真心不推荐。
总结下来,Nginx或者Caddy是最简便的选择——如果已经在用Nginx,直接加个server块就行;如果是新搭建服务,Caddy的配置成本几乎为零,非常省心。
内容的提问来源于stack exchange,提问作者bgd223
相关产品推荐
相关产品推荐

