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>