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アプリケーションをホストできますが、rmarkdown
Rパッケージがないとインタラクティブな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マークダウンページをご覧ください。