ここで困っています。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>