NGINX系列(十) 开启HTTP2.0和HTTP3.0功能

1
2
3
4
5
6
7
作者:李晓辉

联系方式:

1. 微信:Lxh_Chat

2. 邮箱:939958092@qq.com

环境介绍

操作系统IP地址主机名NGINX版本角色
Rocky9.4192.168.8.3loadbalance.xiaohui.cn1.26.2负载均衡

在本文中,我们将深入探讨如何在NGINX服务器中启用HTTP/2.0和HTTP/3.0。通过启用这些新一代的HTTP协议,可以显著提升网站的加载速度和安全性。HTTP/2.0引入了多路复用、首部压缩等技术,而HTTP/3.0更是基于QUIC协议,进一步减少延迟,提高传输效率。

HTTP2.0

HTTP2.0的概念

HTTP/2是HTTP协议的主流版本,旨在提高Web性能和效率。与其前身HTTP/1.1相比,HTTP/2引入了多项技术改进,使得数据传输更加高效。以下是HTTP/2的一些关键优势:

  • 多路复用:允许多个请求同时通过一个TCP连接进行传输,减少延迟。

  • 头部压缩:通过HPACK算法对HTTP头部进行压缩,降低数据传输量。

  • 服务器推送:允许服务器在客户端请求之前预先推送资源,提升加载速度。

  • 二进制分帧:将HTTP消息分成更小的二进制帧,提高解析效率。

这些改进使得HTTP/2在提升网页加载速度、减少延迟和优化网络带宽利用方面表现尤为出色。通过在NGINX中启用HTTP/2,可以充分发挥其性能优势,为用户提供更快速和流畅的访问体验。

HTTP/2的主要设计目的是通过HTTPS(也就是HTTP over TLS)进行加密传输。虽然在技术上可以在HTTP(非加密)上启用HTTP/2,但主流浏览器普遍要求HTTP/2必须在HTTPS上运行。这主要是为了确保数据传输的安全性和隐私性。所以,如果你打算在NGINX中启用HTTP/2,通常需要先配置SSL/TLS证书并启用HTTPS。这样不仅能够利用HTTP/2的性能优势,还能确保数据传输的安全性。

我们离线测试就用自己生成的自签名证书就好,关于如何生成自签名证书,可查看我这篇文章:如何生成和使用自签名证书

配置文件案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cat > /etc/nginx/conf.d/http2.conf <<EOF
server {
listen 443 ssl http2;

ssl_certificate /etc/pki/tls/certs/nginx.crt;
ssl_certificate_key /etc/pki/tls/private/nginx.key;

server_name loadbalance.xiaohui.cn;

# 其他SSL配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'HIGH:!aNULL:!MD5';

location / {
root /usr/share/nginx/html;
index index.html;
}
}
EOF

配置文件详解

  • listen 443 ssl http2;

    • 这个指令表示服务器将监听443端口(通常用于HTTPS),并启用SSL(TLS)和HTTP/2协议。
  • ssl_certificate 和 ssl_certificate_key

    • ssl_certificate 指定服务器的SSL证书文件路径。在这个示例中,路径为 /etc/pki/tls/certs/nginx.crt

    • ssl_certificate_key 指定SSL证书的私钥文件路径。在这个示例中,路径为 /etc/pki/tls/private/nginx.key

  • server_name loadbalance.xiaohui.cn

    • server_name 指定服务器的域名。在这个示例中,域名为 loadbalance.xiaohui.cn
  • ssl_protocols TLSv1.2 TLSv1.3;

    • ssl_protocols 指定服务器支持的SSL/TLS协议版本。在这个示例中,服务器仅支持TLSv1.2和TLSv1.3,以确保更高的安全性。
  • ssl_ciphers ‘HIGH:!aNULL:!MD5’;

    • ssl_ciphers 指定服务器支持的加密套件。在这个示例中,使用了高强度加密套件并排除了不安全的套件(如NULL和MD5)。
  • location /

    • location 指令定义了与特定URL路径匹配的配置。在这个示例中,匹配所有以 / 开头的请求路径。
  • root /usr/share/nginx/html;

    • root 指令指定了请求的根目录。在这个示例中,根目录为 /usr/share/nginx/html
  • index index.html;

    • index 指令指定了默认的索引文件。在这个示例中,默认索引文件为 index.html

测试效果

可以看到已经提示HTTP/2 200

1
2
3
4
5
6
7
8
9
[root@loadbalance ~]# curl -I -k https://loadbalance.xiaohui.cn
HTTP/2 200
server: nginx/1.26.2
date: Tue, 21 Jan 2025 01:26:53 GMT
content-type: text/html
content-length: 21
last-modified: Mon, 20 Jan 2025 08:34:38 GMT
etag: "678e0a9e-15"
accept-ranges: bytes

HTTP3.0

HTTP/3.0是HTTP协议的最新版本,主要基于Google开发的QUIC协议。相比于之前的HTTP/2,HTTP/3带来了一些显著的改进和优势:

主要特点

  1. 基于QUIC协议:HTTP/3使用QUIC(快速UDP互联网连接)协议,而不是传统的TCP。QUIC基于UDP,可以减少连接建立的延迟,提高网络速度1。

  2. 0-RTT连接:HTTP/3支持0-RTT(零往返时间)连接,可以在建立连接时减少延迟。

  3. 多路复用:HTTP/3继续支持HTTP/2的多路复用功能,但在传输层上更加高效。

  4. 连接迁移:HTTP/3支持连接迁移,即在网络地址变化时,可以保持连接,减少重连的开销。

  5. 内置TLS:HTTP/3内置了TLS(传输层安全协议),确保数据传输的安全性。

  6. 头部压缩:HTTP/3使用QPACK进行头部压缩,优化了乱序发送的支持和压缩率。

优势

  • 减少网络延迟:通过0-RTT连接和QUIC协议,HTTP/3可以显著减少网络延迟。

  • 提高网络速度:QUIC协议的高效传输机制和多路复用功能,使得HTTP/3在高延迟和高拥塞网络环境下表现更好。

  • 提升网络安全:内置的TLS机制确保了数据传输的安全性。

应用场景

HTTP/3适用于高延迟网络、高拥塞网络和高并发场景。例如,移动网络、视频流媒体、在线游戏等应用场景

配置文件案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
cat > /etc/nginx/conf.d/http3.conf <<'EOF'
server {
# 为了提高兼容性,建议对 QUIC 和 TCP 使用相同的端口号
listen 443 quic reuseport; # QUIC
listen 443 ssl; # TCP

ssl_certificate /etc/pki/tls/certs/nginx.crt;
ssl_certificate_key /etc/pki/tls/private/nginx.key;

ssl_protocols TLSv1.3;

server_name loadbalance.xiaohui.cn;

root /usr/share/nginx/html;
index index.html index.htm;

location / {
# 告知 QUIC 在配置端口上可用
add_header Alt-Svc 'h3=":$server_port"; ma=86400';
# 其他配置
}
}
EOF

配置文件详解

详细解释:

  1. listen 443 quic reuseport;

    • 监听 443 端口上的 QUIC 协议,reuseport 可以提高并发处理性能。
  2. listen 443 ssl;

    • 监听 443 端口上的 TCP 协议(用于 HTTP/1.1 和 HTTP/2)。
  3. ssl_certificate 和 ssl_certificate_key

    • 指定 SSL 证书和私钥的文件路径。
  4. ssl_protocols TLSv1.3;

    • 指定支持的 SSL/TLS 协议版本。HTTP/3 要求启用 TLS 1.3。
  5. server_name 192.168.8.3;

    • 指定服务器名称(IP 地址或域名)。
  6. location /

    • 定义与根路径匹配的配置。
  7. add_header Alt-Svc ‘h3=”:$server_port”; ma=86400’;

    • 向客户端广告 HTTP/3 服务的可用性。ma=86400 表示这个服务可用性将在客户端缓存 86400 秒(即 1 天)。

测试效果

如果服务起不来,可以启用SELinux的443端口

1
semanage port -a -t http_port_t -p udp 443

在浏览器中打开页面,将会提示以下字段

1
alt-svc: h3=":443"; ma=86400