Apache, Ubuntu múltiples puertos o subdominios con proxy inverso SSL a diferentes puertos del mismo servidor

Apache, Ubuntu múltiples puertos o subdominios con proxy inverso SSL a diferentes puertos del mismo servidor

Estoy luchando con algo aquí. Tengo una máquina virtual Ubuntu 18.04 en azure + Apache2 instalado. Tengo un dominio (ejemplo.com) que apunta al servidor web de mi VM /var/www/ y recientemente aseguré el servidor configurando SSL. Obtuve un certificado usando letsencrypt y "certbot", eligiendo la opción para redirigir todo el tráfico HTTP a HTTPS. Aquí está el .conf de mi sitio:

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>

Estoy ejecutando algunos otros servicios web en el mismo servidor: un servidor brillante RStudio (puerto 3838) y un IDE de servidor Rstudio de código abierto (8787). Estas son versiones gratuitas donde SSL no es una opción. Aprendí que ahora con mi servidor web usando SSL no podré incrustar contenido de mi servidor shiny en mis páginas web (wordpress) a través de iframes. Entonces, aunque antes podía vincularme a example.com:3838/app, eso ya no funcionará hasta que asegure el puerto.

¿Cómo logro lo siguiente?

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

Oaun mejor, ¿cómo lo configuro con subdominios como este (si no es demasiada complejidad 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 ser claros, el navegador debe comunicarse con HTTPS, pero los servicios en 8787/3838 seguirán siendo HTTP.

Algunas de las cosas que ya probé pero no pude hacer que funcionaran: intenté cargar un montón de módulos y definir vhosts de varias maneras con ProxyPass y ProxyPassReverse, modificando el vhost existente con etiquetas de "Ubicación" /subdominio, Le dije a Apache que escuchara los nuevos puertos en ports.conf y abrí los firewalls (azure y ufw). Claramente me falta algo pero no sé qué. Aquí está mi firewall actual, déjeme saber qué más puedo proporcionar que pueda ayudar con una respuesta.

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/actualizar: Me doy cuenta de que omití el contenido de un archivo importante y que probablemente también estuve trasteando en el archivo equivocado (ejemplo.com.conf) todo este tiempo.

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

Así que ahora dejaré el archivo example.com.conf solo porque creo que simplemente reescribe todas las solicitudes como https y redirige a 443. Ahora intenté agregar esto al archivo ssl conf pero no tuve suerte. Parece que volveré a intentar todo en este archivo.

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

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

Edición #2 ¡Tan cerca que puedo saborearlo! Básicamente lo tengo trabajando con subdirectorios (example.com/shiny y /rstudio). Sin embargo, es complicado cómo se escribe la dirección: si incluye un "/" final y lo mismo con "https".

Este tipo pareció tener problemas similares con rstudio.y lo 'resolvió' con un montón de reescrituras y redirecciones (desplácese hacia abajo hasta su solución final justo antes de la sección "Configurar límites de recursos"). Eso funciona para las rutas "raíz", pero no para los subdirectorios de mi aplicación en/shiny. Entonces, example.com/shiny/ funciona y example.com/shiny funciona a través de la redirección a ../shiny/, pero example.com/shiny/app1 NO funciona y se resuelve en /app1. Necesito ingresar a example.com/shiny/app1/.

Hice lo mismo con el mío por ahora, tanto para /shiny como para /rstudio. Aquí está mi .conf actual. Creo que mi problema y mi pregunta ahora se han reducido a cómo hacerlo limpio, correcto y resistente a la omisión '/'.

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>

información relacionada