这个是自己基于自身需要打包的OpenResty发行版,通常会实时跟进官方OpenResty的稳定版本。在官方的版本上增加了大量第三方模块和nginx官方代码的补丁(用于扩展原生nginx的功能),以同时满足WEB服务器、API网关和CDN分发等用途。所有打包模块都已经开源(包括我自己写的模块),详情见GITHUB链接或者下面介绍(下面介绍可能更新不会那么即时,请以GITHUB链接英文介绍为准)。仓库只提供Dockerfile,需要自行构建的可以参考Dockerfile内的构建命令。
开源地址:
描述
OpenResty 是一个功能齐全的 Web 应用服务器,它捆绑了标准 nginx 核心、大量第三方 nginx 模块以及它们的大部分外部依赖项。
这个定制的 OpenResty 软件包旨在充当功能齐全的 CDN 缓存服务器,同时保留 OpenResty 作为高性能动态 Web 平台的功能。
此软件包基于官方 OpenResty,包含 LuaRocks、附加补丁、第三方 nginx 模块和 Lua 库。
此软件包由 Hanada ([email protected]) 维护。
捆绑软件组件的版权归各自的版权所有者所有。
本捆绑包版本号会在官方OpenResty版本号基础上增加一个发行序列号。假设官方OpenResty的版本号是1.27.1.1,代表nginx版本号是1.27.1,官方OpenResty增加了.1,本捆绑包的版本号会是1.27.1.1.xxx,此版本号会出现在server标头(如果指令server_token值为on)、默认错误页面(如果指令server_token值为on)、变量$nginx_version中。
组件
OpenResty 官方软件包的组件
有关 OpenResty 捆绑组件和功能的详细信息,请参阅 openresty.org。
此 OpenResty 软件包的组件
以下组件是本 OpenResty 软件包额外捆绑的,其中一些由 Hanada 开发和维护。
- ngx_backtrace_module
- ngx_lua_events_module
- ngx_http_access_control_module
- ngx_http_aws_auth_module
- ngx_http_brotli_module
- ngx_http_cache_purge_module
- ngx_http_compress_normalize_module
- ngx_http_compress_vary_filter_module
- ngx_http_cors_module
- ngx_http_dechunk_module
- ngx_http_delay_module
- ngx_http_error_log_write_module
- ngx_http_extra_vars_module
- ngx_http_flv_live_module
- ngx_http_geoip2_module
- ngx_http_internal_auth_module
- ngx_http_internal_redirect_module
- ngx_http_label_module
- ngx_http_limit_traffic_rate_filter_module
- ngx_http_log_var_set_module
- ngx_http_loop_detect_module
- ngx_http_lua_var_module
- ngx_http_proxy_connect_module
- ngx_http_proxy_var_set_module
- ngx_http_qrcode_module
- ngx_http_replace_filter_module
- ngx_http_secure_link_hash_module
- ngx_http_secure_link_hmac_module
- ngx_http_security_headers_module
- ngx_http_server_redirect_module
- ngx_http_sorted_querystring_module
- ngx_http_sysguard_module
- ngx_http_trim_filter_module
- ngx_http_unbrotli_filter_module
- ngx_http_upstream_check_module
- ngx_http_upstream_log_module
- ngx_http_vhost_traffic_status_module
- ngx_http_waf_module
- ngx_http_weserv_module
- ngx_http_zstd_module
- luarocks
- lua-resty-maxminddb
- lua-resty-multipart-parser
- lua-resty-balancer
- lua-resty-ctx
- lua-resty-http
- lua-resty-hmac-ffi
- lua-resty-jwt
- lua-resty-openidc
- lua-resty-dns-client
- lua-resty-kafka
- lua-resty-template
- lua-resty-mlcache
- lua-resty-jit-uuid
- lua-resty-cookie
- lua-resty-worker-events
- lua-resty-healthcheck
- lua-resty-expr
- lyaml
- lua-resty-redis-connector
- coreruleset
附加功能
此软件包通过补丁扩展了 Nginx 核心和第三方模块的功能。
以下是此软件包支持的附加功能,为了简洁起见,官方 OpenResty 软件包中已包含的功能已省略。
ngx_http
用于记录时间戳和相关操作耗时情况的变量
必须编译模块 ngx_http_extra_variables_module 才能使用这些变量。
变量 | 描述 |
---|---|
$response_header_sent_mesc | 响应头发送时间戳(以秒为单位,精度为毫秒)。 |
$request_handling_time | 记录从接收请求到将响应头发送到客户端期间内部处理请求所花费的时间。 |
$response_body_time | 记录将响应主体发送到客户端所花费的时间。 |
ngx_http_core_module
listen 指令支持 https_allow_http
允许服务器在同一端口同时接受 HTTP 和 HTTPS 请求,这在使用特殊端口的场景中非常有用。原代码来自 Tengine。
- 语法: listen address[:port] [ssl] [https_allow_http] …;
-
默认值: listen *:80 | *:8000;
-
上下文: server
当 listen 指令同时启用 ssl 和 https_allow_http 参数时,将允许 https 和 http 请求。
唯一请求 ID 增强
基于原有 nginx 内置变量 $request_id,支持从请求头或任何变量继承唯一 ID。除了随机十六进制 ID 之外,唯一 ID 生成还支持根据请求特征生成跟踪 ID。
- 语法: request_id hexid | traceid;
-
默认值: request_id hexid;
-
上下文: http, server, location
指定请求 ID 的格式。
- 语法: request_id_header header_name;
-
默认值: –
-
上下文: http, server, location
指定请求 ID 继承的标头名称。
默认错误页面优化
优化默认错误页面显示的信息,以便于收集客户端的错误反馈。
- 语法: error_page_server_info on | off;
-
默认值: error_page_server_info on;
-
上下文: http, server, location
在默认的 4xx/5xx 错误页面中显示以下信息:包含日期、请求客户端 IP、请求 ID 以及服务请求的主机名。
- 语法: error_page_client_ip $variable;
-
默认值: error_page_client_ip $remote_addr;
-
上下文: http, server, location
指定在默认 4xx/5xx 错误页面上显示的 IP 项的值。参数值可以包含变量。仅当启用 error_page_server_info 指令时,该值才会显示在默认的 4xx/5xx 错误页面上。
支持忽略无效的 Range 标头
- 语法: ignore_invalid_range on | off;
-
默认值: ignore_invalid_range off;
-
上下文: http、server、location
指定是否忽略无效的范围标头。如果启用,则忽略无效的范围标头,并将完整内容响应给客户端。否则,客户端将收到 416 状态。无效的范围标头不会被清除,只是被忽略。
支持带有 if 参数的 error_page 指令
- 语法: error_page code … [=[response]] uri [if=condition];
-
默认值: –
-
上下文: http、server、location
有关原始用法,请参阅 nginx 文档的 error_page。
if
参数启用条件错误页面。在处理错误页面之前,会先评估条件。如果条件值不为空或 0
,则会处理错误页面。否则,不会处理错误页面。您也可以通过将 if=
更改为 if!=
来实现相反的效果。
更多用于未修改(304)检查的指令
- 语法: ignore_if_unmodified_since on | off;
-
默认值: ignore_if_unmodified_since off;
-
上下文: http, server, location
指定是否忽略 If-Unmodified-Since
请求标头。如果启用,则会忽略 If-Unmodified-Since
请求标头。否则,将检查 If-Unmodified-Since
请求标头。
- 语法: ignore_if_match on | off;
-
默认值: ignore_if_match off;
-
上下文: http、server、location
指定是否忽略 If-Match
请求标头。如果启用,则将忽略 If-Match
请求标头。否则,将检查 If-Match
请求标头。
- 语法: not_modified_check on | any | strict | prefer_if_none_match;
-
默认值: not_modified_check strict;
-
上下文: http、server、location
指定如何检查响应是否未经修改(304 Not Modified):
off
:不检查响应是否未经修改。响应始终被视为已修改。any
:如果存在If-Modified-Since
或If-None-Match
请求标头,则检查响应是否未经修改。如果任何一个标头的检查通过,则返回 304 响应。strict
:- 如果仅存在一个标头(
If-Modified-Since
或If-None-Match
),则检查该标头。如果满足其条件,则返回 304(未修改)。 - 如果两个标头都存在,必须同时通过其检查才能返回 304(未修改)。
- 如果两个标头均不存在,则认为响应已修改。
- 如果仅存在一个标头(
prefer_if_none_match
:- 如果仅存在一个标头(
If-Modified-Since
或If-None-Match
),则检查该标头。如果满足条件,则返回 304(未修改)。 - 如果 两个标头 都存在,只需满足
If-None-Match
标头的条件 即可返回 304(未修改)。 - 如果两个标头均不存在,则响应被视为已修改。
- 如果仅存在一个标头(
变量中支持不区分连字符/下划线的 Cookie 或参数名称
允许 $arg_name
、$cookie_name
和 $upstream_cookie_name
等变量支持包含连字符 (-
) 的 Cookie 或参数名称。
ngx_http_ssl_module
优化 TCP 上的 TLS 以降低延迟
通过初始发送较小(1 个 TCP 段)的记录,我们可以避免第一个字节的 HoL 阻塞。这意味着 TTFB 有时会缩短整个 RTT。
通过在连接后期发送越来越大的记录,当 HoL 不再是问题时,我们可以减少 TLS 记录的开销(使用 GCM/CHACHA-POLY 时,每个记录 29 字节)。
每个连接都以较小的记录启动(默认为 1369 字节,可以使用 ssl_dyn_rec_size_lo 进行更改)。
在达到给定数量的记录(40,使用 ssl_dyn_rec_threshold 进行更改)后,开始发送更大的记录(4229,使用 ssl_dyn_rec_size_hi)。
最终,在达到相同数量的记录后,开始发送最大的记录(ssl_buffer_size)。
如果连接空闲了给定的时间(1 秒,ssl_dyn_rec_timeout),则该过程将重复(即再次开始发送小记录)。
- 语法: ssl_dyn_rec on | off;
-
默认值: ssl_dyn_rec off;
-
上下文: http, server
启用动态 TLS 记录。
与原始补丁不同,该指令名称从 ssl_dyn_rec_enable 更改为 ssl_dyn_rec。
- 语法: ssl_dyn_rec_timeout time;
-
默认值: ssl_dyn_rec_timeout 1s;
-
上下文: http, server
我们希望初始记录能够放入一个 TCP 段中,这样就不会因为 TCP 慢启动而导致 TCP HoL 阻塞。
连接始终以较小的记录开始,但在发送了一定数量的记录后,我们会增加记录大小以减少标头开销。
连接空闲一段时间后,将从头开始处理。实际参数可配置。如果 ssl_dyn_rec_timeout 为 0,则我们假定 ssl_dyn_rec 处于关闭状态。
- 语法: ssl_dyn_rec_size_lo number;
-
默认值: ssl_dyn_rec_size_lo 1369;
-
上下文: http, server
动态记录大小的默认大小定义为:对于 lo,单个 TCP 段包含最大 TLS + IPv6 开销;对于 hi,包含 3 个 TCP 段:1369 = 1500 – 40 (IP) – 20 (TCP) – 10 (时间) – 61 (最大 TLS 开销)
- 语法: ssl_dyn_rec_size_hi number;
-
默认值: ssl_dyn_rec_size_hi 4229;
-
上下文: http, server
4229 = (1500 – 40 – 20 – 10) * 3 – 61
- 语法: ssl_dyn_rec_threshold number;
-
默认值: ssl_dyn_rec_threshold 40;
-
上下文: http, server
访问 ngx_http_tls_dyn_size 代码库了解更多信息。
严格 SNI 验证
添加 SNI 和 Host 头的验证步骤,当请求违反规则时,立即返回状态码 421 Misdirected Request。
- 语法: ssl_strict_server_name on | off | mtls_only;
-
默认值: ssl_strict_server_name mtls_only;
-
上下文: http, server
启用严格 SNI 验证。当请求的 SNI 和主机头不同时,会立即返回状态码 421 Misdirected Request。mtls_only
用于仅在启用 ssl_verify_client
的情况下启用严格的 SNI 验证。
关于 SSL 握手时间戳和耗时变量
引入了新的变量来获取 SSL 握手的开始时间戳、结束时间戳和耗时。
变量 | 描述 |
---|---|
$ssl_handshake_start_msec | SSL 握手开始时间戳(以秒为单位,精度为毫秒)。 |
$ssl_handshake_end_msec | SSL 握手结束时间戳(以秒为单位,精度为毫秒)。 |
$ssl_handshake_time | 以毫秒为单位记录 SSL 握手耗时。 |
ngx_http_slice_filter_module
slice_allow_methods
- 语法: slice_allow_methods GET | HEAD …;
-
默认值: slice_allow_methods GET HEAD;
-
上下文: http, server, location
如果客户端请求方法在此指令中列出,则允许将响应拆分为多个切片。请注意,即使未设置 slice 指令或该指令值为零,仍将禁用将响应拆分为多个切片的功能。
slice_check_etag
- 语法: slice_check_etag on | off;
-
默认值: slice_check_etag on;
-
上下文: http, server, location
是否检查切片中 Etag 头的一致性。如果启用,当切片响应中的 Etag 不匹配时,请求将被终止并报错。
slice_check_last_modified
- 语法: slice_check_last_modified on | off;
-
默认值: slice_check_last_modified off;
-
上下文: http, server, location
是否检查切片中 Last-Modified 头的一致性。如果启用,当切片响应中的 Last-Modified 不匹配时,请求将被终止并报错。
ngx_http_sub_filter_module
条件响应替换绕过
此补丁引入了 sub_filter_bypass 指令,用于根据一组变量的值绕过 sub_filter。
- 语法: sub_filter_bypass string …;
-
默认值: –
-
上下文: http, server, location
定义响应不会被替换的条件。如果字符串参数中至少有一个值不为空且不等于“0”,则响应不会被替换。
sub_filter_bypass $cookie_nocache $arg_nocache$arg_comment;
sub_filter_bypass $http_pragma $http_authorization;
ngx_http_proxy_module 及相关模块
在“proxy_set_header”及其相关模块中支持继承
引入“proxy_set_header_inherit”指令,该指令设置为 off 时,会在接收上下文中阻止合并继承。添加此机制的目的是减少 nginx 配置中通用设置(或样板)请求标头的重复,同时保持为特定路径设置额外标头的灵活性。原始补丁来自[PATCH] 为 proxy_set_header 添加合并继承。此外,还提供 grpc 支持。
还允许为 grpc_set_header 设置 :authory
标头(来自 nginx-grpc_set_header_authority.patch)。请注意,必须在其他 grpc_set_header 指令的开头设置 :authory
标头,以避免 :authory
出现在正常标头之后并导致协议错误。
现有配置的行为保持不变。
- 语法: proxy_set_header_inherit on | off;
-
默认值: proxy_set_header_inherit off;
-
上下文: http, server, location
允许在接收上下文中合并继承 proxy_set_header。
grpc_set_header_inherit 也可用。
- 语法: fastcgi_param_inherit on | off;
-
默认值: fastcgi_param_inherit off;
-
上下文: http, server, location
允许在接收上下文中合并继承 fastcgi_param。
scgi_param_inherit 和 uwsgi_param_inherit 也可用。
配置上游连接的 sndbuf 和 rcvbuf
引入两个新指令,用于设置上游连接的 sndbuf 和 rcvbuf。原代码来自 Tengine。
- 语法: proxy_sndbuf_size size;
-
默认值: –
-
上下文: http, server, location
设置用于上游连接的sndbuf大小。如果未设置,则使用系统分配的大小。
fastcgi_sndbuf_size、scgi_sndbuf_size、uwsgi_sndbuf_size、grpc_sndbuf_size 指令也可用。
- 语法: proxy_rcvbuf_size size;
-
默认值: –
-
上下文: http, server, location
设置用于上游连接的rcvbuf大小。如果未设置,则使用系统分配的大小。
fastcgi_rcvbuf_size、scgi_rcvbuf_size、uwsgi_rcvbuf_size 和 grpc_rcvbuf_size 也可用。
增强上游缓存控制
引入一些新的缓存相关指令,以增强对上游缓存行为的控制。
- 语法: proxy_ignore_cache_control field …;
-
默认值: –
-
上下文: http, server, location
禁用处理上游响应中 Cache-Control 标头的某些字段。以下指令可以忽略:
- no-cache
- no-store
- private
- max-age
- s-maxage
- stale-while-revalidate
- stale-if-error
fastcgi_ignore_cache_control、scgi_ignore_cache_control 和 uwsgi_ignore_cache_control 指令也可用。
- 语法: proxy_cache_min_age time;
-
默认值: proxy_cache_min_age 0s;
-
上下文: http, server, location
如果从上游接收到的 Cache-Control 头中的 max-age/s-maxage 小于指定的最小年龄,则 max-age/s-maxage 值将设置为配置的最小年龄值。例如,如果收到的 HTTP 标头中的 max-age/s-maxage 值为 100 秒,且配置的最小年龄值为 200 秒,则有效缓存时间为 200 秒。此指令不会重写 Cache-Control 标头。此指令的值支持变量。
fastcgi_cache_min_age、scgi_cache_min_age 和 uwsgi_cache_min_age 指令也可用。
- 语法: proxy_cache_stale_if_error time;
-
默认值: proxy_cache_stale_if_error 0s;
-
上下文: http, server, location
Cache-Control 标头字段的 stale-if-error 扩展允许在发生错误时使用过时的缓存响应。当 Cache-Control 头中缺少 stale-if-error 时,此指令将取代 Cache-Control 头中的 stale-if-error 扩展指令生效。此指令的优先级低于使用 proxy_cache_use_stale 指令参数。此指令的值支持变量。
fastcgi_cache_stale_if_error、scgi_cache_stale_if_error 和 uwsgi_cache_stale_if_error 指令也可用。
- 语法: proxy_cache_stale_while_revalidate time;
-
默认值: proxy_cache_stale_while_revalidate 0s;
-
上下文: http, server, location
Cache-Control 头字段中的 stale-while-revalidate 扩展指令允许使用过时的缓存响应(如果当前正在更新)。当 Cache-Control 头中缺少 stale-while-revalidate 时,此指令将代替 Cache-Control 头中的 stale-while-revalidate 扩展生效。此指令的优先级低于使用以下指令参数proxy_cache_use_stale 的参数。该指令的值支持变量。
fastcgi_cache_stale_while_revalidate、scgi_cache_stale_while_revalidate 和 uwsgi_cache_stale_while_revalidate 指令也可用。
- 语法: proxy_cache_types mime-type …;
-
默认值: proxy_cache_types text/html;
-
上下文: http, server, location
除了“text/html”之外,还启用指定 MIME 类型的上游缓存。特殊值“*”可匹配任何 MIME 类型。
fastcgi_cache_types、scgi_cache_types 和 uwsgi_cache_types 指令也可用。
- 语法: proxy_cache_valid [code …] time;
-
默认值: –
-
上下文: http, server, location
请参阅 proxy_cache_valid。
此指令已更改为支持将缓存时间配置为变量。其他行为保持不变。
ngx_http_upstream_module
用于上游信息的额外变量
必须编译模块 ngx_http_extra_variables_module 才能使用这些变量。
变量 | 描述 |
---|---|
$upstream_method | 上游方法,通常为“GET”或“POST”。 |
$upstream_start_msec | 保存上游启动的时间戳;时间以秒为单位,精度为毫秒。多个响应的时间用逗号和冒号分隔,就像 $upstream_addr 变量中的地址一样。 |
$upstream_last_start_msec | 保存最近上游启动的时间戳;时间以秒为单位,精度为毫秒。 |
$upstream_ssl_start_msec | 保存上游 SSL 握手开始的时间戳;该时间以秒为单位,精度为毫秒。多个响应的时间像 $upstream_addr 变量中的地址一样,用逗号和冒号分隔。 |
$upstream_last_ssl_start_msec | 保存最新的上游 SSL 握手开始的时间戳;该时间以秒为单位,精度为毫秒。 |
$upstream_send_start_msec | 保存上游请求发送开始的时间戳;该时间以秒为单位,精度为毫秒。多个响应的时间像 $upstream_addr 变量中的地址一样,用逗号和冒号分隔。 |
$upstream_last_send_start_msec | 保存最新的上游请求发送开始的时间戳;该时间以秒为单位,精度为毫秒。 |
$upstream_send_end_msec | 保存上游请求发送结束的时间戳;时间以秒为单位,精度为毫秒。多个响应的时间像 $upstream_addr 变量中的地址一样,用逗号和冒号分隔。 |
$upstream_last_send_end_msec | 保存最新上游请求发送结束的时间戳;时间以秒为单位,精度为毫秒。 |
$upstream_header_msec | 保存发送上游响应头的时间戳;时间以秒为单位,精度为毫秒。多个响应的时间像 $upstream_addr 变量中的地址一样,用逗号和冒号分隔。 |
$upstream_last_header_msec | 保存发送最新上游响应头的时间戳;时间以秒为单位,精度为毫秒。 |
$upstream_end_msec | 保存发送上游响应或异常中断的时间戳;时间以秒为单位,精度为毫秒。多个响应的时间像 $upstream_addr 变量中的地址一样,用逗号和冒号分隔。 |
$upstream_last_end_msec | 保存最新发送的上游响应或异常中断的时间戳;时间以秒为单位,精度为毫秒。 |
$upstream_transport_connect_time | 保存与上游服务器建立连接所花费的时间;时间以秒为单位,精度为毫秒。对于 SSL,不包括握手所花费的时间。多个连接的时间像 $upstream_addr 变量中的地址一样,用逗号和冒号分隔。 |
$upstream_last_transport_connect_time | 保存与上游服务器建立连接所花费的时间;时间以秒为单位,精度为毫秒。对于 SSL,不包括握手所花费的时间。 |
$upstream_ssl_time | 保存上游 SSL 握手所花费的时间;时间以秒为单位,精度为毫秒。请注意,此计时仅在收到上游请求标头后开始。多个 SSL 连接的时间以逗号和冒号分隔,就像 $upstream_addr 变量中的地址一样。 |
$upstream_last_ssl_time | 保存最新上游 SSL 握手所花费的时间;时间以秒为单位,精度为毫秒。请注意,此计时仅在收到上游请求标头后开始。 |
$upstream_send_time | 保存向上游服务器发送请求所花费的时间;时间以秒为单位,精度为毫秒。多个发送请求的时间以逗号和冒号分隔,就像 $upstream_addr 变量中的地址一样。 |
$upstream_last_send_time | 保存向最新上游服务器发送请求所花费的时间;时间以秒为单位,精度为毫秒。 |
$upstream_read_time | 保存从上游服务器读取响应所花费的时间;时间以秒为单位,精度为毫秒。请注意,此计时仅在收到上游请求标头后开始。多个响应的时间用逗号和冒号分隔,就像 $upstream_addr 变量中的地址一样。 |
$upstream_last_read_time | 记录从最新上游服务器读取响应所花费的时间;该时间以秒为单位,精度为毫秒。请注意,此计时仅在收到上游请求标头后开始。 |
ngx_http_realip_module
使用多个请求标头配置真实客户端 IP
- 语法: real_ip_header field | X-Real-IP | X-Forwarded-For | proxy_protocol;
-
默认值: real_ip_header X-Real-IP;
-
上下文: http, server, location
定义将使用其值替换客户端地址的请求标头字段。
如果定义了多个请求字段,则将按照配置中定义的顺序检查标头值,并使用第一个具有有效值的标头:
real_ip_header X-Real-IP Cdn-Src-Ip X-Forwarded-For;
将依次检查上述标头的值,直到找到有效值。
包含可选端口的请求标头字段值也用于替换客户端端口。地址和端口应根据 RFC 3986 指定。
proxy_protocol 参数会将客户端地址更改为 PROXY 协议标头中的地址。必须事先通过设置 listen 指令中的 proxy_protocol 参数来启用 PROXY 协议。
ngx_http_rewrite_module
扩展了原重写模块的“if”指令。它具有以下功能:
为“if”指令添加更多运算符
除了原有的“if”条件运算符外,还支持:
* <
* >
* !< 或 >=
* !> 或 <=
* ^~(以数字开头)或 !^~(不以数字开头)
比较符号支持小数和负数。非数字输入将始终返回负数结果。
带有多个条件的“if”
- 语法: if (conditions) {…}
-
默认值: –
-
上下文: server, location
支持在 if 语句中使用“&&”和“||”运算符。
支持基于括号的子条件。
示例:
if ($remote_addr = 192.168.1.1 && ($http_user_agent ~ 'Mozilla' || $server_port > 808)) {
return 404;
}
已知限制 1:
使用基于括号的条件分组时,条件语句的最后一个字符不能是“)”,即使它被引号括起来。例如,以下表达式将导致配置测试错误。
if (($test_var = "test)" && $http_user_agent ~ 'Mozilla') || $server_port > 808) {
return 404
}
如果必须使用以 ‘)’ 结尾的字符串,可以考虑使用变量来支持它。
set $value "test)";
if (($test_var = $value && $http_user_agent ~ 'Mozilla') || $server_port > 808) {
return 404
}
如果是正则表达式,可以通过多种方式避免在末尾使用 ‘)’。
已知限制 2:
所有子条件都会先求值,然后再计算表达式结果。这与一般编程语言的子条件处理逻辑不同。
已知限制 3:
由于 nginx 脚本引擎的限制,如果使用正则捕获,则只能获取最后一个匹配的正则表达式的捕获组。
支持“elif”和“else”指令
- 语法: elif (condition) {…}
-
默认值: –
-
上下文: server, location
与 if 类似,但如果此指令前面没有 if/elif 指令,或者前面的 if/elif 指令的结果为 true,则不会生效。
此指令将创建一个新的 location,就像 if 指令一样,请参阅 if is evil
- 语法: else {…}
-
默认值: –
-
上下文: server, location
与 if 和 elif 类似,但不包含任何条件表达式,因此始终为 true。如果此指令前面没有 if/elif 指令,或者前面的 if/elif 指令的结果为 true,则此指令不会生效。
此指令将像 if 一样创建一个新的 location,请参考 if is evil
ngx_http_gunzip_module
支持强制 gzip 解压
这是一个简单的补丁,修改了 NGINX gunzip 过滤器模块,以强制对压缩的响应进行 inflate 操作。对于发送 gzip 压缩响应的上游源,此功能是理想的选择。请阅读“其他评论”部分,了解这将解压所有内容,因此您需要尽可能具体地指定其用途,以避免解压您原本不想修改的内容。
此功能有多种用途:
它维持在上游服务器和 nginx 之间传输 gzip 压缩的内容,从而减少网络带宽。
某些模块需要上游内容解压才能正常工作。
它允许 nginx 在将数据发送到客户端之前重新压缩数据(例如 brotli)。
此功能已成功测试到 1.20.0 版本(截至撰写本文时的最新版本)。我认为 gunzip 模块代码变化不大(如果有的话),所以它应该可以完美地针对旧版本/未来版本进行补丁。
原始补丁来自强制 gunzip 过滤器模块工作的补丁。原作者是姚伟斌。
默认情况下不构建 gunzip 模块,您必须在编译 nginx 时指定 –with-http_gunzip_module 选项。
- 语法: gunzip_force string …;
-
默认值: –
-
上下文: http, server, location
定义强制 brotli 解压的条件。如果字符串参数中至少有一个值不为空且不等于“0”,则执行强制 gzip 解压。但它不会尝试解压缩不包含响应头 Content-Encoding: gzip 的响应。
ngx_http_gzip_filter_module
gzip_max_length
- 语法: gzip_max_length length;
-
默认值: gzip_max_length 0;
-
上下文: http, server, location
设置将被 gzip 压缩的响应的最大长度。该长度仅由“Content-Length”响应头字段决定。值为 0 表示无上限。
gzip_bypass
- 语法: gzip_bypass string …;
-
默认值: –
-
上下文: http, server, location
定义响应将被 gzip 压缩的条件。如果字符串参数中至少有一个值不为空且不等于“0”,则响应不会被 gzip 压缩。
ngx_http_limit_req_module
使用自定义 key 和 rate 参数增强请求速率限制
- 语法: limit_req zone=name [burst=number] [nodelay | delay=number] [key=string] [rate=rate];
-
默认值: –
-
上下文: http, server, location
请参阅 limit_req
此补丁添加了两个参数:key 和 rate。如果未指定,则使用 limit_req_zone 指定的 key 和 rate。key 可以包含文本、变量及其组合。key 值为空的请求不予处理。
此外,同一配置级别中的多个 limit_req 指令可以使用同一个区域。
- 语法: limit_req_zone key | key=string zone=name:size rate=rate;
-
默认值: –
-
上下文: http
请参阅 limit_req_zone
此补丁允许使用 key=string 格式进行配置,同时也兼容原有的配置语法。
ngx_http_log_module
access_log 指令支持反向条件
- 语法: access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; access_log off;
-
默认值: access_log logs/access.log combined;
-
上下文: http, server, location, if in location, limit_except
参考 access_log
在原有 if=
参数的基础上,你可以将 if=
改为 if!=
来实现相反的效果。
ngx_http_brotli_filter_module(第三方模块)
请参阅 ngx_brotli。
brotli_max_length
- 语法: brotli_max_length length;
-
默认值: brotli_max_length 0;
-
上下文: http, server, location
设置将被压缩的响应的最大长度。该长度仅由“Content-Length”响应头字段确定。值为 0 表示无上限。
brotli_bypass
- 语法: brotli_bypass string …;
-
默认值: –
-
上下文: http, server, location
定义响应在何种条件下会被压缩。如果字符串参数中至少有一个值既不为空也不等于“0”,则响应将不会被压缩。
ngx_http_waf_module(第三方模块)
请参阅 ngx_waf。
此补丁对该模块进行了一些更改,主要添加了更多开关,用于对 WAF 行为进行细粒度控制。此外,它还更改了默认质询或错误页面的外观以及配置文件的读取路径。
waf_bypass
- 语法: waf_bypass string …;
-
默认值: –
-
上下文: http, server, location
定义 waf 检查请求的条件。如果字符串参数中至少有一个值不为空且不等于“0”,则 waf 将检查该请求。
waf_cc_deny_bypass
- 语法: waf_cc_deny_bypass 字符串 …;
-
默认值: –
-
上下文: http、server、location
定义请求在何种条件下会被 waf cc 拒绝函数检查。如果字符串参数中至少有一个值不为空且不等于“0”,则该请求将被 waf cc 拒绝函数检查。
waf_under_attack_bypass
- 语法: waf_under_attack_bypass 字符串 …;
-
默认值: –
-
上下文: http、server、location
定义请求在何种条件下会被 waf under attack 函数检查。如果字符串参数中至少有一个值不为空且不等于“0”,则该请求将被 waf under attack 函数检查。
waf_captcha_bypass
- 语法: waf_captcha_bypass 字符串 …;
-
默认值: –
-
上下文: http, server, location
定义 waf captcha 函数在何种条件下会检查请求。如果字符串参数中至少有一个值不为空且不等于“0”,则 waf captcha 函数会检查该请求。
waf_modsecurity_bypass
- 语法: waf_modsecurity_bypass 字符串 …;
-
默认值: –
-
上下文: http, server, location
定义 waf modsecurity 函数在何种条件下会检查请求。如果字符串参数中至少有一个值不为空且不等于“0”,则 waf modsecurity 函数会检查该请求。
ngx_http_headers_more_filter_module(第三方模块)
此模块包含在 OpenResty 官方软件包中。
more_set_headers
- 语法: more_set_headers [-t <内容类型列表>]… [-s <状态码列表>]… [-a] <新标头>… [if=条件];
-
默认值: –
-
上下文: http, server, location, location if
请参阅 more_set_headers。仅添加了 if
参数,其他参数保持不变。您也可以通过将 if=
更改为 if!=
来实现相反的效果。
more_clear_headers
- 语法: more_clear_headers [-t <内容类型列表>]… [-s <状态码列表>]… <新标头>… [if=condition];
-
默认值: –
-
上下文: http, server, location, location if
请参阅 more_clear_headers。仅添加了 if
参数,其他参数保持不变。您也可以通过将 if=
更改为 if!=
来实现相反的效果。
more_set_input_headers
- 语法: more_set_input_headers [-r] [-t
]… … [if=condition]; -
默认值: –
-
上下文: http, server, location, location if
请参阅 more_set_input_headers。仅添加了 if
参数,其他参数保持不变。您也可以通过将 if=
更改为 if!=
来实现相反的效果。
more_clear_input_headers
- 语法: more_clear_input_headers [-t
]… … [if=condition]; -
默认值: –
-
上下文: http, server, location, location if
请参阅 more_clear_input_headers。仅添加了 if
参数,其他参数保持不变。您也可以通过将 if=
更改为 if!=
来实现相反的效果。
Luarocks
LuaRocks 是 Lua 模块的包管理器。
它允许您创建并安装 Lua 模块,并将其作为名为 rocks 的独立包。
LuaRocks 是一款免费软件,使用与 Lua 相同的许可证。
coreruleset
OWASP CRS 是一组通用的攻击检测规则,可与 ModSecurity 或兼容的 Web 应用程序防火墙配合使用。CRS 旨在保护 Web 应用程序免受各种攻击(包括 OWASP 十大攻击)的侵害,并将误报率降至最低。
Copyright (c) 2006-2020 Trustwave and contributors. All rights reserved.
Copyright (c) 2021-2025 CRS project. All rights reserved.
OWASP CRS 根据 Apache 软件许可证 (ASL) 版本 2 分发。请参阅 LICENSE 以了解完整详细信息。
版权与许可
此软件包本身遵循 2-clause BSD 许可证。
NGINX 是 F5 NETWORKS, INC. 的注册商标。
OpenResty® 是 OpenResty Inc. 的注册商标。
此定制软件包的维护者 (Hanada) 并非由 OpenResty Inc. 或 NGINX Official/F5 NETWORKS, INC. 赞助或与其有任何关联。
详情请参阅许可证。