启用 HTTP2 服务器推送 Nginx

Enable HTTP2 Server Push Nginx

我安装了支持 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
}

但是没有用。我的浏览器调试器网络选项卡显示启动器是 "index",而 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 工具仍然确认没有发生服务器推送。

我的理解是 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 预加载支持 header 说明。

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