Skip to content

nginx http2

nginx http2 模块官网介绍

https://nginx.org/en/docs/http/ngx_http_v2_module.html

https 是什么

HTTP/2 是一种网络通信协议,它是超文本传输协议(HTTP)的第二个主要版本。HTTP/2 旨在解决 HTTP/1.x 的一些性能限制,并优化数据传输效率。它于 2015 年正式成为互联网标准。这种协议引入了几个重要的改进和新特性:

  1. 二进制协议:不同于 HTTP/1.x 的文本格式,HTTP/2 使用二进制格式,这使得解析更高效,减少了解析时间和错误。

  2. 多路复用:HTTP/2 允许在单一的连接上并行交错地发送多个请求和响应,而无需按顺序一一对应。这减少了延迟,并允许利用单一连接高效传输多个请求和响应。

  3. 首部压缩:HTTP/2 引入了首部表(Header Table)和哈夫曼编码(Huffman Encoding),用于压缩请求和响应的头部。这减少了冗余首部数据的传输,降低了带宽消耗。

  4. 服务器推送:这是一种允许服务器未经客户端明确请求即发送资源给客户端的机制,可以进一步提高页面加载速度。

  5. 流控制:HTTP/2 对每个发送的流实现了流量控制,防止接收方因为接收速度跟不上发送速度而被压垮。

HTTP/2 的引入旨在使网络应用更加快速、可靠和高效。许多现代浏览器和网络服务器已经支持这一协议,以优化用户的网络体验。

http2 书籍

免费书籍 https://http2-explained.haxx.se/zh

来源:

nginx http2 配置

在 https 的基础上,添加 http2 on; 指令即可

自从 Nginx 1.13.0 版本以来,由于安全问题,不再推荐使用 TLS 1.0/1.1。保留 TLSv1.2 和 TLSv1.3 确保了更强的加密标准和更好的安全性。

DANGER

注意:这里的 TLSv1 TLSv1.1 已经废弃,一般不用,因为可以被暴力破解

修改后的 nginx.conf

nginx
server {
    # 监听 443 端口,启用 SSL 加密
    listen              443 ssl;

    # 开启 HTTP/2 支持
    http2 on;

    # 设置连接保持超时时间为 70 秒
    keepalive_timeout   70;

    # 启用 TLSv1.2 和 TLSv1.3 协议
    ssl_protocols       TLSv1.2 TLSv1.3;
    # ssl_protocols       TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

    # 设置 SSL 密码套件
    ssl_ciphers         AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;

    # 指定 SSL 证书的位置
    ssl_certificate     /etc/nginx/ssl/localhost.crt;

    # 指定 SSL 证书密钥的位置
    ssl_certificate_key /etc/nginx/ssl/localhost.key;

    # 设置 SSL 会话缓存,共享缓存容量为 10M
    ssl_session_cache   shared:SSL:10m;

    # 设置 SSL 会话超时时间为 10 分钟
    ssl_session_timeout 10m;

    # 设置服务器名为 localhost
    server_name  localhost;

    # 配置服务器根目录和默认页面
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    # 配置错误页面,指定错误码 500、502、503、504 时显示的页面
    error_page   500 502 503 504  /50x.html;

    # 配置特定的错误页面的位置
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

这种写法已经废弃 listen 443 ssl http2;

https://nginx.org/en/docs/http/ngx_http_v2_module.html#http2

https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl

最新写法

nginx
listen 443 ssl;
http2 on;

下面是已经废弃的写法(nginx 1.25.1)

nginx
listen 443 ssl http2;

Nginx 1.25.1+ Listen … http2” directive is deprecated https://forum.hestiacp.com/t/nginx-1-25-1-listen-http2-directive-is-deprecated/9816

http2 主动推送已经过时(被废弃)

WARNING

This directive is obsolete since version 1.25.1.

nginx http2_push 被标记已经过时 https://nginx.org/en/docs/http/ngx_http_v2_module.html#http2_push

http2_push 指令在 Nginx 中用于实现 HTTP/2 的服务器推送功能,这允许服务器主动发送资源给客户端,而不需要客户端显式请求。

然而,由于各种原因,包括浏览器支持的逐渐减少和对性能的影响,HTTP/2 的服务器推送功能并未被广泛采用,并且在一些场景中,如 Google Chrome 浏览器中已经废弃。

替代方案

  1. 预加载技术(Preload):

    • 使用 <link rel="preload"> 标签是一种更加受控的方式来告诉浏览器预先加载特定资源。这可以在 HTML 文档的 <head> 部分声明,允许浏览器更早地发现和加载关键资源。
    • 示例:
      html
      <link rel="preload" href="style.css" as="style" />
      <link rel="preload" href="script.js" as="script" />
  2. HTTP 头部的预加载(HTTP Link header):

    • 另一个选项是使用 HTTP 响应头中的 Link 字段来指示预加载。这可以通过 Nginx 的配置实现,无需修改 HTML。
    • Nginx 配置示例:
      nginx
      location / {
          add_header Link "</style.css>; rel=preload; as=style";
          add_header Link "</script.js>; rel=preload; as=script";
      }
  3. 优化资源交付策略:

    • 通过精心设计的资源分配策略,例如合理地划分资源,使用有效的缓存策略,可以减少对服务器推送的需求。
    • 使用 CDN 和边缘缓存策略来提高内容的分发效率。
  4. 使用 HTTP/3:

    • 考虑使用支持 HTTP/3 的解决方案,尽管 HTTP/3 没有直接替代 HTTP/2 的服务器推送,但它通过改进的连接和传输效率提供了更好的性能。

选择策略

选择哪种替代方案取决于具体的使用场景和性能需求。在许多情况下,<link rel="preload"> 提供了足够的控制,允许网页开发者指定哪些资源应该被优先加载,而无需服务器推送可能带来的额外复杂性和性能问题。同时,对于动态或复杂的应用,结合使用 CDN 和缓存策略可能会提供更好的结果。


Chrome 将移除不实用的 HTTP/2 服务器推送功能 https://baijiahao.baidu.com/s?id=1741943867702140370&wfr=spider&for=pc

http2 服务器推送 被废弃,替代方案是 103 Early Hints 是啥意思

HTTP/2 服务器推送(Server Push)是一种允许服务器主动发送资源到客户端的技术,这样客户端在发现需要这些资源时,已经提前接收到了,从而可以减少加载时间。然而,由于各种实现复杂性和效果不一的问题,HTTP/2 服务器推送功能在实际使用中逐渐被认为不够高效或有缺陷。

因此,一些浏览器和技术社区开始寻找替代方案,其中之一就是使用 HTTP 状态码 103 Early Hints103 Early Hints 是一个在正式发送完整响应之前,服务器可以发送预先提示(Early Hints)给客户端的状态码。这些提示主要包括哪些资源将是必需的,比如 CSS 文件、JavaScript 脚本或图片等。客户端在接收到这些早期提示后,可以提前开始预加载这些资源,而不必等待服务器发送完整的响应。

这种方法的好处是它减少了客户端处理响应的等待时间,同时避免了 HTTP/2 服务器推送中的一些问题,如资源过度推送和缓存效率低下。通过这种方式,服务器只是提供关于即将需要的资源的信息,而不是实际推送这些资源,从而使客户端可以更有效地管理资源的预加载和缓存。

nginx 如何配置 103 Early Hints

截至目前,Nginx 官方版本尚未直接支持 HTTP 状态码 103 Early Hints。Nginx 通常是等待整个响应准备完毕后再发送,这是由于它的架构是围绕高效处理完整的 HTTP 请求和响应而设计的。不过,社区中有提出一些实验性的补丁和第三方模块来尝试支持 103 Early Hints

如果你想在 Nginx 中实现类似 103 Early Hints 的功能,可以采用以下方法之一:

  1. 使用第三方模块:有时开发者会为 Nginx 创建特定的模块以支持新的特性。可以搜索是否有最新的模块支持 103 Early Hints

  2. 自定义头部实现:虽然不是标准的 103 Early Hints 实现,但你可以通过设置自定义头部来通知客户端预加载资源。例如,你可以通过添加 Link 头部来指示预加载:

    nginx
    location / {
        add_header Link "</style.css>; rel=preload; as=style";
        add_header Link "</script.js>; rel=preload; as=script";
    }

    这个方法并不发送 103 Early Hints,但可以利用现有的 HTTP/1 和 HTTP/2 协议在客户端开始解析 HTML 内容之前预加载指定的资源。

  3. 关注 Nginx 更新和社区动态:随着 HTTP/3 的发展和互联网协议的演进,Nginx 可能会在未来的版本中支持 103 Early Hints。关注 Nginx 官方文档和更新记录是了解此类特性支持的好方法。

目前,想要在生产环境中使用 103 Early Hints,可能需要考虑使用支持该特性的其他服务器软件,例如最新版本的 Apache HTTP Server 或某些特定的云服务和边缘网络服务可能已经开始支持此功能。

阿帕奇实现了 103 Early Hints 吗

是的,Apache HTTP Server 已经在其 2.4.51 版本中实现了对 HTTP 状态码 103 Early Hints 的支持。

这使得开发者可以在 Apache 服务器上使用这个功能,以改善网页的加载性能。

要在 Apache 中启用 103 Early Hints,你需要配置你的 .htaccess 文件或服务器配置文件,以发送早期的资源提示。这里是一个基本的配置示例:

apache
<IfModule mod_headers.c>
    Header always set Early-Hints "Link: </path/to/resource.css>; rel=preload; as=style"
</IfModule>

此配置使用了 Header 指令来发送 Link 头部,这些头部被包括在 103 Early Hints 响应中。客户端浏览器会根据这些链接头部预加载指定的资源。

确保你的 Apache 服务器已经启用了 mod_headers 模块,因为这是使用头部指令的前提。如果你的 Apache 服务器还没有启用此模块,你可以通过以下命令来启用它(取决于你的服务器设置和操作系统):

bash
sudo a2enmod headers
sudo systemctl restart apache2

使用 103 Early Hints 可以帮助减少浏览器的感知加载时间,通过提前指示客户端哪些资源需要被预加载。不过,实际效果可能取决于用户的网络状况、浏览器的实现方式以及网页本身的复杂性。