如何在Ubuntu16.04上设置闪亮的服务器

来自菜鸟教程
跳转至:导航、​搜索

本文的 旧版本Dean Attali 编写。

介绍

虽然许多人主要将 开源编程语言 R 用于统计和图形应用程序,但 Shiny 是一个 R 包,它允许您转换 R 代码进入交互式网页。 当与 Shiny Server 结合使用时(提供免费、开源和付费的专业格式),您还可以托管和管理 Shiny 应用程序和 交互式 R 降价文档

在本教程中,您将在运行 Ubuntu 16.04 的服务器上安装和配置 Shiny 和开源版本的 Shiny Server,使用 Let's Encrypt SSL 证书保护与 Shiny 服务器的连接,然后安装额外的包以运行交互式R Markdown 文档。

先决条件

要完成本教程,您需要以下内容:

警告: 服务器上任何小于 1GB 的 RAM 都可能导致 Shiny Server 或其相关 R 包的安装失败。


  • 按照this install R on Ubuntu 16.04 tutorial中的步骤1安装最新版本的R。
  • 按照 this How To Install Nginx on Ubuntu 16.04 tutorial 安装 Nginx,包括在步骤 2 中使用命令 sudo ufw allow 'Nginx Full' 允许访问端口 80443 .
  • 完全注册的域名。 本教程将自始至终使用 example.com。 您可以在 Namecheap 上购买一个域名,在 Freenom 上免费获得一个域名,或者使用您选择的域名注册商。
  • 为您的服务器设置了以下两个 DNS 记录。 您可以关注 this hostname tutorial 了解如何添加它们的详细信息。
    • 带有 example.com 的 A 记录指向您服务器的公共 IP 地址。
    • 带有 www.example.com 的 A 记录指向您服务器的公共 IP 地址。
  • 按照 这个 Let's Encrypt Certbot 教程 安装的域的 Let's Encrypt SSL 证书。

准备好所有先决条件后,我们将首先在服务器上安装 Shiny。

第 1 步 — 安装 Shiny

在安装 Shiny Server 之前,您需要安装 Shiny R 包,它提供了 Shiny Web 应用程序运行的框架。

如果您熟悉 R,您可能会想直接从 R 而不是从命令行安装包。 但是,使用以下命令是确保为所有用户安装包的最安全方法,而不仅仅是为当前运行 R 的用户。

su - 就像在用户自己的环境中一样运行以下命令,-c 选项指定将要运行的命令。 在这种情况下,该命令是用双引号括起来的。

install.packages 是用于安装 R 包的 R 命令。 因此,在这个命令中,shiny 包是从指定的存储库安装的。

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

完成后,R 会告诉你安装是 DONE 以及它把下载的源包放在哪里:

Output...
* DONE (shiny)

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

有了 Shiny,您现在就可以安装 Shiny Server 并在您的浏览器中显示其默认的欢迎屏幕。

第 2 步 — 安装闪亮的服务器

在这一步中,您将安装 Shiny 服务器并调整防火墙以允许流量通过 Shiny Server 侦听的端口。

根据 Shiny Server 的官方安装说明,我们将使用 wget 下载 64 位架构的预构建二进制文件。 由于 Shiny Server 正在积极开发中,您应该咨询官方 Shiny Server 下载页面 以获取与您的操作系统匹配的最新 64 位预构建二进制文件的 URL。 获得地址后,相应地更改以下命令中的 URL。

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

下载文件后,通过将以下命令的输出与 64 位顶部的 RStudio Shiny Server 下载页面 中列出的 MD5 校验和进行比较来验证其完整性,预构建二进制下载指令。

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

当 GDebi 要求您确认是否要安装软件包时,键入 y

[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]:y

此时,输出应表明已安装名为 ShinyServer 的服务和 active Systemd 服务。 如果输出表明存在问题,请在继续之前重新跟踪之前的步骤。

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

如果成功,输出将包括以下行:

Outputtcp        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 主页,欢迎您使用 Shiny Server 并祝贺您安装。

注意: 您可能会在屏幕右侧看到一个小框,其中显示一条消息,指出发生错误。 在步骤 4 中安装 rmarkdown 后,错误消息将替换为交互式 Shiny Doc。


您现在已经安装并测试了 Shiny 和 Shiny Server,因此让我们通过将 Nginx 配置为反向代理并通过 HTTPS 路由所有流量来保护设置。

第 3 步 — 使用反向代理和 SSL 证书保护 Shiny 服务器

在这一步中,您将配置 Nginx 以通过 WebSocket(一种用于在 Web 服务器和客户端之间进行消息传递的协议)将传入请求转发到 Shiny Server。

因为我们要创建任何 Nginx 服务器块都可以使用的配置变量,所以打开主 Nginx 配置文件 nginx.conf 进行编辑。

sudo nano /etc/nginx/nginx.conf

使用 Nginx 的 map 模块,通过将以下指令复制到 http 块中,为 WebSocket 需要的值创建变量:

/etc/nginx/nginx.conf

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

map 指令将 $http_upgrade(客户端的 Upgrade 标头的值)与大括号中的条件进行比较。 如果值为 ,则 map 创建 $connection_upgrade 变量并将其设置为 close。 否则,map 创建 $connection_upgrade 变量并将其设置为默认值 upgrade

保存您的工作并关闭文件以继续。

接下来,创建一个全新的 Nginx 服务器块,以便在以后遇到问题时仍然可以恢复到默认配置文件。

sudo nano /etc/nginx/sites-available/example.com

通过将以下内容复制并粘贴到新文件中,为 Shiny Server 创建一组新指令:

/etc/nginx/sites-available/<^>example.com<^>

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;
   }
}

此配置的最终效果是端口 803838 上对服务器的所有传入请求都被重定向到在端口 443 上使用 HTTPS。

此配置的一些更复杂方面的概述包括:

  • return:为以纯 HTTP 到 HTTPS 的请求创建永久重定向。
  • proxy_pass:告诉 Nginx 将来自 Web 服务器应用程序根目录的请求转发到侦听端口 3838 的服务器的 IP 地址。
  • 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 重新启动后,通过将浏览器指向 https://example.com 来验证您的 Shiny 服务器是否通过 HTTPS 服务请求。 您应该会看到与步骤 2 末尾相同的默认 Shiny Server 主页。

然后,通过在浏览器的地址栏中键入 http://example.com 来验证传入的 HTTP 请求是否重定向到 HTTPS。 如果它工作正常,您应该会自动被重定向到 https://example.com

Shiny Server 现在受到反向代理和 SSL 证书的保护,因此您已准备好为交互式 R Markdown 文档配置设置。

第 4 步 - 托管交互式 R 文档

Shiny Server 不仅可用于托管 Shiny 应用程序,还可用于托管交互式 R Markdown 文档。

此时,您有一个可以托管 Shiny 应用程序的有效 Shiny 服务器,但它还不能托管交互式 R Markdown 文档,因为没有安装 rmarkdown R 包。

因此,使用类似于步骤 1 中的 的命令来安装 Shiny 包,安装 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 应用程序和 Interactive R Markdown 文档提供服务。

结论

在本教程中,您设置并保护了一个功能齐全的 Shiny 服务器,它可以托管 Shiny 应用程序和交互式 R Markdown 文档。

要在当前设置的基础上构建,您可以:

  • 通过 Shiny 服务器管理员指南 了解如何根据您的确切需求管理和自定义服务器。
  • 通过 rstudio.com 上的 教程了解有关编写 Shiny 应用程序的更多信息。
  • 通过查看 rstudio.com 上的 R Markdown 页面,了解有关编写交互式 R Markdown 文档的更多信息。