Apache, Ubuntu múltiplas portas ou subdomínios com proxy reverso SSL para portas diferentes no mesmo servidor

Apache, Ubuntu múltiplas portas ou subdomínios com proxy reverso SSL para portas diferentes no mesmo servidor

Estou lutando com algo aqui. Eu tenho uma VM Ubuntu 18.04 em Azure + Apache2 instalada. Eu tenho um domínio (example.com) apontando para o servidor web da minha VM /var/www/ e recentemente protegi o servidor configurando SSL. Obtive um certificado usando letsencrypt e "certbot", escolhendo a opção de redirecionar todo o tráfego HTTP para HTTPS. Aqui está o .conf do meu site:

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>

Estou executando alguns outros serviços da Web no mesmo servidor: um servidor RStudio brilhante (porta 3838) e um código aberto Rstudio Server IDE (8787). Estas são versões gratuitas onde SSL não é uma opção. Aprendi que agora com meu servidor web usando SSL não poderei incorporar conteúdo do meu servidor brilhante em minhas páginas web (wordpress) via iframes. Portanto, embora eu pudesse vincular anteriormente a example.com:3838/app, isso não funcionará mais até que eu proteja a porta.

Como faço para conseguir o seguinte?

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

Oumelhor ainda, como faço para configurá-lo com subdomínios como este (se não houver muita complexidade adicional):

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

Para ficar claro, o navegador precisa se comunicar com HTTPS, mas os serviços em 8787/3838 permanecerão HTTP.

Algumas das coisas que já tentei, mas não consegui fazer funcionar: tentei carregar vários módulos e definir vhosts de várias maneiras com ProxyPass e ProxyPassReverse, modificando o vhost existente com tags "Location"/subdomain, eu ' Eu disse ao Apache para ouvir as novas portas no ports.conf e abri os firewalls (azure e ufw). Estou claramente faltando alguma coisa, mas não sei o quê. Aqui está meu firewall atual. Deixe-me saber o que mais posso fornecer que possa ajudar com uma resposta.

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)

Apache

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

EDITAR/atualizar: Percebo que deixei de fora o conteúdo de um arquivo importante e que provavelmente também estava mexendo no arquivo errado (example.com.conf) o tempo todo.

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

Portanto, estou deixando o arquivo example.com.conf sozinho agora, pois acho que ele simplesmente reescreve todas as solicitações como https e redireciona para 443. Agora tentei adicionar isso ao arquivo conf SSL, mas sem sorte. Parece que tentarei tudo novamente neste arquivo.

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

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

Editar #2 Tão perto que posso sentir o gosto! Basicamente, estou trabalhando com subdiretórios (example.com/shiny e /rstudio). No entanto, é complicado saber como o endereço é digitado - se inclui um final "/" e o mesmo com "https".

Esse cara parecia ter problemas semelhantes com o rstudioe 'resolveu' o problema com várias reescritas e redirecionamentos (role para baixo até a solução final antes da seção "Configurar limites de recursos"). Isso funciona para os caminhos "raiz", mas não para os subdiretórios do meu aplicativo em/shiny. Portanto, example.com/shiny/ funciona e example.com/shiny funciona por meio do redirecionamento para ../shiny/, mas example.com/shiny/app1 NÃO funciona e resolve para /app1. Preciso inserir example.com/shiny/app1/.

Fiz o mesmo com o meu por enquanto, tanto para /shiny quanto para /rstudio. Aqui está meu .conf atual. Acho que meu problema e pergunta agora foram reduzidos a como torná-lo limpo, correto e robusto para a omissão '/'?

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>

informação relacionada