Установка Shiny Server в Ubuntu 16.04

Shiny – это пакет R, который конвертирует R-код в интерактивные веб-страницы. В комбинации с сервером Shiny Server (который доступен как в бесплатном, так и в платном, профессиональном формате) этот пакет также позволяет размещать и управлять приложениями Shiny и интерактивными документами R.

Читайте также: Установка пакетов R с помощью devtools в Ubuntu 16.04

Данный мануал поможет установить и настроить Shiny и открытую версию Shiny Server на сервер Ubuntu 16.04, защитить соединения сервера Shiny с помощью SSL-сертификата Let’s Encrypt, а также установить дополнительный пакет для запуска интерактивных документов R.

Требования

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.
Tags: , ,

Добавить комментарий