各位朋友,
我浏览了几个帖子寻找答案——并且找到了许多(下面有链接——谢谢你们!)。多亏了这些帖子,我能让大部分东西看起来符合我的要求。但仍有一个问题我没能解决。
这关系到嵌入式资源文件,特别是 embed_HASH.css 文件。
看起来 当这些资源被构建时,它们不是使用活动主题的调色板编译的。这可能是设计如此,也可能是我遗漏了什么。
我想弄清楚以下几点:
embed_[digest].css 是否总是使用默认调色板构建?
如果是这样,我可以接受——我知道在改进 Discourse 的主题和调色板处理方式方面有很多正在进行的工作。
如果它可以 使用自定义调色板构建,我该如何触发这种行为?
我注意到它可以根据系统的浅色或深色调色板构建 ,所以似乎有可能使用自定义调色板——但我一直无法可预测地生成浅色或深色嵌入文件。
为了测试这一点,我删除了所有主题和调色板,将所有内容恢复到默认的浅色主题,然后运行了:
rake assets:precompile
rake assets:precompile:build
……期望得到一个浅色主题的 embed_HASH.css。但结果似乎仍然使用了深色样式。
我对内部机制不太熟悉,所以可能遗漏了显而易见的东西。如果有人能分享一下如何让 embed_HASH.css 使用可预测的调色板构建,那将非常有帮助。
提前感谢!
供参考,我的 Discourse 实例运行在 Docker 中,并且是最新的。我使用了 launcher 脚本和独立模板。
相关阅读(新账号只允许 2 个链接,第 3 个是可搜索的标题):
我找到了我问题的部分答案,并想分享我的见解:
embed_[digest].css 文件确实是使用活动主题的选定颜色调色板构建的。
我意识到问题出在非常激进的 HTTP 响应缓存 上。
我仍然希望有人能回答:
Discourse 在哪里缓存资源文件的 HTTP 响应?
这不仅仅是浏览器端的缓存——它似乎也是服务器端的。
当跟踪 Rails 生产日志时,我注意到只有具有新、未见过的一组查询参数 的请求才会触发新的资源渲染:
$ tail -n 50 shared/standalone/log/rails/production.log -f
Started GET "/stylesheets/embed_afe162195ad0a7185309a19d8c36036d2e53708c.css?__ws=domain.tld&foo=bif" for fd00:aaaa::f1a at 2025-06-27 01:14:38 +0000
Processing by StylesheetsController#show as CSS
Parameters: {"__ws"=>"domain.tld", "foo"=>"bif", "name"=>"embed_afe162195ad0a7185309a19d8c36036d2e53708c"}
Sent file /var/www/discourse/tmp/stylesheet-cache/embed_afe162195ad0a7185309a19d8c36036d2e53708c.css (0.2ms)
Completed 200 OK in 22ms
在那之后,任何后续对同一 URL 的请求(即使具有不同的查询字符串)都会返回相同 的响应——即使底层主题已更改。
例如:
https://domain.tld/stylesheets/embed_[digest].css?__ws=domain.tld
https://domain.tld/stylesheets/embed_[digest].css?__ws=domain.tld&foo=bar
我只在第一次 使用唯一查询时才看到更新的主题样式。所有后续具有相同参数的请求都会提供先前版本,即使在重新编译之后也是如此。
launcher 脚本默认为 RAILS_ENV=production,我保持原样。我可以在开发过程中尝试切换到 RAILS_ENV=development 以完全禁用缓存,但理想情况下,我想知道:
如何在生产环境中清除或禁用资源响应的 HTTP 级别缓存?
如果有人对 Discourse 如何缓存这些资源响应——或如何正确使其失效——有任何见解,那将非常有帮助。
1 个赞
哦,天哪 原来是 Nginx!
简而言之:
rm -rf /var/nginx/cache/*`
瞬间解决!
可选:禁用 Nginx 资源缓存
编辑此文件:
/etc/nginx/conf.d/discourse.conf
在大约第 243-246 行,注释掉缓存指令:
# proxy_cache one;
# proxy_cache_key "$scheme,$host,$request_uri";
# proxy_cache_valid 200 301 302 7d;
# proxy_cache_bypass $bypass_cache;
然后重启 Nginx:
sv restart nginx
如果您正在更改配色方案…
仅编辑主题中的颜色设置不会重新生成 embed_[digest].css 。要强制 Discourse 生成新的资源文件,请执行此操作:
rm tmp/stylesheet-cache/* # 或者,仅针对 embed,`rm tmp/stylesheet-cache/embed*`
RAILS_ENV=development 怎么样?
您可能认为设置 RAILS_ENV: development 会禁用缓存,但是:
Discourse 使用的 nginx.sample.conf 默认启用 缓存,无论环境如何
该缓存不与 RAILS_ENV 绑定 ,因此它无助于嵌入式资源缓存
因此,除非您计划完全重新配置 Nginx 层,否则只需手动清除缓存或禁用那些行 即可。准备好生产环境后,您可以恢复原状。
./launcher rebuild standalone 怎么样?
当然,它有效。但是,如果您正在积极调整主题、测试嵌入和调整颜色…您会希望每次都比等待几分钟更快。
有更好的开发设置或快速修复方法?请评论!
system
(system)
关闭
2025 年7 月 27 日 03:00
4
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.