启用 HTTP2 服务器推送 Nginx

Posted

技术标签:

【中文标题】启用 HTTP2 服务器推送 Nginx【英文标题】:Enable HTTP2 Server Push Nginx 【发布时间】:2019-08-11 02:16:41 【问题描述】:

我安装了支持 HTTP2 的 nginx。我的 nginx 在应用程序负载均衡器后面,SSL 终止仅在 LB 发生。

我首先启用了 HTTP2_PUSH,如下所示:

http2_push_preload on;
location /mx 
       http2_push https://example.com/css/style.css;
       http2_push https://example.com/js/main.js

但它没有工作。我的浏览器调试器网络选项卡显示启动器是“索引”,而 nghttp 也没有显示任何内容。

我尝试的另一种方法是:

http2_push_preload on;
    location /mx 
           add_header Link "<https://example.com/css/style.css>; rel=preload; as=style,<http2_push https://example.com/js/main.js>; rel=preload; as=script";
    

下一个方法将网络选项卡中的启动器从 index 更改为 other,但 nghttp 工具仍然确认没有发生服务器推送。

【问题讨论】:

【参考方案1】:

我的理解是 AWS Application Load Balancer 是一个 7 级 (HTTP) 负载均衡器,只支持前端的 HTTP/2 而不是你的 Nginx 后端。

您可以通过将 $server_protocol 添加到您的 Nginx log_format 来检查这一点:

log_format my_log_format '$remote_addr - $remote_user [$time_local] $server_protocol "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
access_log /usr/local/nginx/nginx-access.log my_log_format;

我猜流量是以 HTTP/1.1 进入的。

即使 AWS ALB 现在确实支持 HTTP/2 到后端,但这并不意味着它将支持 HTTP/2 推送。当像这样涉及多个基础设施时,这会变得复杂(如果 ALB 和 Nginx 都支持推送但客户端不支持),最好的建议是从边缘节点推送,特别是如果它通过 HTTP 预加载头指令支持。

您最好使用 4 级 (TCP) 负载平衡器来使其工作。

【讨论】:

以上是关于启用 HTTP2 服务器推送 Nginx的主要内容,如果未能解决你的问题,请参考以下文章

golang http2 服务器推送的高级客户端

极客漫画:HTTP2 服务器推送

IOS推送http2使用netty服务启动异常

当我进行 http2 推送时,我向服务器发出请求?

HTTP/2 服务器推送资产加载失败 (HTTP2_CLIENT_REFUSED_STREAM)

HTTP 2 将支持服务器推送,这是啥意思?