nginx支持HTTP3实操指南:centOS8上nginx升级至1.25.0以上
Author:zhoulujun Date:
之前写过:
服务器升级至centos8 网站配置-php与mysql从5.6升级到php7与msyql8 (nginx支持http2)
今天我们看下如何让nginx支持http3?
nginx官方支持http3
之前可以通过candy 或者nginx插件来实现http3。
Quiche 是一个由 Cloudflare 创建的 QUIC 传输协议和 HTTP/3 的 Rust 实现,可以与 NGINX 一起使用。
具体参考: 《在Nginx当中支持QUIC协议》
如果使用Cloudflare,即使你网站没有配置http2 http3 ,Cloudflare都会帮你搞好。
从nginx1.25.0 开始,nginx原生支持http3了——https://nginx.org/en/docs/quic.html
Changes with nginx 1.25.0 23 May 2023
*) Feature: experimental HTTP/3 support.
到今天,nginx都1.25.3版本了,官方最新稳定版(nginx-1.24.0)还是不支持http3。直接yum 安装是不行的……
如何安装nginx最新版本——非稳定版本的最新版
首先是查看自己的nginx与linux版本,然后再做相应的操作
查看系统版本:
cat /etc/*release
CentOS Linux release 8.3.2011 NAME="CentOS Linux" VERSION="8" ID="centos" ID_LIKE="rhel fedora" VERSION_ID="8" PLATFORM_ID="platform:el8" PRETTY_NAME="CentOS Linux 8" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:centos:centos:8" HOME_URL="https://centos.org/" BUG_REPORT_URL="https://bugs.centos.org/" CENTOS_MANTISBT_PROJECT="CentOS-8" CENTOS_MANTISBT_PROJECT_VERSION="8" CentOS Linux release 8.3.2011 CentOS Linux release 8.3.2011
查看nginx版本:
nginx -v
nginx version: nginx/1.14.1
我的系统是centOS8,现在官方不再维护。默认使用yum只能安装nginx/1.14.1
建议使用centOS stream 9,具体查看《CentOS 8升级到CentOS Stream 9》
CentOS Linux 7 EOL: 2024-06-30
CentOS Linux 8 EOL: 2021-12-31
CentOS Stream 8 EOL: 2024-05-31
CentOS Stream 9 EOL: 估计到 2027, 取决于 RHEL9 “全力支持阶段” 终止时间
CentOS Stream 8与CentOS 8的区别是什么?https://www.zhoulujun.cn/html/OS/Linux/LinuxDevops/8804.html
再不升级CentOS的情况下,如何升级nginx?
更新nginx至最新版本/指定版本
手动设置nginx仓库版本:
vi /etc/yum.repos.d/nginx.repo
我们将添加以下内容(适用于 CentOS 8,你可以在 Nginx 官方文档 页面找到适用于其他版本的类似指令):
[nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true
这里的 [nginx-stable] 表示是稳定版本。
在配置 Nginx 仓库时,可以选择安装稳定版(stable)或者最新版(mainline)。
如果你不想使用稳定版本,而想使用最新版本,则需要指定 Nginx 的 mainline 版本仓库。
[nginx-mainline] name=nginx mainline repo baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true
注意:确保 $releasever 和 $basearch 能正确反映你的系统版本和架构,例如 8 或 7 以及 x86_64。
如果你之前添加了 nginx 的稳定版本仓库,你可能需要先禁用或者删除那个仓库的配置文件,或者在安装时指定要使用 mainline 仓库。如果两者都配置了,你可以在安装 nginx 时使用 --enablerepo 或 --disablerepo 选项来选择你想要使用的仓库。
yum --enablerepo=nginx-mainline install nginx
这里推荐使用dnf
yum
(Yellowdog Updater, Modified)和dnf
(Dandified YUM)都是基于 RPM(Red Hat Package Manager)的软件包管理器,用于安装、更新和删除软件包。dnf
是yum
的后继者,旨在提供更好的性能和特性。dnf
在 Fedora 22 中被引入并成为了其默认的包管理器。从 CentOS 8 开始,dnf
取代了yum
成为默认的包管理工具。下面是
dnf
和yum
之间的一些主要区别:
性能改进:
dnf
有更好的性能,它使用 hawkey 库进行依赖关系解析,这使得软件包依赖项的计算更为高效和快速。更好的依赖关系解算:
dnf
提供了更加一致和可预测的依赖解析。使用 libsolv:
dnf
使用 libsolv 库进行软件包依赖关系解决,这是 SUSE 开发的一个依赖关系解决器。回滚功能:
dnf
支持有限的事务历史记录和回滚功能。更干净的依赖包处理:与
yum
相比,dnf
在移除不需要的依赖包时处理得更好。插件差异:
dnf
的插件与yum
的并不完全兼容。API:
dnf
提供了稳定的 Python API,便于开发者使用。由于它们底层处理依赖和仓库的方式不同,通常在使用时你会发现
dnf
要快一些,并且在处理复杂依赖关系时更为准确。然而,对于基本操作,如安装或更新软件包,yum
和dnf
命令行语法基本保持一致,因此对于用户而言,从yum
迁移到dnf
通常是无缝的。
配置完成后,就可以安装
安装最新的nginx
首先备份nginx
cp -r /etc/nginx/ /etc/nginx-backup #或者 mv /etc/nginx/ /etc/nginx-backup
然后再安装最新版本的
dnf remove nginx nginx-module-* #卸载nginx 和nginx的模块 dnf clean all rm -r /var/cache/dnf dnf makecache dnf install nginx
如果出现:
Error unpacking rpm package nginx-1:1.24.0-1.el8.ngx.x86_64
我通过下面命令解决
rm -rf /etc/nginx/
手工安装
手动下载 Nginx 的 RPM 包并尝试安装它。
dnf download --url nginx
我一般是直接手撸
wget <RPM-URL>
地址从哪里找:
http://nginx.org/packages/mainline/centos/
比如我要下载最新的报,就是:http://nginx.org/packages/mainline/centos/8/x86_64/RPMS/nginx-1.25.3-1.el8.ngx.x86_64.rpm
wget http://nginx.org/packages/mainline/centos/8/x86_64/RPMS/nginx-1.25.3-1.el8.ngx.x86_64.rpm
可以看官方的版本 https://nginx.org/en/download.html 替换版本号即可
然后安装
rpm -ivh nginx-1.x.x-1.el8.ngx.x86_64.rpm
手工安装,可能还需要自己去配置一些权限,不建议。
nginx配置http3
之前的我的配置是:
server { server_name zhoulujun.net www.zhoulujun.net; listen 80; listen 443 ssl http2; ssl_certificate /etc/nginx/ssl_certificate/zhoulujun.co/zhoulujun.co_bundle.crt; ssl_certificate_key /etc/nginx/ssl_certificate/zhoulujun.co/zhoulujun.co.key; ssl_session_timeout 5m; ssl_protocols TLSv1.2 TLSv1.3; #按照这个协议配置 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置 ssl_prefer_server_ciphers on; }
现在可以改为:
server { server_name zhoulujun.net www.zhoulujun.net; listen 80; listen 80; listen [::]:80; listen 443 ssl; listen [::]:443 ssl; http2 on; listen 8080 quic reuseport; # HTTP/1.1 和 HTTP/2 连接的相同端口上同时侦听 HTTP/3 连接,此处为 8080 端口。 add_header Alt-Svc 'h3=":8080"; ma=86400'; #告知浏览器可以升级到 QUIC 以及连接哪个端口。 #ma 的值是客户端可有把握地认为 NGINX 通过 UDP 接受 HTTP/3 流量的秒数:超过这个时间后,客户端需要恢复为 TCP。 listen [::]:8080 quic reuseport; #listen 443; #ssl on; ssl_session_timeout 5m; ssl_protocols TLSv1.2 TLSv1.3; #按照这个协议配置 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置 ssl_prefer_server_ciphers on; ssl_early_data on; ssl_stapling on; ssl_stapling_verify on; }
这里需要注意点是:
listen 443 ssl http2;
需要改为
listen 443 ssl; listen [::]:443 ssl; http2 on;
这里改动有2个点:
[::] 表示监听ipv6,现在没有理由不支持ipv6
nginx http2 支持,改为 由 listen 443 ssl http2; 改为 listen 443 ssl;http2 on;
That’s all there is to it! You just have to declare “http2” and turn it on!不然会恶心你:
nginx: [warn] the "listen ... http2" directive is deprecated, use the "http2" directive instead
第二个
server { server_name zhoulujun.net www.zhoulujun.net; listen 80; add_header Alt-Svc 'h3=":443"; ma=86400'; listen 80; listen [::]:80; http2 on; listen 443 quic reuseport; listen [::]:443 quic reuseport; #listen 443; #ssl on; ssl_session_timeout 5m; ssl_protocols TLSv1.2 TLSv1.3; #按照这个协议配置 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置 ssl_prefer_server_ciphers on; }
这个在我本地跑不起来,这个原因还需要进一步查一下。
网上很多文章配置的:
server { listen 80; listen 443 quic; listen 443 ssl; http2 on; add_header Alt-Svc 'h3=":443"; ma=86400'; server_name aiccrop.com ...; ssl_early_data on; }
其是回报重复 监听443的错误。根本跑步起来,比如下面的文章:
升级 NGINX 以启用 HTTP/3(QUIC) 支持 https://aiccrop.com/article/2023/upgrade-nginx-add-http3-quic-support/
Nginx 1.25.0启用HTTP3支持 https://www.jdon.com/66589.html
其是添加了 add_header Alt-Svc 'h3=":443"; ma=86400'; 就可以了
使用
listen 443 ssl quic;
替代
listen 443 quic; listen 443 ssl;
我的系统发现是不可以的。会:
nginx: [emerg] duplicate listen options for 0.0.0.0:443 http3 http2
具体求各位大佬,赐教,多谢。
后续有空我再研究下
转载本站文章《nginx支持HTTP3实操指南:centOS8上nginx升级至1.25.0以上》,
请注明出处:https://www.zhoulujun.cn/html/tools/webServer/nginx/2023_1214_8991.html