新安装出现 502 Bad Gateway

大家好,

我已经设置了两次 Discourse,一次是在容器中,一次是在虚拟机中,但在这两次安装中,Discourse 都无法访问。我不太确定问题出在哪里。

Discourse 虚拟机:

  • 核心数 4
  • 内存 6GB
  • 存储 50GB
  • 操作系统:Ubuntu 22.04.3

干净的 Post OS 安装命令:

apt update -y && apt upgrade -y && apt wget curl zip git docker.io -y && reboot

然后我遵循了以下指南:discourse/docs/INSTALL-cloud.md at main · discourse/discourse · GitHub

完成后,我可以看到容器正在运行,但返回 502 Bad Gateway。

我的设置方式:Nginx 反向代理(包含 SSL)-> VM。这不起作用。
即使我直接将其添加到 hosts 文件中,它也无法加载。

从安装的最后几行可以看到,docker 创建了一个新网络:

DOCKER_HOST_IP=172.17.0.1 --name app -t -p 80:80 -p 443:443

如何让它使用 HOST 机器的 IP?
我不需要另一个网络中的网络。我乐意让 docker 使用 HOST IP,因为这是该 VM 上唯一的服务。

非常感谢任何帮助!

是否有不使用 docker 的官方安装方法?

2 个赞

容器是否位于具有公共 IP 的机器上?该公共 IP 是否已分配域名?

您是否运行了 discourse-setup?您是否通过了它检查 DNS 是否有效以及主机是否可用的部分?

您是否运行了大量重建,导致被 Let’s Encrypt 限制了速率,无法分配证书?

不,此计算机已分配本地 IP,流量通过我的防火墙路由到 localIP。这不是问题。
公共 IP 有一个服务器的 A 记录,并且路由正确。forum.somedomain.com 指向正确的服务器。

是的,我已经通过了安装。已 100% 完成(3 次),直到容器正在运行。
它通过了所有域名/DNS 检查。它显示为有效。

不,这无法被速率限制,因为 SSL 证书是通过我的反向代理颁发的。我拥有证书。

此安装已 100% 完成。问题在于 Docker 创建了一个新网络 172.17.0.1,这是不需要的,因为我想使用 HOST 的本地 IP 192.xx.xx.xx。

容器正在运行,但在不同的网络上。我无法将其连接到 HOST IP。

docker 主机应该是服务器的 IP(192.xxx.xxx.xxx),而不是一个新网络。它可能正在工作,但在这个网络上。
我如何告诉安装程序使用我的本地 IP 而不是 172.17.0.1?

@pfaffman 类似这样。来自你的一条评论

如何在安装时设置 ./discourse-setup 使用主机 IP 192.168.1.X 和网络?

您不能将 discourse-setup 与反向代理一起使用。您必须自己编辑 yml 文件。有一些关于在同一台机器上运行 discourse 与其他网站的主题。

如果您使用的是执行 SSL 的反向代理,则需要删除 ssl 和 let’s encrypt 模板。

这就是问题所在,我在这台机器上没有运行任何其他服务。它是一个独立的虚拟机。

我认为存在误解。

./docker-setup 安装成功。它为应用程序 172.17.0.1 创建了自己的网络。

如何让安装或 Docker 容器使用主机 IP 192.168.1.X,即使用桥接网络而不是创建自己的网络。

但是你说了这个:

如果你在使用反向代理,你就不能使用 discourse-setup。

是的,反向代理在另一台服务器上,但我明白你的意思了。

我有一个想法。我将把我的网络的所有流量路由到 Docker 容器网络。

是否有在 Nginx 反向代理后面运行 Discourse 的安装指南?

或者我是否可以自己构建 Discourse?

这很简单。您在 app.yml 中允许 http 端口,Nginx 会将流量发送到那里。并且 SSL 被禁用。这两件事是您需要修复的唯一问题。当然,您必须提供真实 IP,但这每次都必须这样做,无论是后端是 Discourse、Moodle、WordPress 还是其他什么。UFW 试图限制前端和后端之间的访问,因为没有必要允许直接访问后端。

如果我没记错的话,这里有关于如何设置 Apache2 的文档。Nginx 做同样的事情,但当然有它自己的方式。

或者我这次又错过了什么?

1 个赞

让我从头开始,这样您就可以知道我遗漏了什么简单的问题。

我有一个 Nginx 反向代理。它运行并管理公共 IP 并进行服务路由。

例如:客户端请求 cloud.domain.com → Nginx 反向代理(处理 SSL)-> 指向 cloud.domain.com

现在我为 discourse 设置了一个虚拟机,并使用了以下内容:
Ubuntu 23.04。操作系统安装后的命令:

apt update -y \
apt upgrade -y \
apt install wget curl zip git docker.io -y

然后我遵循了 Discourse 的这个指南 discourse/docs/INSTALL-cloud.md at main · discourse/discourse · GitHub

安装成功完成,然后问题就开始了。

由于 docker0 网络,我无法从主机访问 docker 容器。我可以 ping 通 172.17.0.2 并且它正在运行,但从主机 192.168.1.10:80/443 无法将流量传递到容器。

我只想让 docker 容器使用主机网络,因为容器暴露了 80 和 443 端口。

第一个 Nginx 反向代理正确地处理了来自外部的流量并将其传递到 VM。如果不是这样,./discourse-setup 就不会正确地获取域名,并且它将无法为容器检索 SSL 证书。

总之,我知道容器 100% 在工作,只是由于 docker 网络我无法访问它。

如果您需要任何信息,请告诉我。

另一种方法是使用 discourse 基础镜像
https://hub.docker.com/r/discourse/base
并使用 docker compose 等构建自己的编排(请记住,您还需要其他服务,如 redis 和 postgres)

我可以使用 Nginx 或 Nginx+Varnish 在同一 VPS 或不同 IP 的 VPS 上为 Discourse 进行此操作。您没有说明您实际如何使用 Nginx 作为反向代理。您的示例有点困难,因为无法知道这些是示例还是您实际上正在尝试使用私有网络。

但是:

当然不会,因为那是处理传入流量的。您必须为后端使用其他端口。

类似这样(实际上与 Varnish 一起使用,但原理完全相同,而且非常基础):

proxy_pass http://127.0.0.1:8080;
proxy_set_header X-Real-IP  $remote_addr;
proxy_set_header X-Forwarded-For
 $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Port 443;
proxy_set_header Host $host;
proxy_pass_header Server;

明白了,感谢您的具体说明 :)。

我不确定是什么,因为这个 Docker 网络太令人困惑了。

确实如此,这就是我因为 Docker 而感到沮丧的原因 lol

下面是我 WAN 网络如何从我的 nginx 反向代理传递和路由流量到正确主机的确切设置。

map $scheme $hsts_header {
    https   "max-age=63072000;includeSubDomains; preload";
}

server {
  set $forward_scheme https;
  set $server         "10.10.1.38";
  set $port           443;

  listen 80;
listen [::]:80;

  listen 443 ssl http2;
listen [::]:443 ssl http2;


  server_name forum.domainname.com;

  # Let's Encrypt SSL
  include conf.d/include/letsencrypt-acme-challenge.conf;
  include conf.d/include/ssl-ciphers.conf;
  ssl_certificate /srv/ssl/domainname.pem;
  ssl_certificate_key /srv/ssl/domainname-ke.pem;


# Asset Caching
include conf.d/include/assets.conf;

# Block Exploits
include conf.d/include/block-exploits.conf;

# HSTS (需要 ngx_http_headers_module) (63072000 秒 = 2 年)
add_header Strict-Transport-Security $hsts_header always;

# Force SSL
include conf.d/include/force-ssl.conf;

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_http_version 1.1;


access_log /var/logs/domainname-access.log proxy;
error_log /var/logs/domainame_error.log warn;

proxy_set_header  X-Real-IP $remote_addr;
proxy_set_header  X-Forwarded-For $http_x_forwarded_for;
proxy_set_header  X-Forwarded-Proto $scheme;

location / {

  # HSTS (需要 ngx_http_headers_module) (63072000 秒 = 2 年)
  add_header Strict-Transport-Security $hsts_header always;

    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $http_connection;
    proxy_http_version 1.1;
    
    # Proxy!
    include conf.d/include/proxy.conf;
  }
}

奇怪的是,我曾经为一位想要 nginx 反向代理管理器(nginx reverse proxy manager)的客户设置过一个 Docker 容器,它非常简单。

docker-compose up -d
就是这样。私有 IP 192.168.1.3 可以访问容器暴露的 80/443 端口,并且出站流量被正确路由到 192.168.1.3。

它之所以令人困惑,是因为它是一个在自己的沙盒中运行的打包系统。基本上就是这样。

但是理解 Docker 和使用 Docker 是两回事(现在有一群开发者开始哭了 :rofl:)。你的反向代理通过防火墙将流量发送到 IP 地址,你必须告知该 IP 地址和监听端口。然后你在这个 IP 地址上运行 Discourse,也就是 Docker,以及你在 app.yml 中指定的端口。内部的 Nginx 会处理剩下的事情,它与 Discourse 本身协同工作。

Discourse 不应该监听 443 端口,因为你已经终止了 SSL。

而且你基本上不能在反向代理上使用缓存。后端 Discourse 不是一个网页。它是一个发送 JavaScript 和 JSON 的 Web 应用程序。

我大概明白了。

这点我倒是可以同意。我倒不至于说是哭泣,只是对于那些真正懂 Linux 的系统管理员和开发者来说,它毫无用处。创建一个 LxC 或 VM 来隔离环境,然后再让 Docker 创建另一个隔离的环境,这是多余且毫无意义的。

这部分令人困惑。app.yml 在 172.17.0.2 上暴露了 80:80 和 443:443,该 IP 地址位于 Docker 网络 172.17.0.1/16 中,而 VM 的 IP 地址是 10.10.1.38。

如何让 Discourse/Docker 允许所有进入 10.10.1.38 的流量被传递到 172.17.0.2,并且所有传出的流量都必须被传递到 10.10.1.38?解决这个问题只需要这些。字面意思。

我的反向代理将处理从 WAN 到 forum.domainname.com 的路由。

缓存已被移除。

1 个赞

仅当您不更改它们时。您应该只使用一个端口。

80:80 和 443:443 是默认设置,仅在没有反向代理或其他作为前端的设备时使用。

1 个赞

你给了我一个主意。

我一直在检查所有的基础文件,我想我已经明白了。

太简单了,哈哈。我正在忙着重建,这可能会100%奏效,使用标准的官方支持的安装方法。

成功 论坛现已安装并正常工作。

使用标准且受支持的安装方法 :smiley:


2 个赞

@pfaffman 您可以将此移至安装,因为它现在是受支持的安装。

它在那里。它只是被标记为不支持 :smirking_face:

你最初的问题是什么,为什么你没有在没有反向代理的情况下开始安装?我只是好奇。