Shiny – это пакет R, который конвертирует R-код в интерактивные веб-страницы. В комбинации с сервером Shiny Server (который доступен как в бесплатном, так и в платном, профессиональном формате) этот пакет также позволяет размещать и управлять приложениями Shiny и интерактивными документами R.
Читайте также: Установка пакетов R с помощью devtools в Ubuntu 16.04
Данный мануал поможет установить и настроить Shiny и открытую версию Shiny Server на сервер Ubuntu 16.04, защитить соединения сервера Shiny с помощью SSL-сертификата Let’s Encrypt, а также установить дополнительный пакет для запуска интерактивных документов R.
Требования
- Сервер Ubuntu 16.04, настроенный по этому мануалу.
- 1 Гб RAM. Важно: недостаточный объем памяти может привести к сбою установки Shiny Server или связанных с ней пакетов R.
- Последняя версия R (смотрите раздел 1 этого мануала).
- Веб-сервер Nginx (его вам поможет установить руководство Установка Nginx в Ubuntu 16.04). Не забудьте открыть порты 80 и 443 с помощью команды sudo ufw allow ‘Nginx Full’.
- Доменное имя (в мануале используется условный домен example.com).
- DNS-записи А для example.com и www.example.com, указывающие на внешний IP-адрес сервера. Больше информации можно найти в статье Как настроить имя хоста.
- SSL-сертификат от Let’s Encrypt (инструкции вы найдете в мануале Автоматическое извлечение SSL-сертификатов Let’s Encrypt с помощью Certbot).
1: Установка Shiny
Прежде чем начать установку Shiny Server, необходимо установить R-пакет Shiny, он предоставляет инфраструктуру, на которой работают веб-приложения Shiny.
Если вы знакомы с R, у вас может возникнуть соблазн установить пакеты непосредственно из R, а не через командную строку. Но следующая команда – это самый безопасный способ глобальной установки пакета (такой пакет будет доступен для всех пользователей, а не только для пользователя, который в настоящее время запускает R).
«su –» выполняет следующую команду как в среде пользователя, а параметр -c указывает команду, которую нужно запустить. Эта команда в указывается в двойных кавычках.
Команда install.packages используется для установки R-пакетов. Следующая команда установит пакет shiny из указанного вами репозитория:
sudo su - -c "R -e \"install.packages('shiny', repos='http://cran.rstudio.com/')\""
В конце R сообщит, что установка завершена (DONE) и где находятся загруженные пакеты:
...
* DONE (shiny)
The downloaded source packages are in
‘/tmp/Rtmp2GcWv4/downloaded_packages’
Теперь можно установить Shiny Server и просмотреть его приветственную страницу по умолчанию в браузере.
2: Установка Shiny Server
Установите Shiny Server и настройте брандмауэр, чтобы по порту, который слушает Shiny Server, мог поступать трафик.
Официальные инструкции по установке Shiny Server рекомендуют использовать wget для загрузки предварительно собранного бинарного файла для 64-битной архитектуры. Поскольку Shiny Server находится в активной разработке, нужно проверить URL-адрес последнего 64-битного бинарного файла для вашей операционной системы на официальной странице загрузки Shiny Server. Укажите этот URL-адрес в следующей команде.
wget https://download3.rstudio.org/ubuntu-12.04/x86_64/shiny-server-1.5.5.872-amd64.deb
Когда файл будет загружен, проверьте его целостность, сравнив вывод следующей команды с контрольной суммой MD5 для 64-битных пакетов, указанной на странице RStudio Shiny Server.
md5sum shiny-server-1.5.5.872-amd64.deb
Если контрольные суммы не совпадают, перезагрузите файл и снова проверьте его целостность, прежде чем двигаться дальше.
Shiny Server зависит от GDebi – инструмента, который устанавливает локальные пакеты deb, разрешая и устанавливая дополнительные зависимости. Теперь необходимо обновить список пакетов и затем установить пакет gdebi-core.
sudo apt-get update
sudo apt-get install gdebi-core
Теперь можно установить Shiny Server:
sudo gdebi shiny-server-1.5.5.872-amd64.deb
Введите y, когда GDebi предложит подтвердить установку:
Shiny Server
Shiny Server is a server program from RStudio, Inc. that makes Shiny applications available over the web. Shiny is a web application framework for the R statistical computation language.
Do you want to install the software package? [y/N]:y
На этом этапе вывод сообщит, что ShinyServer установлен и включен как сервис Systemd. Если вывод сообщает о каком-либо сбое или ошибке, повторите предыдущие действия, чтоб все исправить.
shiny-server.service - ShinyServer
Loaded: loaded (/etc/systemd/system/shiny-server.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2017-10-13 14:24:28 UTC; 2 days ago
...
Убедитесь, что Shiny Server прослушивает порт 3838.
sudo netstat -plunt | grep -i shiny
Вывод должен содержать такую строку:
tcp 0 0 0.0.0.0:3838 0.0.0.0:* LISTEN 18749/shiny-server
Если ваш вывод выглядит не так, еще раз проверьте в терминале наличие предупреждений и сообщений об ошибках.
Теперь измените правила брандмауэра, чтобы разблокировать трафик Shiny Server.
sudo ufw allow 3838
Направьте браузер на http://www.example.com:3838, чтобы просмотреть стандартную приветственную страницу Shiny Server.
Примечание: В правой части экрана вы можете увидеть небольшое поле с сообщением «An error has occurred». После установки rmarkdown (в разделе 4) это сообщение об ошибке будет заменено интерактивным Shiny Doc.
Теперь пакеты Shiny и Shiny Server установлены. Чтобы защитить установку, нужно настроить Nginx как обратный прокси-сервер и маршрутизировать весь трафик через HTTPS.
3: Защита Shiny Server с помощью обратного прокси-сервера и SSL-сертификата
На этом этапе нужно настроить Nginx для пересылки входящих запросов на Shiny Server с помощью WebSocket, протокола обмена сообщениями между веб-серверами и клиентами.
Чтобы создать переменные конфигурации, которые сможет использовать любой виртуальный хост Nginx, откройте основной конфигурационный файл Nginx, nginx.conf, в редакторе.
sudo nano /etc/nginx/nginx.conf
Читайте также: Использование модуля map в Nginx в Ubuntu 16.04
Используя Nginx модуль map, создайте переменные для необходимых WebSocket значений, скопировав следующую директиву в блок http:
http {
...
# Map proxy settings for RStudio
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
}
Директива map сравнивает значение $http_upgrade (заголовок Upgrade клиента) с условием в фигурных скобках. При значении ” директива map создает переменную $connection_upgrade и присваивает ей значение close. В противном случае она создает переменную $connection_upgrade и присваивает ей значение upgrade.
Сохраните и закройте файл.
Затем создайте новый виртуальный хост Nginx (конфигурационный файл по умолчанию можно будет использовать в случае ошибки).
sudo nano /etc/nginx/sites-available/example.com
Создайте новый набор директив для Shiny Server. Скопируйте и вставьте следующие строки:
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers AES256+EECDH:AES256+EDH:!aNULL;
location / {
proxy_pass http://your_server_ip:3838;
proxy_redirect http://your_server_ip:3838/ https://$host/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_read_timeout 20d;
}
}
Теперь все входящие на сервер запросы по портам 80 и 3838 перенаправляются на HTTPS по порту 443.
Рассмотрим наиболее важные параметры этой конфигурации:
- return: создает постоянную переадресацию запросов HTTP на HTTPS.
- proxy_pass: позволяет Nginx пересылать запросы, входящие в корневой каталог веб-сервера, на IP-адрес сервера, прослушивающего порт 3838.
- proxy_redirect: переписывает входящую строку (http://your_server_ip:3838/) ее HTTPS-эквивалентом. Переменная $host определяет имя хоста сервера Nginx.
- proxy_set_header: переопределяет или добавляет поля в заголовок запроса, переданный на прокси-сервер.
- proxy_read_timeout: устанавливает ограничение времени для чтения ответа от проксируемого сервера между двумя последовательными операциями чтения.
Сохраните и закройте файл.
Включите новый виртуальный хост, создав символьную ссылку на файл в каталоге /etc/nginx/sites-enabled.
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com
Поскольку новый виртуальный хост обрабатывает все запросы по порту 80, можно отключить виртуальный хост по умолчанию, удалив символическую ссылку на него в каталоге sites-enabled .
sudo rm -f /etc/nginx/sites-enabled/default
Протестируйте новый файл виртуального хоста:
sudo nginx -t
Если в синтаксисе нет ошибок, можно продолжить работу. Если команда вернула ошибки, исправьте их и повторите проверку.
Теперь нужно перезапустить Nginx.
sudo systemctl restart nginx
После перезапуска Nginx убедитесь, что Shiny Server обслуживает запросы через HTTPS. Для этого откройте в браузере https://example.com. Вы должны увидеть ту же стандартную страницу Shiny Server, что и в конце раздела 2.
Затем убедитесь, что входящие HTTP-запросы перенаправляются на HTTPS. Для этого нужно ввести http://example.com в адресную строку браузера. Если все работает правильно, сервер автоматически перенаправит запрос на https://example.com.
Теперь Shiny Server защищен прокси-сервером и SSL-сертификатом.
4: Добавление интерактивных документов R
Shiny Server может обслуживать не только приложения Shiny, но и интерактивные документы R Markdown.
На данный момент у вас есть рабочий Shiny Server, который поддерживает приложения Shiny, но он еще не может обслуживать интерактивные документы, потому что R-пакет rmarkdown не установлен.
Установите этот пакет:
sudo su - -c "R -e \"install.packages('rmarkdown', repos='http://cran.rstudio.com/')\""
Затем проверьте установку, перейдя на страницу https://example.com/sample-apps/rmd/. Вы должны увидеть в браузере интерактивный документ R Markdown. Кроме того, если вы вернетесь на https://example.com, сообщение об ошибке, которое вы видели ранее, будет заменено динамическим контентом.
Если вы получили сообщение об ошибке, следуйте инструкциям на экране и просмотрите вывод терминала для получения дополнительной информации.
Заключение
Shiny Server полностью готов к работе, защищен и может обслуживать приложения Shiny и документы R Markdown.
В этой установке можно сделать следующее:
- Узнайте, как выполнять пользовательскую настройку сервера Shiny Server, с помощью этого руководства.
- Узнайте больше о написании приложений с помощью обучающих программ на rstudio.com.
- Больше о написании документов R Markdown можно узнать здесь на rstudio.com.