Apacheでリバースプロキシを使ってインストールしたい

Apache のリバースプロキシを使用してインストールしようとし、カスタムポートでのインストールを試みましたが、うまくいきませんでした。
これを行う方法はありませんか?

ドメイン名を確認しています . . .
警告: ホスト名: DOMAIN-NAME を使用して、コンピュータのポート 443 にアクセスできないようです。
警告: DOMAIN-NAME への接続(ポート 80)も失敗しました。

これは、DOMAIN-NAME が、Discourse をインストールしているこのマシンに到達しない何らかの IP アドレスに解決されていることを示唆しています。
最初に行うべきことは、DOMAIN-NAME がこのサーバーの IP アドレスに解決されていることを確認することです。
通常、これはドメインを購入した同じ場所で行います。

IP アドレスが正しく解決されていると確信している場合、ファイアウォールの問題である可能性があります。
「open ports YOUR CLOUD SERVICE」でウェブ検索すると役立つかもしれません。

このツールは最も標準的なインストールのみを対象に設計されています。上記の問題を解決できない場合は、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'
exec が以下のパラメータで失敗しました: "/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 ポートはどれですか?
## 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

Discourse コンテナ内の Unix ドメインソケットへのリバースプロキシとして機能する、動作確認済みの Apache2 バーチャルホスト設定例をご紹介します。

ポート 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/ からの大部分の設定ファイルは、グローバルレベルで
        # 有効または無効にされていますが、特定のバーチャルホストのみに
        # 適用される行を含めることも可能です。例えば、以下の行は、
        # "a2disconf" でグローバルに無効化された後に、このホストのみの
        # CGI 設定を有効にします。
        #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/ からの大部分の設定ファイルは、グローバルレベルで
        # 有効または無効にされていますが、特定のバーチャルホストのみに
        # 適用される行を含めることも可能です。例えば、以下の行は、
        # "a2disconf" でグローバルに無効化された後に、このホストのみの
        # CGI 設定を有効にします。
        #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 ソケット を使用している点にご注意ください。

また、この設定では 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/ からの大部分の設定ファイルは、グローバルレベルで
        # 有効または無効にされていますが、特定のバーチャルホストのみに
        # 適用される行を含めることも可能です。例えば、以下の行は、
        # "a2disconf" でグローバルに無効化された後に、このホストのみの
        # CGI 設定を有効にします。
        #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/ からの大部分の設定ファイルは、グローバルレベルで
        # 有効または無効にされていますが、特定のバーチャルホストのみに
        # 適用される行を含めることも可能です。例えば、以下の行は、
        # "a2disconf" でグローバルに無効化された後に、このホストのみの
        # CGI 設定を有効にします。
        #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 リバースプロキシ設定では haproxy を使用していない点にご注意ください。 haproxy は、ほとんど実用的な利点をもたらさずに不要な複雑さを追加するだけです。そのため、私たちは 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

ようこそ!

いかに簡単かお分かりいただけましたか?

あなたが示したように、HTTPS なしの単純なポート 80 の設定で、Apache2 を Discourse のリバースプロキシとして設定するのは簡単なことです。よくできました :slight_smile:

「いいね!」 3

また、https 経由でサイトへのアクセスにも成功しました。
さらに、https へリダイレクトするリバースプロキシの Apache を設定しました。
しかし、リソースは 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

こんにちは!discourse-setup スクリプトは、ポート 80/443 が使用中の場合にこのページに誘導されますが、この手順は新規インストールには適用されません。独自のリバースプロキシを使用して新規インストールを行うには、どのようにすればよいでしょうか?

お試しください:

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

その後、app.yml を手動で編集する必要がありますが、少なくとも入力が必要な項目は自動的に埋められます。

これでうまくいったかどうか教えてください。そうすれば、誰かがその手順書 accordingly 編集できます。

「いいね!」 1

HTTP_PORT と HTTPS_PORT に変数を使用するようにスクリプトを変更しました。ただし、この方法はクリーンな解決策ではなく、設定が失われてしまう可能性があります。投稿でその点に触れていただければ、初回インストール時に役立つと思います :slight_smile:

app.yml に変更を加えましたか?いつ失われるとお考えですか?