如何在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 并访问端口
80和443。 按照如何在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 正在侦听的位置:
p是 processes 的缩写,显示使用 socket 的进程。l是 listening 的缩写,显示监听套接字。- 如果适用,
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 页面。