Ubuntu20.04でShinyServerをセットアップする方法
著者は、 Write for DOnations プログラムの一環として、 Free and Open SourceFundを選択して寄付を受け取りました。
序章
多くの人が統計およびグラフィックアプリケーションにオープンソースのプログラミング言語Rを利用していますが、 ShinyはRコードをインタラクティブなWebページに変換できるRパッケージです。 Shinyを使用すると、 Shiny Server (無料のオープンソース形式と有料のプロフェッショナル形式の両方で利用可能)を使用して、ShinyアプリケーションとインタラクティブRマークダウンドキュメントをホストおよび管理できます。
このチュートリアルでは、Ubuntu20.04を実行しているサーバーにShinyとオープンソースバージョンのShinyServerをインストールして構成します。 また、インタラクティブなRMarkdownドキュメントを実行するための追加パッケージをインストールします。
前提条件
このチュートリアルを完了するには、次のものが必要です。
- sudo非rootユーザーとファイアウォールを備えたUbuntu20.04サーバー。これは、Ubuntu20.04初期サーバーセットアップガイドに従ってセットアップできます。
- Ubuntu20.04にRをインストールする方法のステップ1でインストールできる最新バージョンのR。
- Nginxは、ポート
80および443にアクセスできるようにインストールされています。 Ubuntu 20.04にNginxをインストールする方法に従って、Nginxをインストールします。 手順2では、コマンドsudo ufw allow 'Nginx Full'を使用して、ポート80のみを開くsudo ufw allow 'Nginx HTTP'の代わりに、ポート80とポート443の両方を開きます。 - 登録されたドメイン名。 このチュートリアルでは、全体で
example.comを使用します。 Namecheap でドメイン名を購入するか、 Freenom で無料でドメイン名を取得するか、選択したドメイン登録事業者を使用できます。 - 次の両方のDNSレコードがサーバー用に設定されています。 追加方法の詳細については、DNSクイックスタートに従ってください。
- サーバーのパブリックIPアドレスを指す
example.comのAレコード。 www.example.comがサーバーのパブリックIPアドレスも指しているAレコード。
- サーバーのパブリックIPアドレスを指す
- ドメインのSSL証明書を暗号化しましょう。これは、Certbotスタンドアロンモードを使用してSSL証明書を取得する方法に従ってインストールできます。 手順2で、その記事に記載されている
certbot certonlyコマンドの代わりに、コマンドsudo certbot --nginx -d example.com -d www.example.comを使用してSSL証明書を取得します。
ステップ1—Shinyをインストールする
Shiny Serverをインストールする前に、ShinyWebアプリケーションを実行するためのフレームワークを提供するShinyRパッケージをインストールする必要があります。 Rまたはコマンドラインから直接Rパッケージをインストールできますが、現在Rを実行しているユーザーだけでなく、すべてのユーザーにパッケージがインストールされるようにするには、後者の方法をお勧めします。
公式リポジトリからShinyRパッケージをインストールして、すべてのユーザーが利用できるようにするには、次のコマンドを使用します。
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—ShinyServerをインストールする
この手順では、Shiny Serverをインストールし、ShinyServerがリッスンするポートを通過するトラフィックを許可するようにファイアウォールを調整します。
執筆時点で入手可能なUbuntuの最新バージョンは、 Shiny Server1.5.18.987です。 次のコマンドを使用して、64ビットアーキテクチャ用のビルド済みバイナリをダウンロードします。
wget https://download3.rstudio.org/ubuntu-18.04/x86_64/shiny-server-1.5.18.987-amd64.deb
次に、次のコマンドを使用して、 RStudioShinyServerダウンロードページにリストされているSha256チェックサムを使用してダウンロードしたファイルの整合性を確認します。
sha256sum shiny-server-1.5.18.987-amd64.deb
チェックサムが一致しない場合は、ファイルを再ダウンロードして、その整合性を確認してください。
シャイニーサーバーのインストールはGDebiに依存しています。 GDebiは、ローカルのdebパッケージをインストールすると同時に、追加の依存関係を解決してインストールするツールです。
パッケージリストを更新してから、gdebi-coreパッケージをインストールします。
sudo apt update sudo apt install gdebi-core
次に、次のgdebiコマンドを使用してShinyServerをインストールします。
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でリッスンしていることを確認したら、ファイアウォールを変更して、ShinyServerへのトラフィックを許可します。
sudo ufw allow 3838
Webブラウザでhttp://your_server_ip:3838にアクセスして、デフォルトのShiny Serverホームページを表示します。これにより、Shiny Serverにアクセスでき、インストールが完了しました。 画面の右側に、エラーが発生しましたというメッセージが表示された小さなボックスが表示されます。 手順4でrmarkdownをインストールすると、エラーメッセージがインタラクティブなShinyDocに置き換えられます。
注:ポート3838を通過するトラフィックを許可するファイアウォールルールは一時的なものです。 手順3のタスクを完了する前に、ブラウザでhttps://your_server_ip:3838を指定すると、何も読み込まれません。 手順3のタスクを完了すると、そのポートを介してShinyServerにアクセスする必要がなくなります。 手順5でファイアウォールルールを削除します。
これで、ShinyサーバーとShinyサーバーの両方がインストールされ、ポート3838でリッスンしています。
次のステップでは、Nginxを使用してリバースプロキシを設定し、ドメインにSSL証明書をインストールします。これにより、ポート443でShinyServerに安全にアクセスできるようになります。
ステップ3—リバースプロキシとSSL証明書を使用してShinyServerを保護する
このステップでは、Webサーバーとクライアント間のメッセージングのプロトコルであるWebSocketを介して着信要求をShinyServerに転送するようにNginxを構成します。
編集のために、メインのNginx構成ファイルnginx.confを開きます。
sudo nano /etc/nginx/nginx.conf
このファイルでは、使用するNginxサーバーブロックの構成変数を作成できます。
Nginxのマップモジュールを使用して、次のディレクティブを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は、Webサーバーアプリケーションのルートから着信するリクエストを、ポート3838でリッスンしているサーバーのIPアドレスに転送するようにNginxに指示します。
proxy_redirectは、着信文字列http://your_server_ip:3838/を、リクエストを処理するサーバー上の同等のHTTPSに書き換えます。 $host変数は、Nginxが実行されているサーバーのホスト名に評価されます。
proxy_set_headerは、プロキシサーバーに渡されるリクエストヘッダーにフィールドを再定義または追加します。
proxy_read_timeoutは、2つの連続する読み取り操作の間にプロキシサーバーからの応答を読み取るためのタイムアウトを設定します。
終了したら、ファイルを保存して閉じます。
/etc/nginx/sites-available/example.comで行った変更をアクティブ化する前に、ファイルのエラーをテストしてください。
sudo nginx -t
エラーがない場合は、次のコマンドを実行して、デフォルトのNginxウェルカムページが読み込まれないようにします。
sudo unlink /etc/nginx/sites-enabled/default
次に、次のコマンドを実行して変更をアクティブにします。
sudo systemctl restart nginx
これで、リバースプロキシとSSL証明書を使用してShinyServerを保護できました。 https://example.comを(IPアドレスとポート番号を指定せずに)ロードして、セットアップが機能することを確認してください。
次に、インタラクティブなRMarkdownドキュメントのセットアップを構成します。
ステップ4—インタラクティブなRマークダウンドキュメントをホストする
Shiny Serverは、Shinyアプリケーションをホストするだけでなく、インタラクティブなRMarkdownドキュメントをホストするのにも役立ちます。 動作中のShinyServerはShinyアプリケーションをホストできますが、rmarkdownRパッケージがないとインタラクティブなRMarkdownドキュメントをホストできません。 rmarkdown Rパッケージは、手順1でshinyパッケージをインストールしたときと同じ方法でインストールできます。
次のコマンドを使用して、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—ShinyServerのポート番号へのパブリックアクセスを拒否する
手順2では、ポート番号を介したShinyServerへのアクセスを許可するファイアウォールルールを作成しました。 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
リストから1つのルールを削除すると、ルール番号が変更されます(この場合、ルール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アプリケーションとインタラクティブなRMarkdownドキュメントをホストできる完全に機能するShinyサーバーができました。
展開を開始する準備ができたら、ShinyServerの構成ファイルを/etc/shiny-server/shiny-server.confにあります。 デフォルトでは、/srv/shiny-server/ディレクトリ内のアプリケーションを提供するように設定されています。つまり、/srv/shiny-server/app_nameに配置されたShinyアプリケーションは、https://example.com/app_name/で一般に公開されます。
正確なニーズに合わせてShinyServerをカスタマイズする方法の詳細については、 Shiny Server管理者ガイドにアクセスするか、rstudio.comのチュートリアルをお読みください。 インタラクティブなRマークダウンドキュメントの作成について詳しくは、rstudio.comのRマークダウンページをご覧ください。