反向代理 X-Forwarded-For

我最近将论坛迁移到了一个性能更强的主机,并正在努力实现高可用性。

在反向代理中,我添加了 Forward Proto 和 For 头,但 Discourse 上的 nginx 配置只认可了 Proto。

我不得不在 server 下添加以下内容:

set_real_ip_from loadbalancerip;
real_ip_header X-Forwarded-For;

Discourse 是否有环境变量可以添加这些设置?
或者是否可以在 app.yml 中添加某个参数来实现?

我想这正是您在寻找的内容:

不,本指南介绍如何配置一个在容器和宿主机之间共享的 nginx socket。

我正在尝试寻找一种声明式的方法,以便在容器重建后,将以下内容包含到 nginx 配置中:

set_real_ip_from loadbalancerip;
real_ip_header X-Forwarded-For;

您是想将其添加到容器的内部 Nginx 中吗?我认为这没有必要,因为默认情况下已经添加了:

需要这一行才能正常工作。
如果没有它,所有请求的 IP 仍然是负载均衡器的 IP。
我之所以知道,是因为我的 Discourse 因为 429 错误而宕机了。

如果还不清楚,这是我的基础设施架构:
用户 > haproxy > discourse

当然,Discourse 内部包含一个 nginx 反向代理。

我已在 haproxy 中包含了转发头,但 Discourse 内部的 nginx 并未尊重 X-Forwarded-For 头。我不得不在我的原始帖子中添加这两行,并重启容器,问题才得以解决。

你使用的是双容器架构吗?

我认为没有内置的环境变量用于自定义负载均衡器 IP,因为 nginx 本身不会为 server 块读取这些变量。

此外,如果你在运行中的容器内手动编辑了 nginx 配置,下次重建时这些修改会被清除。

我认为,为了让配置永久生效并能够抵御重建,你需要在 app.yml(如果是双容器架构,则是 web_only.yml)中使用 replace 命令——滚动到你的 .yml 文件最底部的 run: 部分,并添加以下代码块。这会指示 Discourse 构建器在 server { 块打开后自动注入你的真实 IP 设置:

run:
  - replace:
      filename: /etc/nginx/conf.d/discourse.conf
      from: /server.+{/
      to: |
        server {
          set_real_ip_from 192.168.1.100; ## 替换为你实际的负载均衡器 IP/子网
          real_ip_header X-Forwarded-For;
          real_ip_recursive on;