NGINX开启HTTP3,给web应用提个速

环境说明

  1. linux
  2. docker
  3. nginx版本:1.27

HTTP3/QUIC介绍

rfc9114
HTTP3是由IETF于2022年发布的一个标准,文档地址为:https://datatracker.ietf.org/doc/html/rfc9114

如rfc9114所述,http3主要基于QUIC协议实现,在具备高性能的同时又兼备了可靠性的特点,在大多数场景下可提高web应用的访问速率。
quic/http3

关于http3和quic的介绍网上资料有很多,这里不再过多赘述。
nginx-news-2023
自nginx的1.25.0版本开始,nginx首次对http3进行了正式支持,这也为我们在WEB服务器上部署http3提供了极大的便利。
nginx-basic
本文以重实践角度出发,使用web服务器——NGINX,分享下如何在NGINX中开启HTTP3。

自签证书生成

nginx-http3-quic
http3必须依赖于TLS协议,所以需要要证书。本文为了演示方便,使用自签证书来进行操作。

自签证书仅用于验证或内网环境,生产环境需要使用公共证书,免费的有:certbot(Let’s Encrypt)

自签证书并部署到NGINX中,主要流程为:

  1. 生成CA证书,root_certificate
  2. 使用CA证书生成NGINX服务器所需要的网站证书,site_certificate
  3. 将site_certificate配置到nginx中

自签CA证书生成

#1.生成根证书私钥
openssl genpkey -algorithm RSA -out root_private_key.pem -pkeyopt rsa_keygen_bits:4096

#2.使用私钥创建CSR(证书签名请求)
openssl req -new -key root_private_key.pem -out root_csr.pem -subj "/C=CN/ST=SiChuan/L=ChengDu/O=HaiyangGroup/CN=HaiyangRootCA"
#如上面命令报Can't load /root/.rnd into RNG,可使用openssl rand -writerand ~/.rnd修复

#3.创建CA配置文件
vim v3_ca.cfg
---
[v3_ca]
basicConstraints = CA:TRUE
keyUsage = keyCertSign, cRLSign
---
#4.生成根证书,依赖CSR和CA配置文件
openssl x509 -req -days 3650 -in root_csr.pem -signkey root_private_key.pem -out root_certificate.pem -extensions v3_ca.cfg

站点https证书生成

#1.生成站点私钥
openssl genpkey -algorithm RSA -out site_private_key.pem -pkeyopt rsa_keygen_bits:2048
#2.生成站点CSR(证书签名请求),CN填写为对应的域名
openssl req -new -key site_private_key.pem -out site_csr.pem -subj "/C=CN/ST=SiChuan/L=BaZhong/O=HaiyangCompany/CN=www.puhaiyang.com"
#3.编写服务,alt_names部分修改为对应的域名和ip
vim site_openssl.cnf
---
[v3_req]
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = www.puhaiyang.com
DNS.2 = *.puhaiyang.com
IP.1 = 192.168.31.174
————————————————
#4.生成站点https证书,依赖CA证书、CA私钥、站点CSR
openssl x509 -req -in site_csr.pem -CA root_certificate.pem -CAkey root_private_key.pem -CAcreateserial -out site_certificate.pem -days 3650 -extensions v3_req -extfile site_openssl.cnf
---

生成的CA证书与站点证书文件列表如下:
site_ssl

验证根证书

#1.验证CA根证书
openssl x509 -in root_certificate.pem -text -noout
#2.验证站点证书
openssl x509 -in site_certificate.pem -text -noout

nginx-http3配置与运行

nginx基础配置

# 创建挂载目录
mkdir -p /data/docker/nginx/conf
mkdir -p /data/docker/nginx/log
mkdir -p /data/docker/nginx/html
mkdir -p /data/docker/nginx/certs
# 生成临时容器,
docker run --name nginx -d nginx
# 验证nginx是否开启了http3,查看有http_v3
docker exec -it nginx nginx -V
# 将容器nginx.conf文件复制到宿主机
docker cp nginx:/etc/nginx/nginx.conf /data/docker/nginx/conf/nginx.conf
# 将容器conf.d文件夹下内容复制到宿主机
docker cp nginx:/etc/nginx/conf.d /data/docker/nginx/conf/conf.d
# 将容器中的html文件夹复制到宿主机
docker cp nginx:/usr/share/nginx/html /data/docker/nginx/
# 关闭该临时容器
docker stop nginx
# 删除该临时容器
docker rm nginx

验证nginx时截图如下,需要确保nginx编译参数中开启了http3

docker exec -it nginx nginx -V
http3_nginx

nginx运行与站点配置

将生成的站点证书放到/data/nginx/certs目录下

cp site_private_key.pem /data/docker/nginx/certs/
cp site_certificate.pem /data/docker/nginx/certs/
#赋权限,确保有读取权限
chmod +r /data/docker/nginx/certs/*

创建nginx的站点配置

vi /data/docker/nginx/conf/conf.d/www.puhaiyang.com.conf
---
server {
    # http/3
    listen 443 quic reuseport;

    # http/2 and http/1.1
    listen 443 ssl;
    http2 on;

    server_name www.puhaiyang.com;  # customize to match your domain

    # you need to mount these files when running this container
    ssl_certificate     /usr/share/nginx/certs/site_certificate.pem;
    ssl_certificate_key /usr/share/nginx/certs/site_private_key.pem;

    # TLSv1.3 is required for QUIC.
    ssl_protocols TLSv1.2 TLSv1.3;

    # 0-RTT QUIC connection resumption
    ssl_early_data on;

    # Add Alt-Svc header to negotiate HTTP/3.
    add_header alt-svc 'h3=":443"; ma=86400';

    # Sent when QUIC was used
    add_header QUIC-Status $http3;

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

更多详细配置可参考:https://nginx.org/en/docs/http/ngx_http_v3_module.html

运行nginx-docker

因为http3基于QUIC协议,QUIC又基于UDP协议,在运行nginx的docker时记得将https的UDP端口也暴露到主机中。

docker run \
-p 80:80 -p 443:443 -p 443:443/udp \
--name nginx \
-v /data/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /data/docker/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /data/docker/nginx/log:/var/log/nginx \
-v /data/docker/nginx/html:/usr/share/nginx/html \
-v /data/docker/nginx/certs:/usr/share/nginx/certs \
-e TZ=Asia/Shanghai \
--restart=always \
-d nginx:latest

验证时可使用netstat查看udp端口是否正确被暴露,示例截图:
netstat

输入nginx -v命令查看使用的nginx版本是否为较高版本的nginx

docker exec -it nginx nginx -v
nginx-v

浏览器验证

nginx搭建好后,就可以使用浏览器进行验证了。

浏览器支持QUIC验证

验证前,需要确保浏览器(客户端)支持http3.0,可访问https://quic.nginx.org/进行验证。
quic-test

如提示支持quic,或quic包验证也通过,则说明客户端是支持http3的
browser

如不支持,可使用https://quic.nginx.org/提供的排查项进行逐步排查。

导入自签CA根证书到客户主机(可选)

如果是站点的tls证书是由自签ca证书生成的,为了让浏览器访问网站更优雅,可让先CA根证书导入到客户端系统中。
以本例为例,则需要导入的证书文件为:root_certificate.pem
在windows中打开certmgr.msc,将证书导入到受信任的根证书颁发机构即可
certmgr

访问自定义的http3站点

在浏览器中通过ip或域名访问搭建的站点。如本例中的:https://www.puhaiyang.com
(自定义虚拟域名需修改hosts文件)
browser-nginx-check
打开浏览器的检查功能,查看http请求协议是否为http/3。

还可以通过wireshark抓包进行验证
wireshark-quic
抓包协议栏显示为QUIC,则证明nginx配置http3成功啦~


下篇文章将使用实例,结合理论与实践,对比分析下http1.1、http2、http3在实际场景下的性能差别。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/873522.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TCP远程命令执行

目录 一. 命令集 二. 命令执行模块实现 三. 服务端模块实现 四. 服务端调用模块实现 五. 客户端模块实现 六. 效果展示 此篇教大家如何利用TCP进行远程命令执行。 一. 命令集 将值得信任的命令放进一个txt文件中,执行命令时,就去这…

elementUI根据列表id进行列合并@莫成尘

本文章提供了elementUI根据列表id进行列合并的demo&#xff0c;效果如图&#xff08;可直接复制代码粘贴&#xff09; <template><div id"app"><el-table border :data"tableList" style"width: 100%" :span-method"objectS…

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍&#xff11;、W25Q64简介&am…

小怡分享之数据结构LinkedList与链表

前言&#xff1a; &#x1f308;✨前面小怡给大家介绍了ArrayList&#xff0c;今天小怡给大家介绍一下链表。 1.ArrayList的缺陷 当在ArrayList任意位置插入或者删除元素时&#xff0c;就需要后续元素整体往前或者往后搬移&#xff0c;时间复杂度为O&#xff08;n&#xff09;…

网恋照妖镜源码搭建教程

文章目录 前言原理创建网站1.打开网站设置 配置ssl2.要打开强制HTTPS&#xff0c;用宝塔免费的ssl证书即可&#xff0c;也可以使用其他证书&#xff0c;必须是与域名匹配的3.上传文件至根目录进行解压4.解压后&#xff0c;修改文件 sc.php 里面的内容5.其余探索 结语 前言 前俩…

Excel和Word日常使用记录:

Excel使用总结 表格颜色填充&#xff1a; 合并单元格&#xff1a; 选中你要合并的单元格区域。 按下快捷键 Alt H&#xff0c;然后松开这些键。 再按下 M&#xff0c;接着按 C。 这个组合键执行的操作是&#xff1a;Alt H&#xff1a;打开“主页”选项卡。 M&#xff1a;选…

“阡陌云旅”黄河九省文化旅游平台

“阡陌云旅”黄河九省文化旅游平台 GitHub地址&#xff1a;https://github.com/guoJiaQi-123/Yellow-River-Cloud-Journey 项目背景 “阡陌云旅”黄河九省文化旅游平台 “阡陌云旅” 黄河九省文化旅游平台是一个专注于黄河流域九省文化旅游资源整合与推广的项目。 黄河是中…

[oeasy]python0004_游乐场_和python一起玩耍_python解释器_数学运算

和python玩耍 &#x1f94a; Python 回忆 上次 了解shell环境中的命令 <colgroup><col span"1"><col span"1"></colgroup> | 命令 | 作用 | | whoami | 显示当前用户名 | | pwd | 显示当前文件夹 | | ls | 列出当前文件夹下的内容…

51单片机的无线病床呼叫系统【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温湿度传感器模块矩阵按键时钟模块等模块构成。适用于病床呼叫系统、16床位呼叫等相似项目。 可实现基本功能: 1、LCD1602实时显示北京时间、温湿度信息、呼叫床位等信息&#xff1b; 2、DHT11采集病房温湿度信息&…

WSL 下的 CentOS 装 Docker

WSL 下的 CentOS 装 Docker 卸载旧版本安装前的准备工作1. 安装 yum-utils2. 添加阿里云的 yum 镜像仓库3. 快速生成 Yum 缓存 安装Docker启动docker运行 hello-world设置镜像加速器&#xff08;阿里云的&#xff09;卸载 Docker 引擎参考资料 卸载旧版本 sudo yum remove doc…

鸿蒙(API 12 Beta6版)超帧功能开发【ABR功能开发】

业务流程 基于相机运动感知策略的ABR主要业务流程如下&#xff1a; 用户进入ABR适用的游戏场景。游戏应用调用[HMS_ABR_CreateContext]接口并指定图形API类型&#xff0c;创建ABR上下文实例。游戏应用调用[HMS_ABR_SetTargetFps]接口初始化ABR实例&#xff0c;配置目标帧率属性…

excel透视图、看板案例(超详细)

一、简介 Excel透视图&#xff08;Pivot Table&#xff09; 功能&#xff1a;透视图是一种强大的数据分析工具&#xff0c;用于汇总、分析和展示数据。它允许用户对数据进行重新排列和分类&#xff0c;从而更容易发现数据中的模式和趋势。用途&#xff1a;可以用来生成动态报表…

【Python机器学习】词向量推理——词向量

目录 面向向量的推理 使用词向量的更多原因 如何计算Word2vec表示 skip-gram方法 什么是softmax 神经网络如何学习向量表示 用线性代数检索词向量 连续词袋方法 skip-gram和CBOW&#xff1a;什么时候用哪种方法 word2vec计算技巧 高频2-gram 高频词条降采样 负采样…

fastadmin 文件上传七牛云

1-安装七牛云官方SDK composer require qiniu/php-sdk 2-七牛云配置 <?phpnamespace app\common\controller;use Qiniu\Storage\BucketManager; use think\Config; use Qiniu\Auth; use Qiniu\Storage\UploadManager; use think\Controller; use think\Db;/*** 七牛基类*…

echarts 实现签到记录日历组件

以下笔记来源&#xff1a;编程导航 分析 有三种基本图表可以选择&#xff1a; 基础日历图&#xff1a;https://echarts.apache.org/examples/zh/editor.html?ccalendar-simple日历热力图&#xff1a;https://echarts.apache.org/examples/zh/editor.html?ccalendar-heatmap…

使用paddlerocr识别固定颜色验证码

1 引言 本文使用opencv和paddlerocr识别出固定颜色的验证码&#xff0c;原理不解释&#xff0c;安装包的方法自行查找&#xff0c;只提供代码和思路。 1 使用opencv对特定颜色区域进行提取2 使用paddlerocr识别并输出验证码 2 代码 2.1 读取图片&#xff0c;提取蓝色区域 …

C语言深入理解指针4

1.回调函数 回调函数是通过函数指针调用的函数 将函数指针作为参数传递给另一个函数&#xff0c;当这个函数指针被用来调用其所指向的函数时&#xff0c;被调用的函数就是回调函数&#xff0c;回调函数不是应该由该函数的实现方直接调用&#xff0c;而是在特定的事件或条件发生…

ASIO网络调试助手之一:简介

多年前&#xff0c;写过几篇《Boost.Asio C网络编程》的学习文章&#xff0c;一直没机会实践。最近项目中用到了Asio&#xff0c;于是抽空写了个网络调试助手。 开发环境&#xff1a; Win10 Qt5.12.6 Asio(standalone) spdlog 支持协议&#xff1a; UDP TCP Client TCP Ser…

JavaWeb【day11】--(SpringBootWeb案例)

SpringBootWeb案例 前面我们已经实现了员工信息的条件分页查询以及删除操作。 关于员工管理的功能&#xff0c;还有两个需要实现&#xff1a; 新增员工 修改员工 首先我们先完成"新增员工"的功能开发&#xff0c;再完成"修改员工"的功能开发。而在&quo…

【C++】STL学习——priority_queue(了解仿函数)

目录 priority_queue介绍迭代器种类priority_queue实现仿函数仿函数的使用 priority_queue介绍 优先队列是一种容器适配器&#xff0c;根据严格的弱排序标准&#xff0c;它的第一个元素总是它所包含的元素中最大的。此上下文类似于堆&#xff0c;在堆中可以随时插入元素&#x…