如何在 lighttpd 中提供静态压缩 javascript 文件?

How to serve static gzipped javascript files in lighttpd?

背景:
我在 Armbian (20.11.6) 上有一个小型 RaspberyPi-like 服务器(准确地说是在 Odroid XU4 上)。 我使用 lighttpd 来提供页面(包括 Home Assistant 和一些使用 chartjs 的统计数据和图表)。 (这里的例子文件是Chart.bundle.min.js.gz)

问题:
似乎有越来越多的 javascript 文件,它们变得比 html 和数据本身更大(一些数字用于 power/gas 消费等)。我习惯在服务器上使用 mod_compress、mod_deflate 等(即时压缩文件),但这会杀死 Odroid(或不必要地加载 CPU 和可怜的 SD 卡用于缓存).

想法:
现在,想法是,只压缩 javascript(和其他静态(如 css))文件并将其作为静态 gzip 文件提供,任何现代浏览器 can/should 都可以处理。

解决方案 0:
我只是压缩了文件,希望浏览器能理解它…… (很明显,link 被打包在脚本 html 标签中,所以如果浏览器认为 gz 是一个 gzip……它应该可以工作)。 它没有 ;)

解决方案 1:
我启用了 mod_compress(在多个页面上建议)并尝试提供静态 js.gz 文件。
https://www.drupal.org/project/javascript_aggregator/issues/601540
https://www.cyberciti.biz/tips/lighttpd-mod_compress-gzip-compression-tutorial.html
没有成功(浏览器将其视为二进制 gzip,而不是 application/javascript 类型)。 (有些页面建议启用mod_deflate,但似乎不存在)

解决方案 2:
(mod_compress继续)我做了上面的,然后开始摆弄HTML中的Content-Type、Content-Encoding(在脚本html标签中)。这根本不起作用,因为 Content-Type 可以在 HTML 中以某种方式受到影响,但似乎 Content-Encoding 不能。
https://www.geeksforgeeks.org/http-headers-content-type/
(我没有安装 php(可以这样做)以节省内存、SD 卡寿命等)。

解决方案 3:
我在 setenv.add-response-header 的 10-simple-vhost.conf 默认配置文件中添加了 "Content-Encoding" => "gzip" 行。这看起来是一个肮脏的疯狂举动,但我想检查浏览器是否接受我的 js.gz 文件......它没有。
而且根本没有加载任何内容。

问题:
什么是简单的方法来做到这一点? (没有 php)。
也许像 Apache 中的 htaccess 这样的东西?

编辑 1:
貌似nginx可以做到out-of-the-box:
Serve static gzip files using node.js
http://nginx.org/en/docs/http/ngx_http_gzip_static_module.html
我也在深入研究 lighttpd 中的 headers 故事:
https://community.splunk.com/t5/Security/How-to-Disable-http-response-gzip-encoding/m-p/64396

编辑 2:
是的......经过一番思考,我想到这个文件似乎可以缓存很长时间,所以也许我不应该太在意:)

看来我写了这么久的问题,我接近解决方案了。

我创建了一个模块文件 12-static_gzip.conf,内容如下:

$HTTP["url"] =~ ".gz" {
    setenv.add-response-header = (
        "Content-Encoding" => "gzip"
    )
}

我没有发现 lighttpd 有任何类似的技巧,所以我在这里应用了一个类似的解决方案,我将用于 Apache。预期的行为是,它只会响应 gz 文件的 Content-Encoding header,而不使用 php 或任何其他模块... 并且有效!

mod_compress 模块或任何其他此类模块已被禁用,无需进行其他更改。

显然,http 协商更复杂,所以我不确定这是否适用于所有浏览器,但它确实适用于 Chrome。

我还计划创建一些 ESP32 网络服务器,其中驱动器和内存更为关键,因此我将尝试应用类似的解决方案。

尽管如此,问题仍然存在...
有 better/cleaner 解决方案吗?
是否有一些注意事项?浏览器兼容性等 ?

您设置响应的解决方案(如下)header 对您的情况是可行的。

但是,我建议将 lighttpd mod_deflatedeflate.cache-dir(lighttpd 1.4.56 及更高版本)一起使用

如果配置正确,lighttpd 将为支持压缩的客户端提供 gzipped Content-Encoding,而 lighttpd 将为不支持压缩的客户端提供纯内容。 lighttpd 将在提供服务时压缩每个文件,并将压缩文件保存在 deflate.cache-dir 中,这样下次请求文件时 lighttpd 就不必 re-compress 该文件。 lighttpd 将检测原始文件是否已更改,并在下次请求文件时re-compress将其放入缓存。