紧凑输出 HTML、CSS 和 JavaScript
紧凑输出会在网关压缩并发送响应之前,移除 HTML、CSS 和 JavaScript 响应体中的注释和多余空白,响应的实际内容保持不变。
此功能在 OpenResty Edge 26.12.1-1 中首次引入。
开启紧凑输出
在页面规则(应用 > HTTP 应用 > 页面规则 > 动作)、全局改写规则或全局自定义动作中添加 开启紧凑输出 (Minify) 动作。该动作有三个开关:HTML、CSS 和 JavaScript。当响应的 Content-Type 匹配某个已启用的开关时,该响应会以紧凑形式输出:
| 开关 | 内容类型 |
|---|---|
| HTML | text/html |
| CSS | text/css |
| JavaScript | application/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 架构编译的,节点在加载该文件时配置测试会失败。此时节点会继续用之前的配置对外提供服务,并拒绝之后的所有全局配置更新;节点的错误日志中会写明无法加载的文件名。在该节点上重新安装紧凑输出软件包,或者先卸载再重新安装,节点都会在下一次配置检查时重试。无需重启该节点。