Apache, Ubuntu несколько портов или поддоменов с обратным прокси-сервером SSL на разные порты одного сервера

Apache, Ubuntu несколько портов или поддоменов с обратным прокси-сервером SSL на разные порты одного сервера

У меня тут проблемы. У меня есть Ubuntu 18.04 VM в Azure + установлен Apache2. У меня есть домен (example.com), указывающий на веб-сервер моей VM /var/www/, и недавно я защитил сервер, настроив 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 server (порт 3838) и Rstudio Server IDE с открытым исходным кодом (8787). Это бесплатные версии, где SSL не является вариантом. Я узнал, что теперь, когда мой веб-сервер использует SSL, я не смогу встраивать контент с моего shiny server в мои веб-страницы (wordpress) через iframes. Так что если раньше я мог ссылаться на 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.

Некоторые из вещей, которые я уже пробовал, но не смог заставить работать: я пробовал загружать кучу модулей и определять vhosts разными способами с ProxyPass и ProxyPassReverse, изменять существующий vhost с помощью тегов "Location" /subdomain, я сказал apache слушать новые порты в ports.conf и открыл брандмауэры (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>

Связанный контент