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:简化的逗号分隔值。
主动健康检查的故障排除与最佳实践
常见问题
- 共享内存耗尽:
-
解决方法:在
http块中增加check_shm_size:http { check_shm_size 10M; # 默认:1M } -
误报/漏报:
-
调整
rise/fall阈值并验证check_http_send请求。 -
超时错误:
- 如果上游服务器响应缓慢,请增加
timeout。
安全提示
- 使用
allow/deny限制对/status端点的访问。 - 如果暴露敏感数据,请为状态页面使用 HTTPS。
主动检查与 ip_hash、least_conn 和第三方模块如 sticky 或 fair 无缝协作。
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 控制面板不兼容。