紧凑输出 HTML、CSS 和 JavaScript

使用开启紧凑输出页面规则动作,在网关侧去除 HTML、CSS 和 JavaScript 响应中的注释和多余空白,减小响应体积。

紧凑输出会在网关压缩并发送响应之前,移除 HTML、CSS 和 JavaScript 响应体中的注释和多余空白,响应的实际内容保持不变。

此功能在 OpenResty Edge 26.12.1-1 中首次引入。

开启紧凑输出

在页面规则(应用 > HTTP 应用 > 页面规则 > 动作)、全局改写规则或全局自定义动作中添加 开启紧凑输出 (Minify) 动作。该动作有三个开关:HTML、CSS 和 JavaScript。当响应的 Content-Type 匹配某个已启用的开关时,该响应会以紧凑形式输出:

开关内容类型
HTMLtext/html
CSStext/css
JavaScriptapplication/javascript、text/javascript、application/x-javascript、application/ecmascript、text/ecmascript

当同一请求匹配多条设置该动作的规则时,以最后一条规则为准;如果后面的规则将三个开关都设为关闭,则会关闭紧凑输出。

紧凑输出对响应的影响

  • 网关会向源站请求未压缩的响应体,因此该请求不会使用源站自身的压缩;网关压缩(Gzip、Brotli、Zstandard)仍会在之后生效,但只对其自身设置中列出的内容类型生效——对 CSS 或 JavaScript 开启紧凑输出时,需要在网关压缩的设置中加入 text/css 及 JavaScript 相关类型,否则这些响应会以未压缩的形式到达客户端。
  • 响应中的 Content-Length 和 Accept-Ranges 会被移除;强 ETag 会变为弱 ETag;Last-Modified 保持不变。
  • 这些 URL 不再支持按字节范围请求。对该 URL 开启缓存后,无论是否命中缓存,Range 请求都会返回完整的紧凑处理后的响应体,状态码为 200,且不带 Content-Range,而不是 206 部分响应:网关不会把 Range 转发给源站,而在处理范围请求时又无法知道紧凑处理后响应体的长度。未对该 URL 开启缓存时,Range 请求会转发到源站,源站以 206 应答,该部分响应会原样发给客户端,不做紧凑处理。
  • 以下响应不做紧凑处理:源站已经压缩过的响应体、206、204 和 304 响应、空响应体、HEAD 请求、charset 不是 UTF-8、US-ASCII 或 ISO-8859 的响应,以及响应中超出紧凑输出缓冲区的部分(见下文)。
  • 缓存中保存的是未经紧凑处理的响应,每次命中缓存都会重新做紧凑处理。

紧凑输出缓冲区大小

全局配置 > 通用配置 > Minify > 紧凑输出缓冲区大小(默认 64 KByte,取值范围 8 KByte 至 1 MByte)。网关会为每个紧凑输出的响应预留这么多内存。单个超出缓冲区大小的内容块(例如一段很长的内联 <script>),会原样透传、不做紧凑处理,响应的其余部分仍会以紧凑形式输出。

前提条件

网关节点软件包依赖 OpenResty Edge 紧凑输出软件包,因此运行包含该功能的版本的节点都已经安装了它。如果某个节点上缺少该软件包,节点仍可正常启动,只是会忽略该动作,并在错误日志中记录紧凑输出程序未加载。节点会在下一次配置检查时自动获取该软件包,无需人工重启。尚未升级到包含该功能版本的节点同样会忽略该动作,在升级之前照常返回未经紧凑处理的响应。

在节点上安装、升级或卸载该软件包,都会改变该节点为自己生成的配置,节点会像处理其他全局配置变更一样,在下一次配置检查时对 nginx 进程做一次二进制升级来应用它,客户端连接不会中断。如果一次软件包升级先删除文件、再重新安装,可能会连续触发两次这样的二进制升级。

如果某个紧凑输出程序文件损坏、被截断,或者是为其他 CPU 架构编译的,节点在加载该文件时配置测试会失败。此时节点会继续用之前的配置对外提供服务,并拒绝之后的所有全局配置更新;节点的错误日志中会写明无法加载的文件名。在该节点上重新安装紧凑输出软件包,或者先卸载再重新安装,节点都会在下一次配置检查时重试。无需重启该节点。