Apache、Ubuntu の複数のポートまたはサブドメイン、同じサーバーの異なるポートへの SSL リバース プロキシ

Apache、Ubuntu の複数のポートまたはサブドメイン、同じサーバーの異なるポートへの SSL リバース プロキシ

ここで困っています。Azure に Ubuntu 18.04 VM があり、Apache2 がインストールされています。VM の Web サーバー /var/www/ を指すドメイン (example.com) があり、最近 SSL を設定してサーバーを保護しました。letsencrypt と "certbot" を使用して証明書を取得し、すべての HTTP トラフィックを HTTPS にリダイレクトするオプションを選択しました。これが私のサイトの .conf です。

root@wp-vm:/# cat /etc/apache2/sites-available/example.com.conf
<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example.com
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    <Directory /var/www/example.com/>
        AllowOverride All
    </Directory>
RewriteEngine on
RewriteCond %{SERVER_NAME} =www.example.com [OR]
RewriteCond %{SERVER_NAME} =example.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

</VirtualHost>

同じサーバーで、RStudio の Shiny サーバー (ポート 3838) と Rstudio Server IDE オープン ソース (8787) という他の Web サービスも実行しています。これらは SSL がオプションではない無料バージョンです。SSL を使用する Web サーバーでは、iframe 経由で Shiny サーバーのコンテンツを Web ページ (wordpress) に埋め込むことができないことがわかりました。そのため、以前は example.com:3838/app にリンクできましたが、ポートを保護するまでは機能しなくなります。

以下のことを実現するにはどうすればよいでしょうか?

http(s)://example.com >> webserver (OK)
http(s)://example.com:48787 >> rstudio @ 8787
http(s)://example.com:43838 >> shiny @ 3838

またはさらに良い、次のようにサブドメインを設定するにはどうすればよいでしょうか (あまり複雑にならない場合)。

http(s)://example.com >> apache webserver @ /var/www (OK)
http(s)://rstudio.example.com >> rstudio @ 8787
http(s)://shiny.example.com >> shiny @ 3838

明確に言うと、ブラウザは HTTPS で通信する必要がありますが、8787/3838 のサービスは HTTP のままになります。

すでに試したがうまくいかなかったことのいくつかは次のとおりです。ProxyPass と ProxyPassReverse を使用して、多数のモジュールをロードし、さまざまな方法で vhost を定義し、既存の vhost を "Location" /subdomain タグで変更し、ports.conf で新しいポートを listen するように apache に指示し、ファイアウォール (azure と ufw) を開きました。明らかに何かが足りないのですが、それが何なのかわかりません。これが現在のファイアウォールです。他に回答に役立つ情報があれば教えてください。

root@wp-vm:/# ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] Apache Full                ALLOW IN    Anywhere
[ 2] 3838                       ALLOW IN    Anywhere
[ 3] 8787                       ALLOW IN    Anywhere
[ 4] 43838                      ALLOW IN    Anywhere
[ 5] 48787                      ALLOW IN    Anywhere
[ 6] 22/tcp                     ALLOW IN    Anywhere
[ 7] Apache Full (v6)           ALLOW IN    Anywhere (v6)
[ 8] 3838 (v6)                  ALLOW IN    Anywhere (v6)
[ 9] 8787 (v6)                  ALLOW IN    Anywhere (v6)
[10] 43838 (v6)                 ALLOW IN    Anywhere (v6)
[11] 48787 (v6)                 ALLOW IN    Anywhere (v6)
[12] 22/tcp (v6)                ALLOW IN    Anywhere (v6)

アパッチ

root@wp-vm:/# apache2 -v
Server version: Apache/2.4.29 (Ubuntu)
Server built:   2020-08-12T21:33:25

編集/更新: 重要なファイルの内容を省略していたことに気付きました。また、おそらくこれまでずっと間違ったファイル (example.com.conf) をいじっていたことにも気付きました。

root@wp-vm:/etc/apache2/sites-available# cat example.com-le-ssl.conf
<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerAdmin webmaster@localhost
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example.com
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    <Directory /var/www/example.com/>
        AllowOverride All
    </Directory>


Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem

</VirtualHost>
</IfModule

そのため、example.com.conf ファイルはそのままにしておきます。これは、すべてのリクエストを https として書き換え、443 にリダイレクトするだけだと思う​​からです。これを ssl conf ファイルに追加してみましたが、うまくいきませんでした。このファイルですべてを再試行する必要がありそうです。

ProxyRequests off
ProxyPass /shiny/ http://localhost:3838/
ProxyHTMLURLMap http://localhost:3838 /shiny

<Location /shiny/>
        ProxyPassReverse /
        ProxyHTMLEnable On
        ProxyHTMLURLMap  /      /shiny/
        RequestHeader    unset  Accept-Encoding
</Location>

編集#2 かなり近いので、試してみる価値はあります。基本的にはサブディレクトリ (example.com/shiny および /rstudio) で動作しています。ただし、アドレスの入力方法 (末尾に「/」が含まれているかどうか、および「https」が含まれているかどうか) については注意が必要です。

この人はrstudioで同様の問題に遭遇したようだそして、何度も書き直し、リダイレクトすることで「解決」しました (「リソース制限の設定」セクションの直前の最終ソリューションまでスクロールダウンしてください)。これは「ルート」パスでは機能しますが、/shiny の下のアプリケーション サブディレクトリでは機能しません。したがって、example.com/shiny/ は機能し、example.com/shiny は ../shiny/ へのリダイレクトを介して機能しますが、example.com/shiny/app1 は機能せず、/app1 に解決されます。example.com/shiny/app1/ と入力する必要があります。

今のところ、/shiny と /rstudio の両方で同じことを行いました。これが現在の .conf です。私の問題と疑問は、これをクリーンかつ正しく、'/' の省略に対して堅牢にするにはどうすればよいかということに絞られたと思います。

root@wp-vm:/etc/apache2/sites-available# cat *-le*
<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerAdmin webmaster@localhost
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example.com
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    <Directory /var/www/example.com/>
        AllowOverride All
    </Directory>


Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem

SSLProxyEngine On

# extra redirect for shiny subdirectory
Redirect /shiny /shiny/
# extra redirects for the RStudio subdirectory
Redirect /rstudio /rstudio/
Redirect /auth-sign-in /rstudio/auth-sign-in
Redirect /auth-sign-out /rstudio/auth-sign-out
# Catch RStudio redirecting improperly from the auth-sign-in page
<If "%{HTTP_REFERER} =~ /auth-sign-in/">
  RedirectMatch ^/$     /rstudio/
</If>
##

ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
    AddDefaultCharset Off
    Order deny,allow
    Allow from all
</Proxy>
ProxyPass /shiny/ http://127.0.0.1:3838/
ProxyPassReverse /shiny/ http://127.0.0.1:3838/
ProxyPass /rstudio/ http://localhost:8787/
ProxyPassReverse /rstudio/ http://localhost:8787/

##
RequestHeader set X-Forwarded-Proto "https"
##
</VirtualHost>
</IfModule>

関連情報