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

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

作为 Write for DOnations 计划的一部分,作者选择了 Free and Open Source Fund 来接受捐赠。

介绍

虽然许多人将开源 编程语言 R 用于统计和图形应用程序,但 Shiny 是一个 R 包,可让您将 R 代码转换为交互式网页。 使用 Shiny,您可以使用 Shiny Server(提供免费的开源格式和付费的专业格式)来托管和管理 Shiny 应用程序和 交互式 R 降价文档

在本教程中,您将在运行 Ubuntu 20.04 的服务器上安装和配置 Shiny 和 Shiny Server 的开源版本。 您还将安装一个额外的包来运行交互式 R Markdown 文档。

先决条件

要完成本教程,您需要:

  • 具有 sudo 非 root 用户和防火墙的 Ubuntu 20.04 服务器,您可以按照 Ubuntu 20.04 初始服务器设置指南 进行设置。
  • 最新版本的 R,您可以使用 如何在 Ubuntu 20.04 上安装 R 的第 1 步进行安装。
  • 安装 Nginx 并访问端口 80443。 按照如何在Ubuntu 20.04上安装Nginx来安装Nginx。 在步骤 2 中,使用命令 sudo ufw allow 'Nginx Full' 同时打开端口 80 和端口 443,而不是使用命令 sudo ufw allow 'Nginx HTTP',它只打开端口 80。
  • 一个注册的域名。 本教程始终使用 example.com。 您可以在 Namecheap 上购买一个域名,在 Freenom 上免费获得一个域名,或者使用您选择的域名注册商。
  • 为您的服务器设置了以下两个 DNS 记录。 请按照 DNS 快速入门 了解如何添加它们的详细信息。
    • 带有 example.com 的 A 记录指向您服务器的公共 IP 地址。
    • 带有 www.example.com 的 A 记录也指向您服务器的公共 IP 地址。
  • A Let's Encrypt 域的 SSL 证书,可以按照 如何使用 Certbot 独立模式检索 Let's Encrypt SSL 证书 进行安装。 在第 2 步中,使用命令 sudo certbot --nginx -d example.com -d www.example.com 而不是文章中给出的 certbot certonly 命令获取 SSL 证书。

第 1 步 — 安装 Shiny

在安装 Shiny Server 之前,您需要安装 Shiny R 包,它提供了运行 Shiny Web 应用程序的框架。 虽然您可以直接从 R 或命令行安装 R 包,但建议使用后一种方法来确保为所有用户安装包,而不仅仅是为当前运行 R 的用户安装包。

要从官方存储库安装 Shiny R 包以便所有用户都可以使用,请使用以下命令:

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

使用 su -,以 root 身份运行命令。 c 标志会将命令传递给 su - 引用的用户。 在这种情况下,引号中的命令将被传递给 sudo

完成后,输出表明安装已完成并确定在哪里可以找到下载的源包:

Output...
* DONE (shiny)

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

使用 Shiny,您可以安装 Shiny Server 并在浏览器中显示其默认欢迎屏幕。

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

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

在撰写本文时,最新的 Ubuntu 版本是 Shiny Server 1.5.18.987。 使用以下命令下载 64 位架构的预构建二进制文件。

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

接下来,使用以下命令验证下载文件的完整性,并使用 RStudio Shiny Server 下载页面 上列出的 Sha256 校验和:

sha256sum shiny-server-1.5.18.987-amd64.deb

如果校验和不匹配,请重新下载文件并验证其完整性。

Shiny Server 的安装依赖于 GDebi。 GDebi 是一个安装本地 deb 包同时解析和安装附加依赖项的工具。

更新您的软件包列表,然后安装 gdebi-core 软件包:

sudo apt update
sudo apt install gdebi-core

接下来,使用以下 gdebi 命令安装 Shiny Server:

sudo gdebi shiny-server-1.5.17.973-amd64.deb

系统将提示您确认安装:

OutputShiny 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

键入 y 以确认您要安装该软件包。

现在,命令输出的末尾将显示名为 shiny-server 的服务处于活动状态并正在运行:

Output● shiny-server.service - ShinyServer
     Loaded: loaded (/etc/systemd/system/shiny-server.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2022-02-06 01:37:23 UTC; 14ms ago
   Main PID: 51306 (shiny-server)
...

使用 ss 命令验证 shiny-server 正在侦听端口 3838

sudo ss -plut | grep -i shiny

-plut 标志调查 shiny-server 正在侦听的位置:

  • pprocesses 的缩写,显示使用 socket 的进程。
  • llistening 的缩写,显示监听套接字。
  • 如果适用,u 将显示 UDP 套接字。
  • 如果适用,t 将显示 TCP 套接字。

输出将显示以下行:

Outputtcp  LISTEN   0   511    *:3838    *:*   users:(("shiny-server",pid=51306,fd=18))

当您确认 shiny-server 正在侦听端口 3838 后,修改防火墙以允许流量通过 Shiny Server:

sudo ufw allow 3838

在 Web 浏览器中访问 http://your_server_ip:3838 以打开默认的 Shiny Server 主页,欢迎您使用 Shiny Server 并祝贺您安装。 您将在屏幕右侧看到一个小框,其中显示一条消息 发生错误 。 当您在步骤 4 中安装 rmarkdown 时,错误消息将替换为交互式 Shiny Doc。

注意: 允许流量通过端口 3838 的防火墙规则是临时的。 在完成步骤 3 中的任务之前,将浏览器指向 https://your_server_ip:3838 将无法加载任何内容。 完成步骤 3 中的任务后,将不再需要通过该端口访问 Shiny Server。 您将在步骤 5 中删除防火墙规则。


您现在已经安装了 Shiny 和 Shiny Server 并在端口 3838 上侦听。

在下一步中,您将使用 Nginx 设置反向代理并为您的域安装 SSL 证书,这将允许您在端口 443 上安全地访问 Shiny Server。

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

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

打开 Nginx 主配置文件,nginx.conf,进行编辑:

sudo nano /etc/nginx/nginx.conf

在此文件中,您可以为要使用的任何 Nginx 服务器块 创建配置变量。

使用 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

完成后,保存并关闭文件。

接下来,打开您域的服务器块:

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

查找并编辑 location 块以仅包含以下指令:

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

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

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-available/example.com 中所做的更改之前,请测试文件是否有错误:

sudo nginx -t 

如果没有错误,请执行以下命令以防止加载默认的 Nginx 欢迎页面:

sudo unlink /etc/nginx/sites-enabled/default

然后通过运行以下命令激活更改:

sudo systemctl restart nginx

您现在已经使用反向代理和 SSL 证书保护了 Shiny Server。 尝试加载 https://example.com(不指定 IP 地址和端口号)以检查您的设置是否有效。

接下来,您将为交互式 R Markdown 文档配置设置。

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

除了托管 Shiny 应用程序之外,Shiny Server 还可用于托管交互式 R Markdown 文档。 您的 Shiny Server 可以托管 Shiny 应用程序,但如果没有 rmarkdown R 包,它不能托管交互式 R Markdown 文档。 您可以按照在步骤 1 中安装 shiny 包的相同方式安装 rmarkdown R 包。

使用以下命令安装 rmarkdown

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

要验证安装,请转到 https://example.com。 步骤 2 中遇到的错误现在应替换为交互式绘图。 或者,您可以访问 https://example.com/sample-apps/rmd/ 查看完整的情节。

第 5 步 — 拒绝公开访问 Shiny 服务器的端口号

在第 2 步中,您创建了一条防火墙规则以允许通过其端口号访问 Shiny 服务器。 现在可以通过 https://example.com 访问它,因此无需提供对该端口的公共访问。 在此步骤中,您将删除该防火墙规则。

首先,使用以下命令查看所有现有规则:

sudo ufw status numbered

输出将类似于以下内容:

OutputStatus: active

     To                         Action      From
     --                         ------      ----
[ 1] OpenSSH                    ALLOW IN    Anywhere 
[ 2] Nginx Full                 ALLOW IN    Anywhere 
[ 3] 3838                       ALLOW IN    Anywhere 
[ 4] OpenSSH (v6)               ALLOW IN    Anywhere (v6) 
[ 5] Nginx Full (v6)            ALLOW IN    Anywhere (v6) 
[ 6] 3838 (v6)                  ALLOW IN    Anywhere (v6) 

与 Shiny Server 的防火墙相关的规则标记为 3838(上面输出中的规则 3 和 6)。 删除第一条规则(在上面的输出中,规则 3):

sudo ufw delete 3

从列表中删除一条规则后,规则编号将发生变化(在这种情况下,规则 6 现在将变为规则 5)。 使用以下命令查看规则编号:

sudo ufw status numbered

输出将与前一个类似:

OutputStatus: active

     To                         Action      From
     --                         ------      ----
[ 1] OpenSSH                    ALLOW IN    Anywhere 
[ 2] Nginx Full                 ALLOW IN    Anywhere 
[ 3] OpenSSH (v6)               ALLOW IN    Anywhere (v6) 
[ 4] Nginx Full (v6)            ALLOW IN    Anywhere (v6) 
[ 5] 3838 (v6)                  ALLOW IN    Anywhere (v6) 

删除另一个 3838 规则(上面输出中的规则 5):

sudo ufw delete 5

要应用更改,请重新加载防火墙:

sudo ufw reload

Shiny Server 仍处于活动状态,但将不再可通过端口号公开访问。

结论

您现在拥有一个功能齐全的 Shiny 服务器,可以托管 Shiny 应用程序和交互式 R Markdown 文档。

当您准备好开始部署时,您可以在 /etc/shiny-server/shiny-server.conf 找到 Shiny Server 的配置文件。 默认情况下,它被设置为服务于 /srv/shiny-server/ 目录中的应用程序,这意味着任何放置在 /srv/shiny-server/app_name 的 Shiny 应用程序都将在 https://example.com/app_name/ 向公众提供。

要了解有关根据您的确切需求自定义 Shiny Server 的更多信息,请访问 Shiny Server 管理员指南 或阅读 rstudio.com 上的 教程。 有关编写交互式 R Markdown 文档的更多信息,请查看 rstudio.com 上的 R Markdown 页面。