宝塔NGINX优化-启用 QUIC 与 Brotli

宝塔NGINX优化-启用 QUIC 与 Brotli

建议阅读宝塔NGINX优化-升级OpenSSL提升HTTP3性能-ღ星晴这篇文章一起使用。

启用 QUIC/HTTP3 可以提高网络连接的速度和可靠性,它需要 UDP 协议,这意味着服务器的防火墙必须对 443 端口的 TCP 与 UDP 协议放行,建议询问你服务器厂商UDP是否可以打开。

安装 ngx_brotli

如果要让 Nginx 支持 Brotli 压缩 ,首先需要安装 ngx_brotli 模块,具体方式如下:

sudo -i
# 切换到root用户

cd /www/server
git clone --recurse-submodules -j8 https://github.com/google/ngx_brotli
#克隆 ngx_brotli 模块

国内主机连接github.com可能速度较慢,甚至连接失败。可以联系主机服务商或尝试在/etc/hosts文件中添加以下代码:

20.27.177.113 github.com
20.27.177.113 *.github.com

添加 ngx_brotli 编译参数

echo "--add-module=/www/server/ngx_brotli" > /www/server/panel/install/nginx_configure.pl

以上添加方式适合所有 Nginx 版本安装,且包括未来升级或切换 Nginx 版本无需再另行添加。

编译安装 Nginx 1.26.x

在宝塔面板软件商店中选择 Nginx 1.26 并点击编译安装即可。

如果安装成功,可以看到如下提示:

d2b5ca33bd20250202115824

部分 Ubuntu 系统镜像可能没有 libxml2 和 libxslt 库,会导致安装失败。具体错误提示为:

./configure: error: the HTTP XSLT module requires the libxml2/libxslt
libraries. You can either do not enable the module or install the libraries.

可以通过以下指令安装:

sudo apt-get install libxml2 libxslt-dev
#安装 libxml2 和 libxslt 库

安装完毕后,再执行 Nginx 1.26 编译安装

配置 Brotli 压缩

在宝塔面板中,点开 Nginx 设置 > 配置修改,并搜索 gzip_disable ,如下所示:

d2b5ca33bd20250202115920

在这一行的下方插入以下内容:

brotli on;
brotli_comp_level 6;    #压缩等级,默认6,最高11,高的压缩等级需要更多的CPU
brotli_buffers 16 8k;   #请求缓冲区的数量和大小
brotli_min_length 20;   #指定压缩数据的最小字节数,只有大于或等于最小长度才会对其压缩。
brotli_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/json image/svg application/font-woff application/vnd.ms-fontobject application/vnd.apple.mpegurl image/x-icon image/jpeg image/gif image/png image/bmp application/vnd.api+json;	#指定允许进行压缩类型
brotli_static always;   #是否允许查找预处理好的、以.br结尾的压缩文件,可选值为on、off、always
brotli_window 512k;     #窗口值,默认值为512k

保存并重启 Nginx 。

经过以上配置后,Nginx 将支持 Gzip 与 Brotli,浏览器支持 Brotli 的情况下,会默认启用 Brotli 压缩。

下面是完整的Nginx的优化配置,供大家参考:

# 运行用户
user www www;

# 工作进程数,通常设置为CPU核心数
worker_processes auto;

# 错误日志配置,使用crit级别减少不必要的日志
error_log /www/wwwlogs/nginx_error.log crit;
pid /www/server/nginx/logs/nginx.pid;

# 最大打开文件数
worker_rlimit_nofile 65535;  # 增加到65535以支持更多并发连接

# TCP流配置
stream {
    # 日志格式定义
    log_format tcp_format '$time_local|$remote_addr|$protocol|$status|$bytes_sent|$bytes_received|$session_time|$upstream_addr|$upstream_bytes_sent|$upstream_bytes_received|$upstream_connect_time';
    
    # 访问日志配置
    access_log /www/wwwlogs/tcp-access.log tcp_format buffer=32k; # 添加缓冲
    error_log /www/wwwlogs/tcp-error.log;
    include /www/server/panel/vhost/nginx/tcp/*.conf;
}

# 事件模块配置
events {
    use epoll;  # 使用epoll事件驱动,性能更好
    worker_connections 65535;  # 增加每个worker进程的最大连接数
    multi_accept on;  # 允许一次接受多个连接
    accept_mutex on;  # 添加accept锁,避免惊群效应
}

# HTTP模块配置
http {
    include mime.types;
    include proxy.conf;
    
    # 基础配置
    default_type application/octet-stream;
    server_names_hash_bucket_size 512;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;
    client_max_body_size 50m;
    
    # 优化文件传输
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    
    # 超时设置
    keepalive_timeout 65;  # 适当增加保持连接超时
    keepalive_requests 100;  # 添加单个连接最大请求数
    send_timeout 10;  # 添加发送超时

    # FastCGI配置优化
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 256k;
    fastcgi_intercept_errors on;
    fastcgi_cache_use_stale error timeout invalid_header http_500;  # 添加缓存策略

    # Gzip压缩配置优化
    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 4;  # 调整为4,在压缩率和CPU消耗之间取得平衡
    gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/json 
               image/jpeg image/gif image/png font/ttf font/otf image/svg+xml application/xml+rss text/x-js
               application/x-httpd-php application/x-yaml;  # 增加更多MIME类型
    gzip_vary on;
    gzip_proxied any;  # 修改为any以支持所有代理请求
    gzip_disable "MSIE [1-6]\.";

    # Brotli压缩配置优化
    brotli on;
    brotli_comp_level 4;    # 调整为4,在压缩率和CPU消耗之间取得平衡
    brotli_buffers 16 8k;
    brotli_min_length 20;
    brotli_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml 
                 application/json image/svg application/font-woff application/vnd.ms-fontobject application/vnd.apple.mpegurl 
                 image/x-icon image/jpeg image/gif image/png image/bmp application/vnd.api+json;
    brotli_static always;
    brotli_window 512k;

    # 连接限制
    limit_conn_zone $binary_remote_addr zone=perip:10m;
    limit_conn_zone $server_name zone=perserver:10m;
    limit_conn perip 20;  # 添加每个IP的连接数限制
    limit_conn perserver 1000;  # 添加每个服务器的连接数限制
    limit_rate 1024k;  # 添加连接速率限制

    # 安全配置
    server_tokens off;  # 隐藏版本号
    add_header X-Frame-Options SAMEORIGIN;  # 防止点击劫持
    add_header X-Content-Type-Options nosniff;  # 防止MIME类型嗅探
    add_header X-XSS-Protection "1; mode=block";  # XSS防护
    add_header Strict-Transport-Security "max-age=31536000";  # HSTS配置

    # 访问日志配置
    access_log off;  # 关闭主访问日志
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    # phpMyAdmin服务器配置
    server {
        listen 888;
        server_name phpmyadmin;
        index index.html index.htm index.php;
        root /www/server/phpmyadmin;

        # 启用PHP支持
        include enable-php.conf;

        # 静态文件缓存
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
            expires 30d;
            access_log off;  # 关闭静态文件访问日志
            add_header Cache-Control "public";  # 添加缓存控制
        }

        location ~ .*\.(js|css)$ {
            expires 12h;
            access_log off;
            add_header Cache-Control "public";
        }

        # 安全配置
        location ~ /\. {
            deny all;
            access_log off;
            log_not_found off;
        }

        # 添加基本的安全头
        add_header X-Frame-Options SAMEORIGIN;
        add_header X-Content-Type-Options nosniff;
        add_header X-XSS-Protection "1; mode=block";

        # 访问日志
        access_log /www/wwwlogs/access.log main buffer=32k;  # 添加日志缓冲
    }

    # 包含其他配置文件
    include /www/server/panel/vhost/nginx/*.conf;
}

配置 QUIC/HTTP3 站点

在宝塔面板中开设站点的默认配置并不会让 QUIC/HTTP3 生效 ,如启用需按下方步骤对主机配置文件进行配置:

  1. 必须配置 SSL 证书启用HTTPS。
  2. 启用 TLSv1.3 (默认已启用)。
  3. 防火墙对 443 端口的 UDP 协议放行,如果使用的云服务器有可能还需在服务商的控制台中配置防火墙。

d2b5ca33bd20250202120219

  1. 在站点配置文件中查找: add_header Alt-Svc 'quic=":443"; h3-27=":443";h3-25=":443"; h3-T050=":443"; h3-Q050=":443";h3-Q049=":443";h3-Q048=":443"; h3-Q046=":443"; h3-Q043=":443"';

    替换为:

add_header Alt-Svc 'h3=":443"; ma=86400';
  1. 为第一个启用HTTP/3的站点添加 reuseport 参数,查找 listen 443 quic; 约第5行,修改成:
listen 443 quic reuseport; # 仅能有一个站点使用该参数

值得注意的是 reuseport 参数必须有一个站点使用,且仅可配置一个站点,其它站点不需要该参数也能使用 quic。

完整配置实例

server
{
    listen 80;
    listen 443 ssl;
    listen 443 quic reuseport;
    http2 on;
    server_name test.zhanzhangb.com;
    index index.php index.html index.htm default.php default.htm default.html;
    root /www/root/test.zhanzhangb.com;
    #CERT-APPLY-CHECK--START
    # 用于SSL证书申请时的文件验证相关配置 -- 请勿删除
    #include /www/server/panel/vhost/nginx/well-known/test.zhanzhangb.com.conf;
    #CERT-APPLY-CHECK--END

    #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
    #error_page 404/404.html;
    ssl_certificate    /www/server/panel/vhost/cert/test.zhanzhangb.com/fullchain.pem;
    ssl_certificate_key    /www/server/panel/vhost/cert/test.zhanzhangb.com/privkey.pem;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    add_header Strict-Transport-Security "max-age=31536000";
    add_header Alt-Svc 'h3=":443"; ma=86400';
    error_page 497  https://$host$request_uri;

# 省略 n 行……

配置其它站点时,省略添加 reuseport 参数的步骤即可,否则会出错。

注意

HTTP/3 是第三个主要版本的HTTP协议。与其前任HTTP/1.1和HTTP/2不同,它将弃用 TCP 协议,改为使用基于 UDP 协议的 QUIC 协议实现。虽然目前全面支持 HTTP/3 的网站数量还较少,但所有主流浏览器均已支持 HTTP/3 ,足以说明它是未来发展趋势。

且目前支持http3的cdn,貌似要收费。

下载

海外服务器不用管,主要是国内服务器,GitHub访问不敢恭维,在这里我把我服务器git好的文件打包供大家下载,不用忍受GitHub龟速下载。

上传到自己的服务器解压就可以了。

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容