在同一台机器上运行其他网站与Discourse

你必须手动进行更改才能使其在反向代理后面工作。假设你知道如何做到这一点,并在创建 app.yml 后进行操作。
这可能会奏效:

./launcher destroy app
mv containers/app.yml first_app.yml
./launcher rebuild first_app
./discourse-setup

然后,你将编辑 app.yml 以使其位于反向代理后面。

2 个赞

当 Discourse 在 Unix 套接字上侦听时,出现混合内容警告。全新安装。

1 个赞

如果我没记错的话,那是缓存的徽标(我假设您已启用 force https 参数)。您能否在浏览器开发者工具/网络选项卡中检查一下?

2 个赞

请将此标记为已解决。我不得不强制设置https,(还执行了rake搜索替换以添加子目录路径)。主服务器运行Apache以及许多其他站点。对于这个example.org,我们安装了WordPress,并为/forums做了Apache反向代理,Discourse正在监听一个websocket。

2 个赞

而不是使用 @riking 在顶部的方法?
您有关于如何使用“双重 NGINX”方法进行操作的指南链接吗?
遗憾的是,我对 NGINX 一无所知,但 @riking 的指南看起来足够简单,但如果 there’s a better way,我将不胜感激。

1 个赞

您好!
我们通过从 Git 存储库克隆文件安装了 Discourse,并按照您的建议操作;但我们使用 Nginx 代理管理器处理了 SSL 协议(我们在 app.yml 中注释掉了暴露端口 443 的部分)。
我们正在使用 portainer v2.11.0,其中可以看到已成功创建的 Discourse 容器,但我们无法运行网站,并收到 502 bad gateway 错误。

有什么办法可以修复这个错误吗?

1 个赞

您是否也移除了 SSL 和 Let’s Encrypt 证书?

1 个赞

参见:


您是否像这样使用 socket 安装:

然后参见:如何调试子文件夹 Discourse 安装

将外部代理配置为直接连接到 Discourse 而不是连接到容器内的 Nginx 代理(导致所有内容都被双重代理),这是否合理?或者内部 Nginx 代理是否承担了外部代理无法处理的重要任务?

你好,如果 nginx.sock 文件不存在,我该怎么办?

❯ ls /var/discourse/shared/standalone/
backups  postgres_backup  postgres_run  state  uploads
log      postgres_data    redis_data    tmp

您是否包含了模板?

3 个赞

我在尝试使用 Dietpi OS 和一些与 Nginx 配合使用的应用程序(如 Nextcloud)在我的 Raspberry Pi 4 上安装 Discourse。我正在尝试使用 Cloudflared 服务作为隧道,但在 Discourse 安装完成后,我找不到 Discourse 服务端口来创建隧道。当我连接到 localhost 时,会出现 Nginx 启动页面。我可以在哪里访问 Discourse 网站?

供参考:我没有配置 certbot,因为我想使用 Cloudflared 服务。

1 个赞

您好,我正在尝试将 Discourse 安装在 GitHub - nginx-proxy/nginx-proxy: Automated nginx proxy for Docker containers using docker-gen 之后,但我不知道该如何操作。

我尝试将 Discourse 的套接字暴露给 nginx-proxy 容器,并添加了一个 每个虚拟主机的位置配置,但没有成功。
我已经成功地在该代理之后设置了其他服务,只剩下 Discourse 了。您有什么建议吗?

1 个赞

您看过 使用 Nginx Proxy Manager 管理 Discourse 的多个站点 吗?

1 个赞

出于好奇,我想了解一下以下两种方法的优缺点?

  1. NGINX 并暴露端口
  2. NGINX 和 templates/web.socketed.template.yml

出于某些原因,我可以启动 NGINX 并提供页面,然后成功启动 Discourse 而无需 NGINX。但当我使用第一种方法时,我总是会收到以下错误。

/var/discourse/shared/web-only/log/rails/production.log
Job exception: Error connecting to Redis on data:6379 (Redis::TimeoutError)

/var/discourse/shared/web-only/log/rails/unicorn.stderr.log
Failed to report error: Error connecting to Redis on data:6379 (Redis::TimeoutError) 3 heartbeat: Error connecting to Redis on data:6379

当我使用第二种方法时,运行 ./launcher rebuild <app> 时甚至无法构建。它会给出类似以下的错误:

I, [2022-09-12T08:54:16.483648 #1]  INFO -- : 
> cd /var/www/discourse && git fetch --depth 1 origin tests-passed
fatal: unable to access 'https://github.com/discourse/discourse.git/': Could not resolve host: github.com
I, [2022-09-12T08:54:56.561225 #1]  INFO -- : 


FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && git fetch --depth 1 origin tests-passed failed with return #<Process::Status: pid 35 exit 128>

在此处键入或粘贴代码

1 个赞

您是否在使用一个仅限 Web 的容器,但没有运行数据容器?

1 个赞

我没有,谢谢。
我修改了我的 app.yml,以便 discourse 容器在与我的代理同名的网络中运行。

然后,我按照 nginx-proxy 文档的建议,使用此主题的值添加了 _location 配置,并使 discourse 套接字可用(为简单起见,与主机上的路径相同)。
但是,似乎存在某个权限问题,但我不太清楚是什么:配置被 nginx 拾取,然后在进行 https 请求时,我收到此错误

[crit] 230#230: *21 connect() to unix:/var/discourse/shared/standalone/nginx.http.sock failed (13: Permission denied) while connecting to upstream, client: <ip>, server: <domain>, request: "GET / HTTP/1.1", upstream: "http://unix:/var/discourse/shared/standalone/nginx.http.sock:/", host: "<domain>"

容器内部:

# ls -lah /var/discourse/shared/standalone/
total 12K
drwxr-xr-x 3 root root 4.0K Sep 12 10:51 .
drwxr-xr-x 3 root root 4.0K Sep 12 10:51 ..
drwxr-xr-x 2 root root 4.0K Sep 12 09:19 nginx.http.sock

编辑:这是由于容器以 sudo 启动和不带 sudo 启动之间存在问题。
但是现在我有了这个:

[error] 219#219: *94 no live upstreams while connecting to upstream, client: <client-ip>, server: <domain>, request: "HEAD / HTTP/2.0", upstream: "http://<domain>/", host: "<domain>", referrer: "http://<domain>"

以及 502 网关错误

1 个赞

实际上两者都有。在使用 docker ps 时,我可以看到两者都在运行。严格来说,唯一的区别就是启用或禁用 expose 部分,尽管现在我想到,我不知道是否也需要注释掉 expose: 行以及其中的端口列表。

1 个赞

抱歉重复发帖,我之前被另一件不相关的事情弄糊涂了,而且由于配置错误,套接字不再使用。
这是我的进展:

[crit] 274#274: *7 connect() to unix:/var/discourse/shared/standalone/nginx.http.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.160.1, server: <domain>, request: "GET / HTTP/2.0", upstream: "http://unix:/var/discourse/shared/standalone/nginx.http.sock:/", host: "<domain>"

我执行了 chmod 777 shared/standalone/nginx.http.sock 来临时解决此权限问题,现在我得到了

[error] 203#203: *1 connect() to unix:/var/discourse/shared/standalone/nginx.http.sock failed (111: Connection refused) while connecting to upstream, client: 192.168.160.1, server: <domain>, request: "GET / HTTP/2.0", upstream: "http://unix:/var/discourse/shared/standalone/nginx.http.sock:/", host: "<domain>"

显然我做了一些错误的事情,但我不知道是什么。请注意,我没有使用 NPM,而是使用了 nginx-proxy,这有点不同,特别是它会自动检测定义了 VIRTUAL_HOST 的 Docker 容器来为它们生成配置。因此,我只添加了与 discourse 相关的 location / { ... } 部分,而没有触及带有 listen 指令的 sites-available 文件。

我注意到 discourse 容器处于重启循环中,状态为“Restarting (100) 7 seconds ago”。这是因为它抱怨无法删除套接字。确实,它不是一个实际的套接字而是一个目录,我猜是因为在挂载卷以将其暴露给 nginx-proxy 容器时操作不当。
我删除了目录,重新启动了 discourse,现在它是一个套接字。但是,我无法将其作为卷暴露给 nginx-proxy

Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting “/var/discourse/shared/standalone/nginx.http.sock” to rootfs at “/var/discourse/shared/standalone/nginx.http.sock”: mount /var/discourse/shared/standalone/nginx.http.sock:/var/discourse/shared/standalone/nginx.http.sock (via /proc/self/fd/6), flags: 0x5000: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type

原来,我只需要将套接字挂载到 /tmp/nginx.http.sock 而不是保持相同的路径。似乎终于成功了!

2 个赞

发现了一个问题,为什么在 /var/discourse/containers/web_only.yml 中按如下方式暴露端口不起作用。

expose:
  # - "443:443"
  # - "80:80"
  - "8080:80"  # https

根据 https://www.programmerall.com/article/443137626/,是 SELinux 在起作用,需要通过运行或将 SELinux 设置为 Permissive 模式来允许 NGINX 访问 Discourse。
setsebool -P httpd_can_network_connect 1

现在有趣的是,如果 NGINX 的配置设置为根路径,它工作正常,但如果设置为非根路径,则不工作。

NGINX 设置为将 / 转发到 Discourse (工作)

    # 将请求代理到 443/discussions 到监听在 127.0.0.1:8080 的 Discourse
    location / {
        proxy_pass          http://127.0.0.1:8080;
        proxy_set_header    Host $http_host;
        proxy_http_version  1.1;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto $scheme;
        proxy_set_header    X-Real-IP $remote_addr;
    }

NGINX 设置为将 /discussions/ 转发到 Discourse (不工作)

    # 将请求代理到 443/discussions 到监听在 127.0.0.1:8080 的 Discourse
    location /discussions/ {
        proxy_pass          http://127.0.0.1:8080;
        proxy_set_header    Host $http_host;
        proxy_http_version  1.1;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto $scheme;
        proxy_set_header    X-Real-IP $remote_addr;
    }

在这种情况下,我看到以下内容… 我的直觉是,即使 NGINX 成功转发了非根路径 /discussions/ 到 Discourse docker,Discourse 本身仍在从自身加载页面,并期望资源位于根路径 /。猜测这是只允许在根路径运行 Discourse 的要求?@pfaffman 之前见过这种情况吗?

/var/log/nginx/example.com.error.log

2022/10/01 09:33:23 [error] 1954781#1954781: *1 open() "/etc/nginx/html/images/discourse-logo-sketch.png" failed (2: No such file or directory), client: 219.78.157.149, server: uat.example.com, request: "GET /images/discourse-logo-sketch.png HTTP/1.1", host: "uat.example.com", referrer: "https://uat.example.com/discussions/"
2022/10/01 09:33:25 [error] 1954781#1954781: *1 open() "/etc/nginx/html/service-worker.js" failed (2: No such file or directory), client: 219.78.157.149, server: uat.example.com, request: "GET /service-worker.js HTTP/1.1", host: "uat.example.com", referrer: "https://uat.example.com/service-worker.js"

1 个赞