Apache, Ubuntu mehrere Ports oder Subdomains mit SSL Reverse Proxy zu verschiedenen Ports desselben Servers

Apache, Ubuntu mehrere Ports oder Subdomains mit SSL Reverse Proxy zu verschiedenen Ports desselben Servers

Ich habe hier mit etwas zu kämpfen. Ich habe eine Ubuntu 18.04 VM in Azure + Apache2 installiert. Ich habe eine Domäne (example.com), die auf den Webserver /var/www/ meiner VM verweist, und habe den Server kürzlich durch die Einrichtung von SSL gesichert. Ich habe ein Zertifikat mit letsencrypt und „certbot“ erhalten und die Option gewählt, den gesamten HTTP-Verkehr auf HTTPS umzuleiten. Hier ist die .conf meiner 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>

Ich betreibe einige andere Webdienste auf demselben Server: einen RStudio Shiny-Server (Port 3838) und Rstudio Server IDE Open Source (8787). Dies sind kostenlose Versionen, bei denen SSL keine Option ist. Ich habe erfahren, dass ich jetzt, da mein Webserver SSL verwendet, keine Inhalte von meinem Shiny-Server über Iframes in meine Webseiten (WordPress) einbetten kann. Während ich also früher auf example.com:3838/app verlinken konnte, funktioniert das nicht mehr, bis ich den Port sichere.

Wie erreiche ich Folgendes?

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

Odernoch besser, wie richte ich es mit Subdomains wie diesen ein (wenn es nicht zu viel zusätzliche Komplexität bedeutet):

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

Um es klar zu sagen: Der Browser muss mit HTTPS kommunizieren, aber die Dienste bei 8787/3838 bleiben HTTP.

Einige der Dinge, die ich bereits versucht habe, aber nicht zum Laufen gebracht habe: Ich habe versucht, eine Reihe von Modulen zu laden und virtuelle Hosts auf verschiedene Weise mit ProxyPass und ProxyPassReverse zu definieren, den vorhandenen virtuellen Host mit „Location“-/Subdomain-Tags zu ändern, ich habe Apache angewiesen, auf die neuen Ports in ports.conf zu lauschen, und die Firewalls (Azure und UFW) geöffnet. Mir fehlt eindeutig etwas, aber ich weiß nicht, was. Hier ist meine aktuelle Firewall. Lassen Sie mich wissen, was ich sonst noch bereitstellen kann, das bei einer Antwort helfen könnte.

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

BEARBEITEN/AKTUALISIEREN: Mir ist klar, dass ich den Inhalt einer wichtigen Datei ausgelassen habe und dass ich wahrscheinlich auch die ganze Zeit in der falschen Datei (example.com.conf) herumgespielt habe.

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

Daher lasse ich die Datei example.com.conf jetzt so, da ich glaube, dass sie einfach alle Anfragen als https umschreibt und auf 443 umleitet. Ich habe jetzt versucht, dies zur SSL-Conf-Datei hinzuzufügen, aber ohne Erfolg. Sieht so aus, als würde ich alles in dieser Datei noch einmal versuchen.

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

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

Bearbeitung #2 So nah, dass ich es schmecken kann! Ich habe es im Wesentlichen mit Unterverzeichnissen zum Laufen gebracht (example.com/shiny und /rstudio). Es ist jedoch pingelig, wie die Adresse eingegeben wird – ob sie ein abschließendes „/“ enthält und dasselbe gilt für „https“.

Dieser Typ schien auf ähnliche Probleme mit rstudio zu stoßenund habe es mit einer Menge Umschreiben und Umleiten „gelöst“ (scrollen Sie nach unten zu seiner endgültigen Lösung direkt vor dem Abschnitt „Ressourcenlimits einrichten“). Das funktioniert für die „Root“-Pfade, aber nicht für meine Anwendungsunterverzeichnisse unter /shiny. Also funktioniert example.com/shiny/ und example.com/shiny funktioniert über die Umleitung zu ../shiny/, aber example.com/shiny/app1 funktioniert NICHT und wird zu /app1 aufgelöst. Ich muss example.com/shiny/app1/ eingeben.

Ich habe vorerst dasselbe mit meinem gemacht, sowohl für /shiny als auch für /rstudio. Hier ist meine aktuelle .conf. Ich denke, mein Problem und meine Frage haben sich jetzt darauf reduziert, wie ich es sauber, korrekt und robust gegenüber dem Weglassen von '/' machen kann?

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>

verwandte Informationen