当前位置: 首页 > article >正文

Nginx 配置HTTP_2 协议

  HTTP/2 是 HTTP 协议的下一代版本,旨在提高性能、减少延迟并优化现代网络环境中的通信效率。通过 Nginx 配置 HTTP/2,可以充分利用其多路复用、头部压缩和流量优先级功能,为用户提供更快更安全的访问体验。


一、HTTP/2 协议概述

1.HTTP/2

   HTTP/2 是 2015 年发布的 HTTP 协议升级版(RFC 7540)。它在保留 HTTP 核心语义(如请求方法、状态码、URI 和头部字段)的同时,对底层的传输机制进行了全面优化,主要目标是提升性能、减少延迟和优化资源加载。

2. HTTP/2 的核心特性

  • 多路复用(Multiplexing)
    • 在单个 TCP 连接上同时发送多个请求和响应,无需为每个请求建立独立连接。
    • 消除了 HTTP/1.1 中的队头阻塞问题。
  • 头部压缩(HPACK)
    • 使用高效的二进制编码压缩 HTTP 头部,减少重复传输相同头部字段带来的开销。
  • 流量优先级(Stream Prioritization)
    • 可为不同的请求分配优先级,优化关键资源的加载顺序。
  • 服务器推送(Server Push)
    • 服务器可以在客户端请求前主动推送资源(如 CSS、JS 文件)。
  • 更安全(通常通过 HTTPS 使用)
    • 虽然 HTTP/2 不强制加密,但主流浏览器要求通过 HTTPS 使用。

3. HTTP/2 的优势

  • 更快的页面加载速度。
  • 更高的带宽利用率。
  • 减少了延迟和连接开销。
  • 改善了移动网络环境下的访问体验。

二、Nginx 支持 HTTP/2 的环境要求

1. 软件版本要求

  • Nginx 版本
    • HTTP/2 支持从 1.9.5 开始引入。
    • 推荐使用 1.21 或更高版本,以获得最新的优化和功能。
  • OpenSSL 版本
    • 启用 HTTP/2 时,TLS 协商需要支持 ALPN(Application-Layer Protocol Negotiation)
    • OpenSSL 版本需为 1.0.2 或更高

2. 硬件要求

  • 无特殊硬件要求, HTTP/2 的多路复用可能增加服务器的 CPU 和内存使用。

三、Nginx 配置 HTTP/2 的详细教程

以下是配置 Nginx 支持 HTTP/2 的完整步骤。

1. 安装或升级 Nginx

检查当前 Nginx 版本
nginx -v
  • 如果版本低于 1.9.5,则需要升级。
  • 如果输出中包含 --with-http_v2_module,说明当前 Nginx 支持 HTTP/2。
  • 如果没有 --with-http_v2_module,说明当前 Nginx 不支持 HTTP/2。需要重新安装或编译Nginx。

2. 配置 HTTPS

HTTP/2 通常需要 HTTPS,因此需要先配置 SSL/TLS。

2.1 生成自签名证书(仅用于测试)
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout /etc/nginx/ssl/nginx.key \
    -out /etc/nginx/ssl/nginx.crt
2.2 安装 SSL 证书(生产环境)

3. 配置 Nginx 支持 HTTP/2

编辑 Nginx 配置文件(如 /etc/nginx/nginx.conf/etc/nginx/conf.d/default.conf):

基本配置
server {
    listen  8185 ssl http2;
    ssl_protocols TLSv1.3 TLSv1.2;  # 仅使用 TLS 1.3 和 1.2
    ssl_prefer_server_ciphers off;   # 优先使用服务器端的加密套件
    ssl_ciphers ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA
-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384;
    ssl_certificate /yourpath/server.crt;     # 替换证书文件路径
    ssl_certificate_key /yourpath/server.key; # 替换私钥文件路径

    # HTTP/2 参数优化
    http2_max_concurrent_streams 128;
    large_client_header_buffers 4 32k;

    server_name  localhost;
    root /usr/share/nginx/html/dist/;
    # 其他配置
    # ……
}
  • listen 8185 ssl http2;
    • 这行配置启用了 SSL 和 HTTP/2。
    • HTTP/2 会默认通过 ALPN 协议协商。如果客户端不支持 HTTP/2,Nginx 会自动回退到 HTTP/1.1,无需额外定义 listen 指令。
  • 使用 openssl 测试 ALPN:
openssl s_client -connect ip:port -alpn h2

如果输出中包含 ALPN protocol: h2,说明 ALPN 协商正常。


四、验证 HTTP/2 配置是否成功

1. 使用浏览器验证

  • 打开浏览器开发者工具(F12)。
  • 转到 Network(网络)面板
  • 查看 Protocol 列是否显示为 h2

2. 使用 nghttp 工具验证

安装 nghttp

sudo yum install nghttp2 -y   # CentOS/RedHat

运行测试:

nghttp -v https://example.com

如果输出中包含 The negotiated protocol: h2,说明 HTTP/2 正常工作。


五、常见问题及排查

1. 客户端不支持 HTTP/2

如果客户端不支持 HTTP/2,Nginx 会自动回退到 HTTP/1.1。

2. ALPN negotiation failed 错误

  • 确保服务器使用了支持 ALPN 功能的 OpenSSL 版本(1.0.2 或更高)。
  • 检查是否正确配置了 HTTPS 和 HTTP/2。

3. 配置问题导致请求头不规范

示例问题:

add_header X-Content-Type-Options: nosniff;
  • 原因X-Content-Type-Options: 的字段名中多了冒号。HTTP/2 对头字段格式要求严格。
  • 修正
add_header X-Content-Type-Options "nosniff";

4. 性能未显著提升

  • 检查是否开启了 Gzip 压缩。
  • 优化 http2_max_concurrent_streamskeepalive_timeout


http://www.kler.cn/a/430714.html

相关文章:

  • SpringBoot使用Validation校验参数
  • 在MySQL 主库上进行自动清理 purged gtid 时,会等待 binlog复制到从库吗
  • 优化 invite_codes 表的 SQL 创建语句
  • 鸿蒙开发:了解帧动画
  • information_schema是什么?
  • Spring Boot 项目创建
  • C缺陷与陷阱 — 3 深入理解表达式
  • 【LC】73. 矩阵置零
  • C语言——验证“哥德巴赫猜想”
  • C# 中识别图片中有几个人
  • Ubuntu上使用system()函数运行不需要输入密码
  • HBase分布式安装配置(Zookeeper+HBase)
  • 使用Spring Boot和JDBC实现MySQL数据库连接与操作
  • 3D 生成重建028-Hunyuan3D腾讯出品的单视图3d生成
  • UE5中的渲染目标(Render Target)
  • 调度系统:分析 Apache Airflow 和 Prefect 在 基于Couchbase构建数据仓库 和 ETL任务调度 的场景下,哪一个更合适
  • 一个简单带颜色的Map
  • HTML前端开发-- Iconfont 矢量图库使用简介
  • 各种服务器使用 yum 安装 nginx
  • 如何理解UDP 和 TCP? 区别? 应用场景?
  • c++中的逻辑符
  • sql server 创建索引实验
  • AI 直播:打造全新直播体验
  • 【51单片机】程序实验1112.外部中断-定时器中断
  • 学习笔记065——Java实现 Word 转 PDF
  • UE5 教程分享 事件分发器和接口的选择