通过 Docker Compose 在应用的 Nginx 前部署 Caddy

我升级了我的一个 Discourse 论坛服务器,因此在 IONOS Cloud Panel 防火墙中开启了 UDP 443 端口,而不仅仅是 TCP(我来自英国)。

我没有使用 CDN,因为这个特定的论坛用户数量不多,但类别很多。

我在通过 nginx 正确配置 IP 地理位置时遇到了一些困难,但现在论坛运行良好,/logs 中没有任何问题。

我使用 Docker Compose 设置了轮转代理日志,并且注意到 Caddy 会对代理日志中的敏感字段进行自动脱敏,这是我以前在使用 Nginx 时没有注意到的。虽然我只记得在生产环境中使用 Discourse 的两年里,只有两次查看过代理日志。

我希望能了解一下,如果我发布一份指南,详细说明我从 初学者 Docker 安装指南 开始,运行了哪些命令以及运行后发生了什么,从而得到现在这个稍微更适应移动设备的论坛,大家会有多大的兴趣。我可以包括用于未来维护的命令,例如将 Caddy 升级到新版本,但我尚未在我的 IONOS L VPS 上测试过这些命令。

仅供参考,这里有这个 PR:Add Caddy web server template as nginx alternative - Pull Request #952 - discourse/discourse_docker - GitHub

谢谢,我之前没看到那个 PR。这很有趣——我的设置略有不同,因为我保留了 Discourse 自带的 nginx Web 服务器,并在其前面通过 Docker Compose 单独运行 Caddy,主要是为了在边缘提供 HTTP/3 支持。

这里有一个小的 Discourse 端改动:我添加了一个持久的 app.yml 钩子,以便在请求通过 Unix 套接字到达时,nginx 使用 Caddy 的 X-Forwarded-For 值作为真实的客户端 IP。我最初需要 Caddy 的 X-Real-IP 变通方案,但在添加 nginx 端的修复后,我能够移除该方案并验证 Discourse 仍然记录正确的客户端 IP。

此外,我在 Caddy 配置中明确禁用了 QUIC 0-RTT/早期数据,同时保持启用 HTTP/3,以避免额外的早期数据边缘情况。

我的方法还启用了 Caddy 在站点级别的 HTTP 访问日志,这为我提供了 Caddy 对敏感凭据标头的默认脱敏功能。我对生成的 Docker json-file 日志进行轮转,设置为 25 MB × 3。我注意到该 PR 目前将轮转日志块放在 Caddy 的全局选项中,而 Caddy 的文档将其描述为配置运行时日志,而非 HTTP 访问日志。

因此,这并非完全未修改的标准安装,但它也不同于完全用 Caddy 替换 nginx 的做法。

我会仔细查看那个 PR。目前我主要感兴趣的是,这种方法是否有足够的关注度,使得编写分步指南值得去做,而不是立即开始编写。

对我上面所说的内容仅作一点更正/澄清。

当我最初将结果描述为:

更利于移动设备使用的论坛时,我注意到的部分情况是,在打开 iOS Safari PWA 时的初始往返请求之前感觉过于缓慢。


然而,我现在很后悔在随后的回复中包含这句话:

禁用 0-RTT 是我在诊断客户端 IP 问题时尝试过的方法,但似乎并非必要。在已经配置了 0rtt off 的情况下,涉及 unix: 的两个 PostgreSQL 错误仍然存在。

似乎解决这些错误的变更实际上是持久化的 app.yml 钩子,它修改了 nginx,使其在通过 Unix 套接字接收请求时使用 Caddy 的 X-Forwarded-For 值作为真实的客户端 IP。

因此,我现在已移除 0rtt off 设置并恢复了 Caddy 的默认行为。HTTP/3 仍在正常工作,正确的客户端 IP 继续传递到 Discourse。

所以,如果最终有足够多的兴趣促使我整理出一份逐步指南,我不会将禁用 QUIC 0-RTT 作为配置的必要部分包含在内。

你也可以使用原生 Nginx 来实现:https://quic.nginx.org/

谢谢 - 我检查了当前随我的 Discourse app 容器一起提供的 nginx,你说得对,它可以直接提供 HTTP/3:

nginx 1.26.3-3+deb13u7
OpenSSL 3.5.6
--with-http_v3_module

因此,直接使用 Discourse 现有 nginx 的 HTTP/3 绝对是一个真正的替代方案。

不过,对于这种特定设置,我可能仍然更倾向于使用 Caddy 的原因之一是 0-RTT。在我进行上述更正后,我重新启用了 Caddy 默认的 QUIC 0-RTT 行为,在 iOS Safari PWA 上,我注意到加载体验有了显著改善,而这正是我试图改进的地方。

根据我对 nginx 文档的了解,在 1.29.1 之前的 nginx 版本中,即使使用 OpenSSL 编译,也无法启用 0-RTT,无论 ssl_early_data 如何设置。因此,我 Discourse 容器中当前的 nginx 1.26.3 虽然支持 HTTP/3,但不支持这一特定优化。

因此,我感兴趣的是比较这两种方法,而不是仅仅因为需要 HTTP/3 就假设必须使用 Caddy。