我想使用 Apache 的反向代理进行安装

我想通过 Apache 反向代理进行安装,并尝试使用自定义端口,但未能成功。
是否有办法实现这一点?

正在检查您的域名...
警告:计算机的 443 端口似乎无法通过主机名访问:
DOMAIN-NAME
警告:连接到 DOMAIN-NAME(端口 80)也失败。

这表明 DOMAIN-NAME 解析到了某个无法访问您正在安装 Discourse 的这台机器的 IP 地址。

首先要做的是确认 DOMAIN-NAME 解析到了此服务器的 IP 地址。
您通常可以在购买域名的同一位置进行此操作。

如果您确定 IP 地址解析正确,则可能是防火墙问题。
搜索“开放端口 您的云服务”可能会有所帮助。

此工具仅适用于最标准的安装。如果您无法解决上述问题,则需要自行编辑 containers/app.yml,然后输入

失败
--------------------
Pups::ExecError: /usr/local/bin/ruby -e 'if ENV["DISCOURSE_HOSTNAME"] == "discourse.example.com"; puts "Aborting! Domain is not configured!"; exit 1; end' 执行失败,返回状态为 #<Process::Status: pid 176 exit 1>
失败位置:/pups/lib/pups/exec_command.rb:112:in `spawn'
执行失败,参数为:"/usr/local/bin/ruby -e 'if ENV[\"DISCOURSE_HOSTNAME\"] == \"discourse.example.com\"; puts \"Aborting! Domain is not configured!\"; exit 1; end'"
de0d133ffdd4c51d9a870d09bd16ce8fcc0680130ced1446f0038b4175a46840
** 引导失败 ** 请向上滚动并查找早期的错误消息,可能不止一条。
./discourse-doctor 可能有助于诊断问题。

app.yml

## 此容器应暴露哪些 TCP/IP 端口?
## 如果您希望 Discourse 与另一个 Web 服务器(如 Apache 或 nginx)共享端口,
## 请参阅 https://meta.discourse.org/t/17247 了解详情
expose:
  - "127.0.0.1:8100:80"   # http

params:

您不能使用 discourse-setup,但可以搜索:如何在已有 Apache 站点的服务器上设置 Discourse

2 个赞

谢谢。
我按照指南构建了 Discourse。
但是,Apache 中的反向代理无法正常工作。

    ProxyPass /  ws://var/discourse/shared/standalone/nginx.http.sock
    ProxyPassReverse / ws://var/discourse/shared/standalone/nginx.http.sock

错误

 No protocol handler was valid for the URL /favicon.ico (scheme 'ws'). If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule., 

亲爱的 @Teraterayuki

以下是用于将 Apache2 虚拟主机反向代理到 Discourse 容器中 Unix 域套接字的工作配置示例:

端口 80

<VirtualHost *:80>
        ServerName mysite.mydomain.com
        ServerAdmin webmaster@localhost
        ProxyPreserveHost On

        #ProxyPass / http://127.0.0.1:8888/
        #ProxyPassReverse / http://127.0.0.1:8888/

        # 可用的日志级别:trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg。
        # 也可以为特定模块配置日志级别,例如:
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/community_errors.log
        CustomLog ${APACHE_LOG_DIR}/community.log combined

        # 对于大多数来自 conf-available/ 的配置文件(这些文件在全局级别启用或禁用),
        # 可以为特定虚拟主机包含一行配置。例如,以下行仅为此主机启用 CGI 配置,
        # 前提是该配置已通过 "a2disconf" 全局禁用。
        #Include conf-available/serve-cgi-bin.conf
        ModPagespeed Off
        RewriteEngine on
        RewriteCond %{SERVER_NAME} =mysite.mydomain.com
        RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

端口 443

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName mysite.mydomain.com
        ServerAdmin webmaster@localhost
        #SSLProxyEngine on   #在反向代理上配置好 Let's Encrypt 后启用此项
  	    RewriteEngine On
        
        RewriteCond %{HTTP_USER_AGENT}  (Bytespider|Yandex|Wget|seocompany|CCBot|Cincraw) [NC]
        RewriteRule . - [R=403,L]

  	    ProxyPreserveHost On
  	    ProxyRequests Off
  	    RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
 	    RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}

        #ProxyPass / http://127.0.0.1:8888/
        #ProxyPassReverse / http://127.0.0.1:8888/
        ProxyPass / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
        ProxyPassReverse  / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/

        # 可用的日志级别:trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg。
        # 也可以为特定模块配置日志级别,例如:
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/community_errors_ssl.log
        #CustomLog ${APACHE_LOG_DIR}/community_ssl.log combined

        # 对于大多数来自 conf-available/ 的配置文件(这些文件在全局级别启用或禁用),
        # 可以为特定虚拟主机包含一行配置。例如,以下行仅为此主机启用 CGI 配置,
        # 前提是该配置已通过 "a2disconf" 全局禁用。
        #Include conf-available/serve-cgi-bin.conf
        ModPagespeed Off
        SSLCertificateFile /etc/letsencrypt/live/mysite.mydomain.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/mysite.mydomain.com/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

@Teraterayuki

请注意,在此配置中,代理使用的是 unix socket(Unix 套接字),而不是 web socketws)。

另请注意,在此配置中,您无需手动添加 Let’s Encrypt 信息。您可以从以下配置开始:

运行 Certbot 之前的端口 80

<VirtualHost *:80>
        ServerName mysite.mydomain.com
        ServerAdmin webmaster@localhost
        ProxyPreserveHost On

        #ProxyPass / http://127.0.0.1:8888/
        #ProxyPassReverse / http://127.0.0.1:8888/

        # 可用的日志级别:trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg。
        # 也可以为特定模块配置日志级别,例如:
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/community_errors.log
        CustomLog ${APACHE_LOG_DIR}/community.log combined

        # 对于大多数来自 conf-available/ 的配置文件(这些文件在全局级别启用或禁用),
        # 可以为特定虚拟主机包含一行配置。例如,以下行仅为此主机启用 CGI 配置,
        # 前提是该配置已通过 "a2disconf" 全局禁用。
        #Include conf-available/serve-cgi-bin.conf
        ModPagespeed Off
     
</VirtualHost>

运行 Certbot 之前的端口 443

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName mysite.mydomain.com
        ServerAdmin webmaster@localhost
        #SSLProxyEngine on   #在反向代理上配置好 Let's Encrypt 后启用此项
  	    RewriteEngine On
        


  	    ProxyPreserveHost On
  	    ProxyRequests Off
  	    RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
 	    RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}

        #ProxyPass / http://127.0.0.1:8888/
        #ProxyPassReverse / http://127.0.0.1:8888/
        ProxyPass / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
        ProxyPassReverse  / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/

        # 可用的日志级别:trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg。
        # 也可以为特定模块配置日志级别,例如:
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/community_errors_ssl.log
        #CustomLog ${APACHE_LOG_DIR}/community_ssl.log combined

        # 对于大多数来自 conf-available/ 的配置文件(这些文件在全局级别启用或禁用),
        # 可以为特定虚拟主机包含一行配置。例如,以下行仅为此主机启用 CGI 配置,
        # 前提是该配置已通过 "a2disconf" 全局禁用。
        #Include conf-available/serve-cgi-bin.conf
        ModPagespeed Off

</VirtualHost>
</IfModule>

然后,如果您运行:

certbot -d mysite.mydomain.com

友好的 certbot 将自动为您添加所需的 SSL 代码。

当我们的朋友 certbot 添加了其配置文件代码且一切正常后,您可以取消注释以下行:

#SSLProxyEngine on   #在反向代理上配置好 Let's Encrypt 后启用此项

并再次重启 apache2。

希望这对您有帮助,@Teraterayuki

祝好。


结语:

  1. 请注意,在我们的 Apache2 反向代理配置中,我们不使用 haproxyhaproxy 会引入不必要的复杂性,而几乎没有任何实际好处(对我们而言)。因此,我们以“简单的方式”运行 Apache2 作为反向代理。如果您想使用 haproxy,结果可能因人而异(YMMV);但老实说,我们在多个生产环境的 Apache2 反向代理设置中从未使用过 haproxy,也从未遇到过 Apache2 作为反向代理的问题。
  1. 如果您未使用 mod_pagespeed,请注释掉相关行。但是,如果您正在运行 mod_pagespeed,请在反向代理到 Discourse 时按虚拟主机关闭 mod_pagespeed

祝一切顺利……希望这能在某些方面对您有所帮助。

6 个赞

我完成了
谢谢!
这是我们实际设置的内容!

<VirtualHost *:80>
  ServerName DOMAIN-NAME
    ProxyPreserveHost on
    RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
    RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}
    ProxyPass / unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/
    ProxyPassReverse  / unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/
</VirtualHost>

3 个赞

欢迎!

看,是不是很简单?

将 Apache2 设置为 Discourse 的反向代理简直易如反掌,正如你所示,仅使用简单的 80 端口配置(无需 HTTPS)即可实现。做得好 :slight_smile:

3 个赞

我们还成功通过 https 访问了该站点。
并且我已经配置了反向代理 Apache 以重定向到 https。
然而,资源似乎仍通过 http 访问,导致无法正常显示。
我该怎么办?

你应该发布你的虚拟主机配置文件,因为如果不发布,没人能看到它们,也无法帮助你 :slight_smile:

顺便一提:我已经发布了完全可用、可运行(生产环境)的虚拟主机配置文件,配置与你试图实现的一致。如果你理解并按照这些文件操作,应该完全不会有问题 :wink:

我是这样设置的。
看起来 Discourse 生成的所有 URL 都是 http 协议。

<VirtualHost *:80>
  ServerName DOMAIN-NAME
  RewriteEngine on
  RewriteCond %{HTTPS} off
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>
<VirtualHost *:443>
  ServerName DOMAIN-NAME
  SSLEngine On
  SSLProtocol all -SSLv2
  SSLCertificateFile /etc/letsencrypt/live/DOMAIN-NAME/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/DOMAIN-NAME/privkey.pem
  ProxyPreserveHost on
  RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
  RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}
  ProxyPass / unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/
  ProxyPassReverse  / unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/
</VirtualHost>

您应将 DISCOURSE_FORCE_HTTPS 设置为 true,或在系统设置中配置该选项。

2 个赞

你好!当 80/443 端口被占用时,discourse-setup 脚本会引导你到这里,但这些说明并不适用于全新安装。我该如何使用自己的反向代理进行全新安装?

试试这个:

./discourse-setup  --skip-connection-test --skip-rebuild

之后你仍需手动编辑 app.yml,但它至少会填充它所要求的内容。

如果这有帮助,请告诉我,这样我们就可以相应地编辑该操作指南。

1 个赞

我修改了脚本,使其使用变量来定义 HTTP_PORT 和 HTTPS_PORT。但这不是一个完美的解决方案,因为配置可能会丢失。我认为你可以在帖子中提及这一点,这对初次安装的用户会有帮助 :slight_smile:

你修改了 app.yml 吗?你认为这些更改会在什么时候丢失?