• home > tools > webServer > nginx >

    nginx支持HTTP3实操指南:centOS8上nginx升级至1.25.0以上

    Author:zhoulujun Date:

    之前写过:centos8 yum升级nginx至最新版本的方法与下载安装nginxNginx葵花宝典—草根站长配置Nginx运维百科全书phpcms v9站http升级到ht

    之前写过:

    今天我们看下如何让nginx支持http3?

    nginx官方支持http3

    之前可以通过candy 或者nginx插件来实现http3。

    Quiche 是一个由 Cloudflare 创建的 QUIC 传输协议和 HTTP/3 的 Rust 实现,可以与 NGINX 一起使用。

    具体参考: 《在Nginx当中支持QUIC协议

    如果使用Cloudflare,即使你网站没有配置http2 http3 ,Cloudflare都会帮你搞好

    具体查看:Cloudflare的PageRule设置规则详解:静态页面资源缓存配置

    从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.

    https://nginx.org/en/CHANGES

    到今天,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 之间的一些主要区别:

    1. 性能改进:dnf 有更好的性能,它使用 hawkey 库进行依赖关系解析,这使得软件包依赖项的计算更为高效和快速。

    2. 更好的依赖关系解算dnf 提供了更加一致和可预测的依赖解析

    3. 使用 libsolv:dnf 使用 libsolv 库进行软件包依赖关系解决,这是 SUSE 开发的一个依赖关系解决器。

    4. 回滚功能:dnf 支持有限的事务历史记录和回滚功能

    5. 更干净的依赖包处理:与 yum 相比,dnf 在移除不需要的依赖包时处理得更好

    6. 插件差异:dnf 的插件与 yum 的并不完全兼容。

    7. 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的错误。根本跑步起来,比如下面的文章:

    其是添加了  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