Comment configurer Shiny Server sur Ubuntu 16.04

introduction

Alors que beaucoup de gens se tournent principalement vers le langage de programmation R] https://www.r-project.org/about.html pour les applications statistiques et graphiques, Shiny est un paquet R qui vous permet de convertir votre code R en code interactif les pages Web. Et lorsqu’il est combiné avec Shiny Server - disponible dans un format gratuit, à code source ouvert et dans un format professionnel, vous pouvez également héberger et gérer Shiny applications et interactive R markdown documents.

Dans ce tutoriel, vous allez installer et configurer Shiny et la version open source de Shiny Server sur un serveur exécutant Ubuntu 16.04, sécuriser la connexion au serveur Shiny à l’aide d’un certificat SSL de Let’s Encrypt, puis installer un package supplémentaire pour une exécution interactive. R Markdown documents.

Conditions préalables

Pour compléter ce didacticiel, vous aurez besoin des éléments suivants:

Une fois que toutes les conditions préalables sont en place, nous allons commencer par installer Shiny sur le serveur.

Étape 1 - Installation de Shiny

Avant d’installer Shiny Server, vous devez installer le package Shiny R, qui fournit la structure sur laquelle les applications Web Shiny s’exécutent.

Si vous connaissez R, vous pouvez être tenté d’installer les packages directement à partir de R et non à partir de la ligne de commande. Cependant, l’utilisation de la commande suivante est le moyen le plus sûr de s’assurer que le package est installé pour tous les utilisateurs et pas seulement pour l’utilisateur en cours d’exécution.

+ Su - + exécute la commande suivante comme dans l’environnement de l’utilisateur et l’option + -c + spécifie la commande à exécuter. Cette commande, dans ce cas, est ce qui suit entre guillemets doubles.

+ Install.packages + est la commande R utilisée pour installer les packages R. Ainsi, dans cette commande en particulier, le package + shiny + est installé à partir du référentiel spécifié.

sudo su - -c "R -e \"install.packages('shiny', repos='http://cran.rstudio.com/')\""

Une fois terminé, R vous dira que l’installation est + DONE + et où sont placés les paquets sources téléchargés:

Output...
* DONE (shiny)

The downloaded source packages are in
   ‘/tmp//downloaded_packages’

Avec Shiny en place, vous êtes maintenant prêt à installer Shiny Server et à afficher son écran d’accueil par défaut dans votre navigateur.

Étape 2 - Installation du serveur Shiny

Au cours de cette étape, vous installerez Shiny Server et modifierez le pare-feu pour autoriser le trafic via le port écouté par Shiny Server.

Selon les instructions d’installation officielles du serveur Shiny, nous utiliserons + wget + pour télécharger un fichier binaire pré-construit pour une architecture 64 bits. Étant donné que Shiny Server est en cours de développement, vous devez consulter la page de téléchargement officielle Shiny Server pour obtenir l’URL du dernier fichier binaire pré-construit 64 bits. correspondant à votre système d’exploitation. Une fois que vous avez l’adresse, modifiez l’URL dans la commande suivante en conséquence.

wget https://download3.rstudio.org/ubuntu-12.04/x86_64/shiny-server--amd64.deb

Une fois le fichier téléchargé, vérifiez son intégrité en comparant le résultat de la commande suivante avec la somme de contrôle MD5 indiquée sur la page de téléchargement RStudio Shiny Server à la page haut des instructions de téléchargement binaire pré-construites 64 bits.

md5sum shiny-server--amd64.deb

Si les sommes de contrôle ne correspondent pas, téléchargez à nouveau le fichier et réessayez de vérifier son intégrité avant de poursuivre.

Parce que Shiny Server dépend de GDebi - un outil qui installe des packages deb locaux tout en résolvant et installant des dépendances supplémentaires - pour son installation, vous devrez mettre à jour votre liste de packages, puis installer ensuite le package + gdebi-core +.

sudo apt-get update
sudo apt-get install gdebi-core

Vous êtes maintenant prêt à installer Shiny Server.

sudo gdebi shiny-server--amd64.deb

Tapez + y + lorsque GDebi vous demande de confirmer que vous souhaitez installer le paquet.

[Secondary_label Output]
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]:

À ce stade, la sortie devrait indiquer qu’un service nommé + ShinyServer + est à la fois installé et qu’un service + active + Systemd. Si le résultat indique qu’il ya un problème, retracez vos étapes précédentes avant de continuer.

[Secondary_label Output]
...
● shiny-server.service - ShinyServer
  Loaded: loaded (/etc/systemd/system/shiny-server.service; enabled; vendor preset: enabled)
  Active:  since Fri 2017-10-13 14:24:28 UTC; 2 days ago
...

Ensuite, vérifiez que Shiny Server écoute effectivement sur le port + 3838 +.

sudo netstat -plunt | grep -i shiny

En cas de succès, la sortie comprendra la ligne suivante:

Outputtcp        0      0 0.0.0.0:3838            0.0.0.0:*               LISTEN      18749/shiny-server

Si votre sortie ne ressemble pas à celle-ci, revérifiez votre terminal pour d’autres avertissements et messages d’erreur.

Maintenant, modifiez le pare-feu pour autoriser le trafic sur Shiny Server.

sudo ufw allow 3838

Enfin, pointez votre navigateur sur + http: //: 3838 + pour afficher la page d’accueil par défaut de Shiny Server, vous souhaitant la bienvenue sur Shiny Server et vous félicite pour votre installation.

Les serveurs Shiny et Shiny sont maintenant tous deux installés et testés. Par conséquent, sécurisons la configuration en configurant Nginx pour qu’il serve de proxy inverse et achemine tout le trafic sur HTTPS.

Étape 3 - Sécurisation du serveur Shiny avec un proxy inverse et un certificat SSL

Au cours de cette étape, vous allez configurer Nginx pour qu’il transfère les demandes entrantes à Shiny Server via WebSocket, un protocole de messagerie entre serveurs Web et clients.

Comme nous voulons créer des variables de configuration utilisables par tous les blocs de serveur Nginx, ouvrez le fichier de configuration principal de Nginx, + nginx.conf +, pour le modifier.

sudo nano /etc/nginx/nginx.conf

En utilisant le module map de Nginx, créez des variables pour les valeurs dont WebSocket a besoin en copiant la directive suivante dans le bloc + http +:

/etc/nginx/nginx.conf

http {
   ...
   # Map proxy settings for RStudio
   map $http_upgrade $connection_upgrade {
       default upgrade;
       '' close;
   }
}

La directive + map + compare + $ http_upgrade + - la valeur de l’en-tête * Upgrade * du client - aux conditions entre accolades. Si la valeur est + '' +, + map + crée la variable + $ connection_upgrade et la définit sur` + close`. Sinon, + map + crée la variable + $ connection_upgrade et la définit sur la valeur par défaut,` + upgrade`.

Enregistrez votre travail et fermez le fichier pour continuer.

Ensuite, créez un bloc de serveur Nginx complètement nouveau, de sorte que vous disposiez toujours du fichier de configuration par défaut vers lequel revenir si vous rencontriez un problème ultérieurement.

sudo nano /etc/nginx/sites-available/

Créez un nouvel ensemble de directives pour Shiny Server en copiant / collant les éléments suivants dans le nouveau fichier:

example.com '> / etc / nginx / sites-available /

server {
  listen 80 default_server;
  listen [::]:80 default_server ipv6only=on;
  server_name ;
  return 301 https://$server_name$request_uri;
}
server {
  listen 443 ssl;
  server_name ;
  ssl_certificate /etc/letsencrypt/live//fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live//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://:3838;
      proxy_redirect http://:3838/ https://$host/;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection $connection_upgrade;
      proxy_read_timeout 20d;
  }
}

L’effet net de cette configuration est que toutes les demandes entrantes adressées au serveur sur les ports + 80 + et + 3838 + sont redirigées pour utiliser HTTPS sur le port + 443 +.

Voici un aperçu des aspects les plus complexes de cette configuration:

  • * return *: Crée une redirection permanente pour les demandes entrant en tant que HTTP pur vers HTTPS.

  • * proxy_pass *: Indique à Nginx de transférer les demandes arrivant à la racine de l’application du serveur Web vers l’adresse IP du serveur à l’écoute sur le port + 3838 +.

  • * proxy_redirect *: réécrit la chaîne entrante, + http: //: 3838 / +, sur son équivalent HTTPS sur le serveur qui traite la demande. La variable + $ host + correspond au nom d’hôte du serveur sur lequel Nginx est en cours d’exécution.

  • * proxy_set_header *: redéfinit ou ajoute des champs à l’en-tête de requête transmis au serveur mandaté.

  • * proxy_read_timeout *: définit un délai d’attente pour la lecture d’une réponse du serveur mandaté entre deux opérations de lecture successives.

Enregistrez et fermez le fichier pour continuer.

Activez ensuite le nouveau bloc serveur en créant un lien symbolique dans le répertoire + / etc / nginx / sites-enabled +.

sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/

De plus, comme notre nouveau bloc de serveur gère désormais toutes les demandes sur le port + 80 +, vous pouvez désactiver le bloc par défaut en supprimant le lien symbolique qui s’y trouve dans le répertoire + sites-enabled +.

sudo rm -f /etc/nginx/sites-enabled/default

Maintenant, testez votre nouvelle configuration avant d’activer les modifications.

sudo nginx -t

Si vous rencontrez des problèmes, suivez les instructions fournies pour les résoudre.

Une fois que votre syntaxe est correcte et que votre test est réussi, vous êtes prêt à activer toutes les modifications en rechargeant Nginx.

sudo systemctl restart nginx

Une fois Nginx redémarré, vérifiez que votre serveur Shiny répond aux demandes via HTTPS en pointant votre navigateur sur + https: // +. Vous devriez voir la même page d’accueil par défaut Shiny Server que celle que vous avez vue à la fin de l’étape 2.

Ensuite, vérifiez que les demandes HTTP entrantes sont redirigées vers HTTPS en tapant + http: // + dans la barre d’adresse de votre navigateur. Si cela fonctionne correctement, vous devriez être automatiquement redirigé vers + https: // +.

Shiny Server est maintenant sécurisé avec un proxy inverse et un certificat SSL. Vous êtes donc prêt à configurer votre configuration pour les documents interactifs R Markdown.

Étape 4 - Hébergement de documents R interactifs

Shiny Server est utile non seulement pour l’hébergement d’applications Shiny, mais également pour l’hébergement de documents interactifs R Markdown.

À ce stade, vous disposez d’un serveur Shiny qui peut héberger des applications Shiny, mais il ne peut pas encore héberger de documents interactifs R Markdown car le package + rmarkdown + R n’est pas installé.

Donc, en utilisant une commande qui fonctionne comme le lien: # step-1-% E2% 80% 94-installation-brillante [une de l’étape 1] pour installer le paquet Shiny, installez + rmarkdown +.

sudo su - -c "R -e \"install.packages('rmarkdown', repos='http://cran.rstudio.com/')\""

Puis, vérifiez l’installation en allant sur + https: /// sample-apps / rmd / +. Vous devriez voir un document interactif R Markdown dans votre navigateur. De plus, si vous revenez à + ​​https: // +, le message d’erreur que vous avez reçu précédemment devrait maintenant être remplacé par du contenu dynamique.

Si vous recevez un message d’erreur, suivez les instructions à l’écran et examinez la sortie de votre terminal pour plus d’informations.

La configuration de votre serveur Shiny est complète, sécurisée et prête à servir les applications Shiny ainsi que les documents Interactive R Markdown.

Conclusion

Dans ce didacticiel, vous avez configuré et sécurisé un serveur Shiny entièrement opérationnel pouvant héberger des applications Shiny et des documents interactifs R Markdown.

Pour construire sur votre configuration actuelle, vous pouvez: