当在 HaProxy 后面配置 nginX 时,我无法让 HTTP/2 推送工作。但是,当 Web 浏览器直接点击 nginX 时,它确实有效。
已经做了很多研究,但没有找到任何提示。希望有人知道我做错了什么。请参阅下面的配置和进一步的观察。
配置
相关的 HaProxy(版本 1.8.7)配置由以下给出:
前端应用名称
绑定 *:443 ssl crt certificate.pem alpn h2,http/1.1
模式 tcp
如果 { ssl_fc_alpn -i h2 } 使用_backend app-http2
default_backend 应用程序
后端应用程序-http2
模式 tcp
服务器 lamp2 127.0.0.1:8002 检查发送代理
而相关的nginX(1.14.0版本)配置如下:
http {
# 这是我想用的
服务器 {
听 8002 http2 proxy_protocol;
服务器名称 _;
根 /usr/share/nginx/html;
地点 / {
http2_push /image.jpg;
}
}
# 这个可以直接访问;并且*确实*工作
服务器 {
听 8004 http2 ssl;
ssl_certificate 证书.pem;
ssl_certificate_key private.key;
服务器名称 _;
根 /usr/share/nginx/html;
地点 / {
http2_push /image.jpg;
}
}
}
观察
- 在 nginx 日志中,我可以验证访问内容的两种方式都使用 HTTP2。
- 当我使用 Chrome 访问该页面时,我可以看到只有在直接访问 nginX 时才使用push
2018 年 5 月 9 日更新 仍未解决。但人们似乎同意这是一个错误。我在他们的问题跟踪器上打开了一个问题:https ://trac.nginx.org/nginx/ticket/1549#ticket
2018 年 4 月 26 日更新
看来问题不仅仅是 http2 推送。如果我记录$schemenginX 变量,它总是设置为http. 从 http2 访问 http 时都如此。
所以这显然是个问题。但是我不确定如何解决这个问题。Haproxy 工作在 tcp 模式;因此可能不会做错任何事。
一个相关(但可能已过时)的 Stack Overflow 主题是负载均衡器后面的 nginx $scheme 变量。但是那个答案无助于解决这个问题!
2018 年 4 月 25 日更新
还是行不通。但更近了一步。在两者上运行 nghttp2,结果如下所示。
两者似乎都嵌入了 /image.jpg 资源。但是通过 haproxy 的方案设置为 http;而不是https。正如在这个差异中看到的那样:
我假设因此;Chrome 不会使用这个推送的资源。但是我不确定是什么原因造成的!
有人有线索吗?
两个命令的完整输出:
nghttp -nv https://127.0.0.1:8004/
[ 0.001] 已连接
协商协议:h2
[0.003]发送设置帧
(niv=2)
[SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100]
[SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535]
[0.003]发送优先帧
(dep_stream_id=0,权重=201,独占=0)
[0.003]发送优先帧
(dep_stream_id=0,权重=101,独占=0)
[0.003]发送优先帧
(dep_stream_id=0,权重=1,独占=0)
[0.003]发送优先帧
(dep_stream_id=7,权重=1,排他=0)
[0.003]发送优先帧
(dep_stream_id=3,权重=1,排他=0)
[0.003]发送标题帧
; END_STREAM | END_HEADERS | 优先
(padlen=0,dep_stream_id=11,权重=16,排他=0)
; 打开新流
:方法:获取
:小路: /
:方案:https
:权威:127.0.0.1:8004
接受: */*
接受编码:gzip,放气
用户代理:nghttp2/1.25.0
[ 0.003] 接收设置帧
(niv=3)
[SETTINGS_MAX_CONCURRENT_STREAMS(0x03):128]
[SETTINGS_INITIAL_WINDOW_SIZE(0x04):65536]
[SETTINGS_MAX_FRAME_SIZE(0x05):16777215]
[0.003] 接收窗口更新帧
(window_size_increment=2147418112)
[0.003]发送设置帧
; 确认
(niv=0)
[ 0.003] 接收设置帧
; 确认
(niv=0)
[0.003]recv(stream_id=13):方法:获取
[0.003]recv(stream_id=13):路径:/image.jpg
[0.003] recv (stream_id=13):scheme: https
[0.003] recv (stream_id=13):authority: 127.0.0.1:8004
[0.003] recv (stream_id=13) 接受编码:gzip,放气
[0.003]recv(stream_id=13)用户代理:nghttp2/1.25.0
[0.003]接收PUSH_PROMISE帧
; END_HEADERS
(padlen=0,promise_stream_id=2)
[0.003]recv(stream_id=13):状态:200
[0.003]recv(stream_id=13)服务器:nginx/1.14.0
[0.003] recv (stream_id=13) 日期:2018 年 4 月 25 日星期三 15:08:26 GMT
[0.003]recv(stream_id=13)内容类型:文本/html
[0.003]recv(stream_id=13)内容长度:638
[0.003] recv (stream_id=13) 最后修改时间:2018 年 4 月 25 日星期三 11:42:58 GMT
[0.003]recv(stream_id=13)etag:“5ae069c2-27e”
[0.003] recv (stream_id=13) 接受范围:字节
[0.003]接收标题帧
; END_HEADERS
(padlen=0)
; 第一个响应标头
[0.004]接收数据帧
; END_STREAM
[0.004]recv(stream_id=2):状态:200
[0.004]recv(stream_id=2)服务器:nginx/1.14.0
[0.004] recv (stream_id=2) 日期:2018 年 4 月 25 日星期三 15:08:26 GMT
[0.004] recv (stream_id=2) 内容类型:图像/jpeg
[0.004]recv(stream_id=2)内容长度:182884
[0.004] recv (stream_id=2) 最后修改时间:2016 年 6 月 18 日星期六 15:42:26 GMT
[0.004]recv(stream_id=2)etag:“57656be2-2ca64”
[0.004] recv (stream_id=2) 接受范围:字节
[0.004]接收标题帧
; END_HEADERS
(padlen=0)
; 第一个推送响应头
[0.004]接收数据帧
[0.004]接收数据帧
[0.004]接收数据帧
[0.004]接收数据帧
[0.004]接收数据帧
[0.004] 发送 WINDOW_UPDATE 帧
(window_size_increment=33248)
[0.004] 发送 WINDOW_UPDATE 帧
(window_size_increment=32768)
[0.004]接收数据帧
[0.004]接收数据帧
[0.004]接收数据帧
[0.046]接收数据帧
[0.046]接收数据帧
[0.046]接收数据帧
[0.046]接收数据帧
[0.046]接收数据帧
[0.046]发送WINDOW_UPDATE帧
(window_size_increment=32925)
[0.046]发送WINDOW_UPDATE帧
(window_size_increment=32767)
[0.046]接收数据帧
[0.046]发送WINDOW_UPDATE帧
(window_size_increment=32768)
[0.046]发送WINDOW_UPDATE帧
(window_size_increment=32768)
[0.046]接收数据帧
[0.090]接收数据帧
[0.090]接收数据帧
[0.090]接收数据帧
[0.090]接收数据帧
[0.090]接收数据帧
[0.090]接收数据帧
[0.090]接收数据帧
[0.090] 发送 WINDOW_UPDATE 帧
(window_size_increment=32767)
[0.090] 发送 WINDOW_UPDATE 帧
(window_size_increment=32767)
[0.090] 发送 WINDOW_UPDATE 帧
(window_size_increment=32768)
[0.090] 发送 WINDOW_UPDATE 帧
(window_size_increment=32768)
[0.134]接收数据帧
[0.134]接收数据帧
[0.134]接收数据帧
; END_STREAM
[0.134]发送GOAWAY帧
(last_stream_id=2, error_code=NO_ERROR(0x00), opaque_data(0)=[])
和
nghttp -nv https://127.0.0.1:8002/
[ 0.001] 已连接
协商协议:h2
[0.003]发送设置帧
(niv=2)
[SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100]
[SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535]
[0.003]发送优先帧
(dep_stream_id=0,权重=201,独占=0)
[0.003]发送优先帧
(dep_stream_id=0,权重=101,独占=0)
[0.003]发送优先帧
(dep_stream_id=0,权重=1,独占=0)
[0.003]发送优先帧
(dep_stream_id=7,权重=1,排他=0)
[0.003]发送优先帧
(dep_stream_id=3,权重=1,排他=0)
[0.003]发送标题帧
; END_STREAM | END_HEADERS | 优先
(padlen=0,dep_stream_id=11,权重=16,排他=0)
; 打开新流
:方法:获取
:小路: /
:方案:https
:权威:127.0.0.1:8002
接受: */*
接受编码:gzip,放气
用户代理:nghttp2/1.25.0
[ 0.003] 接收设置帧
(niv=3)
[SETTINGS_MAX_CONCURRENT_STREAMS(0x03):128]
[SETTINGS_INITIAL_WINDOW_SIZE(0x04):65536]
[SETTINGS_MAX_FRAME_SIZE(0x05):16777215]
[0.003] 接收窗口更新帧
(window_size_increment=2147418112)
[0.003]发送设置帧
; 确认
(niv=0)
[ 0.004] 接收设置帧
; 确认
(niv=0)
[0.004]recv(stream_id=13):方法:获取
[0.004]recv(stream_id=13):路径:/image.jpg
[0.004]recv(stream_id=13):方案:http
[0.004] recv (stream_id=13):authority: 127.0.0.1:8002
[0.004]recv(stream_id=13)接受编码:gzip,放气
[0.004]recv(stream_id=13)用户代理:nghttp2/1.25.0
[0.004]recv PUSH_PROMISE 帧
; END_HEADERS
(padlen=0,promise_stream_id=2)
[0.004]recv(stream_id=13):状态:200
[0.004]recv(stream_id=13)服务器:nginx/1.14.0
[0.004] recv (stream_id=13) 日期:2018 年 4 月 25 日星期三 15:08:45 GMT
[0.004]recv(stream_id=13)内容类型:文本/html
[0.004]recv(stream_id=13)内容长度:638
[0.004] recv (stream_id=13) 最后修改时间:2018 年 4 月 25 日星期三 11:42:58 GMT
[0.004]recv(stream_id=13)etag:“5ae069c2-27e”
[0.004]recv(stream_id=13)接受范围:字节
[0.004]接收标题帧
; END_HEADERS
(padlen=0)
; 第一个响应标头
[0.004]接收数据帧
; END_STREAM
[0.004]recv(stream_id=2):状态:200
[0.004]recv(stream_id=2)服务器:nginx/1.14.0
[0.004] recv (stream_id=2) 日期:2018 年 4 月 25 日星期三 15:08:45 GMT
[0.004] recv (stream_id=2) 内容类型:图像/jpeg
[0.004]recv(stream_id=2)内容长度:182884
[0.004] recv (stream_id=2) 最后修改时间:2016 年 6 月 18 日星期六 15:42:26 GMT
[0.004]recv(stream_id=2)etag:“57656be2-2ca64”
[0.004] recv (stream_id=2) 接受范围:字节
[0.004]接收标题帧
; END_HEADERS
(padlen=0)
; 第一个推送响应头
[0.004]接收数据帧
[0.004]接收数据帧
[0.004]接收数据帧
[0.004]接收数据帧
[0.004]接收数据帧
[0.004] 发送 WINDOW_UPDATE 帧
(window_size_increment=33406)
[0.004] 发送 WINDOW_UPDATE 帧
(window_size_increment=32768)
[0.004]接收数据帧
[0.004]接收数据帧
[0.004]接收数据帧
[0.044]接收数据帧
[0.044] 发送 WINDOW_UPDATE 帧
(window_size_increment=32767)
[0.044] 发送 WINDOW_UPDATE 帧
(window_size_increment=32767)
[0.044]接收数据帧
[0.044]接收数据帧
[0.045]接收数据帧
[0.045]接收数据帧
[0.045] 发送 WINDOW_UPDATE 帧
(window_size_increment=32768)
[0.045] 发送 WINDOW_UPDATE 帧
(window_size_increment=32768)
[0.045]接收数据帧
[0.045]接收数据帧
[0.045]接收数据帧
[0.045]接收数据帧
[0.045] 发送 WINDOW_UPDATE 帧
(window_size_increment=32767)
[0.045] 发送 WINDOW_UPDATE 帧
(window_size_increment=32767)
[0.045]接收数据帧
[0.046]接收数据帧
[0.046]接收数据帧
[0.046]接收数据帧
[0.046]发送WINDOW_UPDATE帧
(window_size_increment=32768)
[0.046]发送WINDOW_UPDATE帧
(window_size_increment=32768)
[0.046]接收数据帧
[0.046]接收数据帧
[0.046]接收数据帧
; END_STREAM
[0.046]发送GOAWAY帧
(last_stream_id=2, error_code=NO_ERROR(0x00), opaque_data(0)=[])
