У меня тут проблемы. У меня есть 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>