跳转至

NGINX-MOD

如您所知,我们的仓库 保存了最新的稳定版 NGINX 及其大量动态模块。

然而,一些注重性能的人总是希望进一步加速已经很快的东西——也就是 NGINX 本身。

有一些开源补丁,主要由 Cloudflare 提供,以进一步改善性能。 为了方便许多依赖手动编译的人,我们将这个更好的补丁 NGINX 构建为一个与我们所有 NGINX 模块兼容的包! 它的官方名称是 NGINX-MOD。

NGINX-MOD 基于最新的 稳定 NGINX,并增加了以下功能:

  • 无缝的 HTTP/3 支持:通过最前沿的 HTTP/3 协议体验更快、更可靠的网络连接。
  • 增强的 HTTP/2 HPACK 压缩:通过优化的头部压缩提升您网站的性能,确保更快的数据传输。
  • 动态 TLS 记录管理:通过动态处理的 TLS 记录提高安全性和速度,实时适应您网站的需求。
  • 高级速率限制:通过扩展的 ngx_http_limit_req_module 获得对流量的精确控制,允许您按小时、每天、每周或每年设置请求限制。
  • 主动健康监测:通过对上游服务器的实时健康检查保持高正常运行时间和可靠性。了解更多
  • 增强的安全功能:通过禁用在 Server: 头和错误页面中显示 NGINX 软件名称来保护您的服务器信息。
  • 使用 CONNECT 方法的安全 SSL 代理:使用 CONNECT 方法处理和代理 SSL 请求,确保安全高效的数据传输。
  • 暗模式支持:NGINX 错误页面的自动暗模式支持。
  • HTTP/3 的 Host 头仿真$http_host 从 authority 初始化,提供更好的与依赖 Host 头的应用程序的兼容性。

今天就升级到 GetPageSpeed,充分利用这些先进的 NGINX-MOD 功能来优化您网站的性能、安全性和可靠性!

有关这些补丁的更多信息,请参见下面的文档。

如何安装 NGINX-MOD

dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install dnf-plugins-core
dnf config-manager --disable getpagespeed-extras-mainline
dnf config-manager --enable getpagespeed-extras-nginx-mod
dnf -y install nginx-mod
systemctl enable --now nginx
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install yum-utils
yum-config-manager --disable getpagespeed-extras-mainline
yum-config-manager --enable getpagespeed-extras-nginx-mod
yum -y install nginx-mod
systemctl enable --now nginx
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
amazon-linux-extras install epel
yum -y install yum-utils
yum-config-manager --disable getpagespeed-extras-mainline
yum-config-manager --enable getpagespeed-extras-nginx-mod
yum -y install nginx-mod
systemctl enable --now nginx

如何从常规 NGINX 切换到 NGINX-MOD

如果您之前使用的是我们的常规 NGINX 构建,您可以运行一系列命令以升级到 NGINX-MOD,而不影响已安装的模块或配置:

yum -y install https://extras.getpagespeed.com/release-latest.rpm yum-utils
yum-config-manager --disable getpagespeed-extras-mainline
yum-config-manager --enable getpagespeed-extras-nginx-mod
yum -y update nginx
service nginx upgrade

NGINX-MOD 的模块

NGINX-MOD 与我们基础仓库中的 50 多个 NGINX 模块包完全兼容。 因此,您可以像往常一样安装它们,例如:

dnf -y install nginx-module-pagespeed

主动健康检查

主动健康检查的关键特性

  • 多协议支持HTTP、TCP、SSL Hello、MySQL、AJP、FastCGI。
  • 可自定义检查:间隔、超时、成功/失败阈值。
  • 状态仪表板:通过 HTML、CSV 或 JSON 进行实时监控。
  • 动态调整:根据健康检查标记服务器的状态。

主动健康检查的基本配置

示例:HTTP 健康检查

http {
  upstream backend {
    server 192.168.1.10:80;
    server 192.168.1.11:80;

    # 健康检查配置
    check interval=5s rise=2 fall=3 timeout=4s type=http;
    check_http_send "GET /health HTTP/1.1\r\nHost: example.com\r\n\r\n";
    check_http_expect_alive http_2xx http_3xx;
  }

  server {
    listen 80;
    location / {
      proxy_pass http://backend;
    }

    # 健康状态仪表板(限制访问)
    location /status {
      check_status html;
      allow 10.0.0.0/8;  # 授权 IP
      deny all;
      access_log off;
    }
  }
}

解释:

  • check
  • interval=5s:每 5 秒检查一次。
  • rise=2:连续成功 2 次后标记服务器为“正常”。
  • fall=3:连续失败 3 次后标记服务器为“故障”。
  • type=http:使用 HTTP 检查。
  • check_http_send:发送到上游服务器的自定义 HTTP 请求。
  • check_http_expect_alive:将 HTTP 2xx/3xx 响应视为健康。
  • check_status:在 /status 处以 HTML 格式公开仪表板。

主动健康检查指令参考

核心指令

指令 语法 默认值 描述
check interval=ms [fall=count] [rise=count] [timeout=ms] [type=protocol] [default_down=true\|false] [port=number] interval=30s fall=5 rise=2 timeout=1s type=tcp default_down=true 配置健康检查参数。
check_http_send "HTTP_REQUEST" "GET / HTTP/1.0\r\n\r\n" 用于 type=http 检查的自定义 HTTP 请求。
check_http_expect_alive http_2xx \| http_3xx \| ... http_2xx \| http_3xx 表示健康服务器的 HTTP 状态码。

高级指令

指令 目的
check_keepalive_requests 每个连接的请求数量(默认:1)。
check_fastcgi_param 用于 type=fastcgi 检查的自定义 FastCGI 参数。
check_shm_size 健康检查的共享内存大小(默认:1M)。

主动健康检查类型

1. type=http

  • 用法
    check type=http;
    check_http_send "HEAD /health HTTP/1.1\r\nHost: example.com\r\n\r\n";
    check_http_expect_alive http_200 http_302;
    
  • 响应代码:配置可接受的状态(例如,http_2xx)。

2. type=tcp

  • 简单的 TCP 连接检查:
    check interval=10s type=tcp;
    

3. type=mysql

  • 验证 MySQL 服务器的可用性:
    check type=mysql port=3306;
    

4. type=fastcgi

  • 自定义 FastCGI 参数:
    check type=fastcgi;
    check_fastcgi_param "REQUEST_METHOD" "GET";
    check_fastcgi_param "SCRIPT_FILENAME" "index.php";
    

状态页面设置

端点配置

location /status {
  check_status [html|csv|json];  # 默认:html
  allow 192.168.1.0/24;         # 限制访问
  deny all;
}

查询参数

  • format:覆盖输出格式(例如,/status?format=json)。
  • status:按状态过滤服务器(例如,/status?status=down)。

示例输出

  • HTML:带有服务器状态的交互式表格。
  • JSON:机器可读格式,便于自动化。
  • CSV:简化的逗号分隔值。

主动健康检查的故障排除与最佳实践

常见问题

  1. 共享内存耗尽
  2. 解决方法:在 http 块中增加 check_shm_size

    http {
      check_shm_size 10M;  # 默认:1M
    }
    

  3. 误报/漏报

  4. 调整 rise/fall 阈值并验证 check_http_send 请求。

  5. 超时错误

  6. 如果上游服务器响应缓慢,请增加 timeout

安全提示

  • 使用 allow/deny 限制对 /status 端点的访问。
  • 如果暴露敏感数据,请为状态页面使用 HTTPS。

主动检查与 ip_hashleast_conn 和第三方模块如 stickyfair 无缝协作。

ngx_http_limit_req_module 补丁

一些 NGINX 用户希望对特定资源定义每天一次的速率限制。这在标准 NGINX 中是不可能的。 我们的补丁允许更细粒度的速率限制配置。示例:

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/h; # 每小时 1 次请求
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/d; # 每天 1 次请求
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/w; # 每周 1 次请求
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/M; # 每月 1 次请求
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/Y; # 每年 1 次请求

需要注意的是,您定义的区域内存大小应允许在定义的速率应用之前保留旧的 IP 条目。

例如,您定义了一个 10m 区域和 1r/d 对于特定资源。10m 可以存储大约 160,000 个 IP 地址。 因此,如果有人访问您的速率限制资源,并且您对其的流量在 24 小时内超过 160K 个独立访客,那么同一访客理论上在同一天内不会被速率限制,因为关于其 IP 地址的信息将在足够多的访客访问该资源后从内存中驱逐。

此说明同样适用于标准模块的配置,但影响较小。

因此,经验法则是:

  • 如果您的流量足够大,以至于能够“过早”驱逐旧的 IP 地址,您可能需要增加内存区域。
  • 这更适合于对特定资源进行速率限制,而不是整个网站。

什么是 HPACK 补丁

HPACK 补丁在 NGINX 中实现了 完整 HPACK。简而言之,这允许压缩 HTTP 头部。

什么是 CONNECT 方法支持

NGINX-MOD 提供对 CONNECT 方法请求的支持。此方法主要用于通过代理服务器隧道 SSL 请求。

要启用和配置,请参阅 proxy_connect 指令

NGINX-MOD 的配置指令

在此构建中有一些配置指令,在常规构建中不可用。让我们在这里记录它们。

以下一组配置指令由 动态 TLS 记录 补丁添加。

ssl_dyn_rec_enable on|off

是否启用动态 TLS 记录。

ssl_dyn_rec_size_lo

开始时的 TLS 记录大小。默认为 1369 字节(设计为将整个记录放入单个 TCP 段中:1369 = 1500 - 40 (IPv6) - 20 (TCP) - 10 (时间) - 61 (最大 TLS 开销)) ssl_dyn_rec_size_hi:增长到的 TLS 记录大小。默认为 4229 字节(设计为将整个记录放入 3 个 TCP 段中)。

ssl_dyn_rec_threshold

在更改记录大小之前发送的记录数量。

因为我们使用最新的 OpenSSL 构建:

ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3];

这不是一个新指令。但由于我们使用最新的稳定 OpenSSL 构建,它允许使用 TLSv1.3 值。

隐藏软件信息

默认情况下,NGINX 仅支持 server_tokens off;,这仍会在 Server: 头和错误页面中显示 nginx。 使用 NGINX-MOD,您可以指定一个新值 none,这将导致 NGINX 停止在服务器上显示其存在:

server_tokens none;

验证

要验证您如何受益于 NGINX-MOD,您可以运行一些测试。

检查 HTTP/2 头部压缩

yum install nghttp2
h2load https://example.com -n 2 | tail -6 | head -1

示例输出:

traffic: 71.46KB (73170) total, 637B (637) headers (space savings 78.68%), 70.61KB (72304) data

如果您看到 50% 或更多的空间节省,那么这意味着已利用完整的 HPACK 压缩。

如何切换回稳定版 NGINX

在保留现有配置的同时返回稳定包:

yum-config-manager --disable getpagespeed-extras-nginx-mod
MOD_PKGS=$(rpm -qa --queryformat '%{NAME}\n' | grep nginx-mod | grep -v nginx-module)
rpm --erase --justdb --nodeps ${MOD_PKGS}
STABLE_PKGS=$(echo ${MOD_PKGS} | sed 's@nginx-mod@nginx@g')
yum -y install ${STABLE_PKGS}
yum history sync

这些命令将禁用 NGINX-MOD 仓库,并用基础仓库中的等效包替换任何 nginx-mod* 包,从而降级到稳定版 NGINX。

兼容性说明

  • 目前 NGINX-MOD 与 Plesk 控制面板不兼容。