Ubuntu20.04でShinyServerをセットアップする方法

提供:Dev Guides
移動先:案内検索

著者は、 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レコード。
  • ドメインの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がリッスンしている場所を調査します。

  • pprocessesの略で、socketを使用するプロセスを示しています。
  • llisteningの略で、リスニングソケットを表示します。
  • 該当する場合、uUDPソケットを表示します。
  • 該当する場合、tTCPソケットを表示します。

出力には次の行が表示されます。

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.comRマークダウンページをご覧ください。