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/3listen 443 quic reuseport;# http/2 and http/1.1listen 443 ssl;http2 on;server_name www.puhaiyang.com;  # customize to match your domain# you need to mount these files when running this containerssl_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 resumptionssl_early_data on;# Add Alt-Svc header to negotiate HTTP/3.add_header alt-svc 'h3=":443"; ma=86400';# Sent when QUIC was usedadd_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.rhkb.cn/news/421659.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最全面的递归算法详解,一篇足矣(高手必备)

在编程中,递归和循环是两种常用的控制结构,各有其独特的优缺点。理解这两者的特点和应用场景,对于编写高效、可读的代码至关重要。 什么是递归? 递归是一种强大的编程技术,允许函数在其定义中调用自身。递归通常涉及…

nvm ls-remote: N/A

背景: 项目因为node版本问题运行失败,在彻底删除node后再重新安装 问题描述: 原因分析: 可能是因为终端不能获取镜像包 解决办法: 【方法一】 输入: step1. export NVM_NODEJS_ORG_MIRRORIndex of …

常用电路及分析

前言 最近在研究一些简单的硬件知识,把在网上看到的一些常见电路分析总结了一下。 有纰漏请指出,转载请说明。 学习交流请发邮件 1280253714qq.com 串联稳压电路 三极管串联线性稳压电路原理详解及Multisim仿真_三极管稳压电路-CSDN博客 线性稳压电…

LeetCode 206. 反转链表

题目描述 分析 迭代代码与之前的K个一组翻转链表相同。 递归代码的一个首要任务是找到整个链表的尾结点(反转后的头结点)。 之后一步一步地将tail结点向前返回,但在返回的过程中不利用,只是传递最终答案。绿线的操作就是当head…

空间数据库概述

空间数据库简介 空间数据库是 地理信息系统 在计算机物理存储介质中存储的,与GIS应用相关的地理空间数据的总和。一般以一系列特定结构的文件形式组织后存储在介质上。 空间数据库的特点 可以存储、处理空间数据相比普通数据库提供更多、更复杂的数据类型以及更多…

即插即用篇 | YOLOv8 引入维度互补注意力混合Transformer模块 | 轻量级互补注意力网络:RAMiT引领图像修复新突破

本改进已同步到YOLO-Magic框架! 摘要:虽然许多近期的研究在图像修复(IR)领域取得了进展,但它们通常存在参数数量过多的问题。另一个问题是,大多数基于Transformer的图像修复方法只关注局部或全局特征,导致感受野有限或参数不足的问题。为了解决这些问题,我们提出了一种…

Linux_kernel移植rootfs10

一、动态更改内核 1、low level(静态修改) 【1】将led_drv.c拷贝到kernel/drivers/char/目录中 【2】修改当前目录下的Makefile文件 obj-y led_drv.o #将新添加的驱动文件加入到Makefile文件中 【3】退回kernel目录,执行make uImage …

2024.9.11(k8s环境搭建)

一、k8s环境搭建 编号主机名称ip配置1k8s-master192.168.8.1772k8s-node1192.168.8.1783k8s-node2192.168.8.168 1、免密登录 [rootk8s-master ~]# ssh-keygen [rootk8s-master ~]# ssh-copy-id root192.168.8.178 [rootk8s-master ~]# ssh-copy-id root192.168.8.168 2、3台…

西安近期学术会议,诚邀学者参会投稿!

第十二届信息系统与计算技术国际会议(ISCTech 2024)由长沙理工大学主办,联合同济大学、西北工业大学、江西农业大学协办,并由IEEE西安分会提供技术支持,会议将于11月8日至11日在中国西安隆重举行。ISCTech系列会议自创…

Golang | Leetcode Golang题解之第392题判断子序列

题目&#xff1a; 题解&#xff1a; func isSubsequence(s string, t string) bool {n, m : len(s), len(t)f : make([][26]int, m 1)for i : 0; i < 26; i {f[m][i] m}for i : m - 1; i > 0; i-- {for j : 0; j < 26; j {if t[i] byte(j a) {f[i][j] i} else {…

java设计模式(行为型模式:状态模式、观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式、解释器模式)

6&#xff0c;行为型模式 6.5 状态模式 6.5.1 概述 【例】通过按钮来控制一个电梯的状态&#xff0c;一个电梯有开门状态&#xff0c;关门状态&#xff0c;停止状态&#xff0c;运行状态。每一种状态改变&#xff0c;都有可能要根据其他状态来更新处理。例如&#xff0c;如果…

突破性进展!只需单张参考图,完美仿写各种手写内容!华南理工等开源One-DM

文章链接&#xff1a;https://arxiv.org/pdf/2409.04004 git链接&#xff1a;https://github.com/dailenson/One-DM 亮点直击 提出一种创新的扩散模型&#xff0c;用于生成风格化的手写文本。这一模型的显著特点是只需一个参考样本作为风格输入&#xff0c;便能模仿该样本的书写…

索引:数据库查询性能提升的利器

在数据库的世界里&#xff0c;索引就像是一把神奇的钥匙&#xff0c;能够极大地提高查询性能。那么&#xff0c;什么是索引呢&#xff1f;它又是如何发挥作用的呢&#xff1f;让我们一起来揭开索引的神秘面纱。 一、什么是索引&#xff1f; 索引&#xff0c;简单来说&#xf…

【机器学习-监督学习】集成学习与梯度提升决策树

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科&#xff0c;通过算法和模型让计算机从数据中学习&#xff0c;进行模型训练和优化&#xff0c;做出预测、分类和决策支持。Python成为机器学习的首选语言&#xff0c;…

chapter14-集合——(List-HashSet)——day18

目录 519-HashSet全面说明 520-数组链表模拟 521-HashSet扩容机制 重要 522-HashSet源码解读1 526-HashSet最佳实践 527-hashSet思考题 519-HashSet全面说明 题一、 两个tom都可以添加成功是因为这是两个对象 看源码做分析&#xff1a;不是直接指向常量池的吗&#xff1f;…

2024/9/9 408“回头看”:b树

B树是什么&#xff1f;有什么作用&#xff1f;B树的插入和删除具体细节是什么&#xff1f;除了B树还有一个是B&#xff0b;树、还是B-树&#xff0c;他们有什么区别&#xff0c;又有什么相同点&#xff1f; b树在王道考研查找这一章&#xff0c;所以他的主要作用就是查找。 在…

【python】OpenCV—Age and Gender Classification

文章目录 1、任务描述2、网络结构2.1 人脸检测2.2 性别分类2.3 年龄分类 3、代码实现4、结果展示5、参考 1、任务描述 性别分类和年龄分类预测 2、网络结构 2.1 人脸检测 输出最高的 200 个 RoI&#xff0c;每个 RoI 7 个值&#xff0c;&#xff08;xx&#xff0c;xx&#x…

基于SpringBoot+Vue+MySQL的校园生活服务平台

系统展示 用户前台界面 管理员后台界面 系统背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往是人们思想上不可跨域的鸿沟&#xff0c;信息的…

C++当中的多态(一)

&#xff08;一&#xff09;什么是多态 1.现实中的多态&#xff1a; 所谓的多态在我们的生活当中其实很常见。举一个简单的例子&#xff1a;当我们需要买票的时候有很多种不同的票可以供我们购买&#xff0c;如果你是学生就可以享受半价票的优惠&#xff0c;如果你是VIP用户就可…

Leetcode 只出现一次的元素

题目要求我们找到数组中只出现了一次的元素&#xff0c;而其他元素都出现了两次。 解题思路&#xff1a; 我们可以使用位运算中的异或操作&#xff08;XOR&#xff09;。异或操作有以下两个特性&#xff1a; 相同的两个数字异或结果为0&#xff0c;例如&#xff1a;a ^ a 0…