如何在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 页面。