パス下で複数の厳格なApache ProxyPassルールが必要、およびユーザーアバター画像のアップロード問題

こんにちは。

元々 include.metaring.com で利用されていた v2.4.0.beta2 +346 の Discourse インストールについて、以下のような環境で運用していました。

  • Apache HTTP Server (Ubuntu) を使用
  • 全 HTTP リクエストを HTTPS にリダイレクト
  • SSL 証明書(LetsEncrypt)の管理を Apache 自身で行う
  • すべてのリクエストは Proxy を介して nginx http sock へ転送されるため、Discourse Docker のポート 80 と 443 は無効化・未使用

HTTPS ですべてのコンテンツが提供されていることを確実にするため(そうでない場合、いくつかのエラーが発生していたため)、以下の操作を行いました。

./launcher enter app
rails c
[1] pry(main)> SiteSetting.force_https = true
=> true

これで問題なく動作していました。

その後、データベースやその他の設定を変更せずに、アプリケーションを include.metaring.com/discourse 配下に移動させることを決め、app.yml ファイルを以下のように編集しました。

  • DISCOURSE_HOSTNAME: include.metaring.com ← 変更なし(以前と同じ)
  • DISCOURSE_RELATIVE_URL_ROOT: /discourse

さらに念のため、以下の操作を行いました。

./launcher stop app
./launcher destroy app
./launcher cleanup
./launcher rebuild app

もちろん、Apache の設定ファイルにも、/discourse から unix:/../../nginx.http.sock|http://localhost/*discourse* への正しい ProxyPass ルールを追加しました。

この後、アプリケーションはオンラインになりましたが、多くの問題が発生しました。

  1. 静的コンテンツ(プラグイン、アセット、画像、JavaScript、アップロードファイル)が利用できなくなりました。長時間のデバッグや成果の得られない Web 検索を経て、Apache にいくつかの Proxy ルールを追加し、それらを ルート である localhost パスへトンネリングするように設定しました(/discourse プレフィックスを付けない)。例えば、/discourse/pluginsunix:/../../nginx.http.sock|http://localhost/plugins へ、といった具合です。

  2. 一部の /uploads パスが Web ページから /discourse プレフィックスなしで取得されるため、/uploads/ から unix:/../../nginx.http.sock|http://localhost/discourse/uploads へ転送する別の Apache Proxy ルールを追加する必要がありました。

  3. 最も奇妙な点は、クライアントが /uploads/default/ または /discourse/uploads/default/(静的コンテンツ)を含むリクエストを送信する場合、上記 1 の解決策に従い、両方を http://localhost/uploads/default//discourse プレフィックスなし)へリダイレクトする必要があります。一方、/uploads/ または /discourse/uploads/ のうち /default プレフィックスを含まない他のリクエスト(これは Web サービス呼び出しであることを意味します)は、http://localhost/discourse/uploads/ へリダイレクトする必要があります。

これら 9 つの Proxy ルールを追加した結果、/discourse 配下でも再びすべてが正常に動作するようになりました。しかし、これほど多くの設定を追加しなければならなかったことは非常に奇妙に感じられます。

何か間違っているのでしょうか?
この状況を管理するためのより賢明な方法はあるでしょうか?

=== 編集 ===
もしかすると関連しているかもしれませんが、別のことを忘れていました。
ユーザーが個人のアバターとして使用するカスタム画像をアップロードしようとすると、アップロードは正常に完了し、画像のサムネイルも正しく表示されます。

しかし、「変更を保存」ボタンを押してページが再読み込みされると、アバターはデフォルトのユーザーアバターに戻ってしまいます

production.log ファイルを確認すると、エラーは Code 418 であることがわかります。
他の画像のアップロードは正常に動作しています。

ご回答と、素晴らしい Discourse の開発に感謝いたします。

サブフォルダへのインストールは非常に複雑であり、推奨されません。

承知いたしました。ありがとうございます。

ただ、この場合は打開策がないため、他に提案がなければ状況を見守り、管理できる他のプロキシルールがないか確認します。

ユーザーアップロードに関するご提案はございませんか?どうやらデータベースのストレージ問題のように思えますが、いかがでしょうか?