RStudio 是一個 R 的整合開發環境,改良原有的 R 使用界面,加入更多便利的功能,是目前最受歡迎的 R 使用者介面之一。

RStudio 的版本分為 Desktop 與 Server 兩種,Desktop 版是給個人安裝在自己的電腦上使用的,而 Server 版則是安裝在伺服器上面,以網頁介面的方式提供使用者線上使用。

Server 版的部分,如果是 Ubuntu/Debian Linux 的話,可以直接用 apt 安裝打包好的 deb 檔,而如果是 RedHat/CentOS Linux 的話,也有現成的 rpm 可以裝,我們這裡介紹如何在一般其他的 Linux 下自行編譯與安裝 RStudio 的 Server 版。

編譯與安裝 R 2.15.2

Step 1
首先到 R 的官方網站下載最新的 R 原始碼。

wget http://cran.cs.pu.edu.tw/src/base/R-2/R-2.15.2.tar.gz

Step 2
解壓縮下載下來的 R 壓縮檔。

tar zxvf R-2.15.2.tar.gz

Step 3
執行 configure,記得要加入 --enable-R-shlib 參數,如果沒有加入這個參數,則在後面編譯 RStudio 時候有問題。

cd R-2.15.2
./configure --prefix /opt/R/R-2.15.2 --enable-R-shlib

而 --prefix 參數是指定 R 要安裝的路徑。

Step 4
編譯程式,現在的多核心 CPU 可以用 -j 參數指定平行化編譯,會加快很多,這裡我們使用 4 核心的 CPU 來編譯。

make -j4

Step 5
將編譯好的 R 程式安裝到 /opt/R/R-2.15.2。

make install

編譯與安裝 Boost 1.50.0 函式庫

Step 1
下載 Boost 1.50.0 版原始程式碼。

wget http://downloads.sourceforge.net/project/boost/boost/1.50.0/boost_1_50_0.tar.bz2

Step 2
解壓縮下載的壓縮檔。

tar jxvf boost_1_50_0.tar.bz2

Step 3
編譯 Boost 函式庫。

cd boost_1_50_0
./bootstrap.sh
./b2

Step 4
將 Boost 1.50.0 安裝在 /opt/R/boost-1.50.0。

./b2 install --prefix=/opt/R/boost-1.50.0

--prefix 是指定 Boost 函式庫的安裝路徑。

Step 5
設定 ldconfig:

sudo echo '/opt/R/boost-1.50.0/lib' > /etc/ld.so.conf.d/boost1.50.0.conf

重新載入設定:

sudo ldconfig

編譯與安裝 RStudio

Step 1
RStudio 官方網站下載原始碼的 .tar.gz 壓縮檔。

Step 2
解壓縮下載的壓縮檔:

tar zxvf rstudio-rstudio-v0.97.318-0-gd528686.tar.gz

Step 3
安裝 RStudio 編譯所需的程式:

cd rstudio-rstudio-d528686/dependencies/common
./install-dictionaries
./install-mathjax
./install-gwt
cd ../../

Step 4
執行 cmake:

mkdir build
cd build
cmake .. -DRSTUDIO_TARGET=Server \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/opt/R/rstudio \
-DLIBR_HOME=/opt/R/R-2.15.2 \
-DLIBR_INCLUDE_DIRS=/opt/R/R-2.15.2/lib64/R/include \
-DLIBR_LIBRARIES=/opt/R/R-2.15.2/lib64/R/lib \
-DLIBR_DOC_DIR=/opt/R/R-2.15.2/lib64/R/doc \
-DBOOST_ROOT=/opt/R/boost-1.50.0

這裡所指定的參數會跟上面 Boost 與 R 的安裝路徑有關,如有需要,請依照自己系統的安裝路徑設定。而 CMAKE_INSTALL_PREFIX 是指定 RStudio 的安裝路徑。

Step 5
以 4 顆 CPU 編譯 RStudio 原始碼。

make -j4

Step 6
安裝 RStudio 至 /opt/R/rstudio。

make install

Step 7
新增 RStudio Server 系統用帳號 rstudio-server,

sudo useradd -r rstudio-server

只要這個帳號存在,RStudio 就會自動以這個帳號的權限執行。

Step 8
RStudio 是使用 PAM 的方式來進行使用者的認證,在 Ubuntu 或 Debian 中預設就會使用 PAM,而在其他的 Linux 中就要設定(如:Redhat、Fedora 與 openSUSE)。

設定方式就是將設定寫在 /etc/pam.d/rstudio 這個檔案中,在安裝路徑中的 extras/pam/rstudio 是一個範本檔案,可以參考,或是直接複製過去也可以。

sudo cp /opt/R/rstudio/extras/pam/rstudio /etc/pam.d/

Step 9
設定 init.d 服務(Ubuntu 則為 upstart),讓 RStudio 開機自動啓動,在安裝路徑中的 extras/init.d 與 extras/upstart 中有各種常用 Linux 的範本檔案。

而安裝 init.d(或 upstart)script 需要將寫好的 script 檔複製到 /etc/init.d 資料夾中:

cp /opt/R/rstudio/extras/init.d/suse/rstudio-server /etc/init.d/

接著將執行權限打開,然後在設定啓動的 runlevel,例如:

sudo /sbin/chkconfig --add rstudio-server

Step 10
為 RStudio 管理者工具建立連結檔,方便管理用。

sudo ln -f -s /opt/R/rstudio/bin/rstudio-server /usr/sbin/rstudio-server

Step 11
如果你的 Linux 系統有支援 AppArmor,則可以再加入 AppArmor 的設定增加系統安全性,在安裝路徑的 extras/apparmor/rstudio-server 有一個是用於 Ubuntu Linux 的範例組態檔。

Step 12
建立 RStudio 設定檔,其設定檔是在放 /etc/rstudio 這個目錄下,而這個目錄要自行建立:

mkdir -p /etc/rstudio

接著建立 rserver.conf 設定檔,設定要使用的 R 所安裝的路徑:

echo 'rsession-which-r=/opt/R/R-2.15.2/bin/R' >> /etc/rstudio/rserver.conf

設定 RStudio 所佔的 port number,這個就依自己的狀況修改:

echo 'www-port=18000' >> rserver.conf

如果之前的 Boost 不想以 ldconfig 更動整個 Linux 系統的設定,也可以在這裡個別對 RStudio 做設定:

echo 'rsession-ld-library-path=/opt/R/boost-1.50.0/lib' >> /etc/rstudio/rserver.conf

Step 13
若之前已經設定好 init.d 服務了,則這時候就可以使用下面這個指令啟動 RStudio:

sudo rstudio-server start

除了 start 之外,其餘可用的參數有:stop、restart、offline、online 等。

設定 Apache Proxy 功能

通常作為雲端服務的伺服器都會有網頁伺服器的功能,最常使用的就是 Apache,為了避免開太多對外的 port 而增加風險,我們使用 Apache 的 proxy 功能,這樣連線時就可以透過 Apache 轉到 RStudio 的 port,避免 RStudio 直接對外。

Step 1
首先啓動 Apache 的 proxy 與 proxy_http 兩個模組。

sudo a2enmod proxy
sudo a2enmod proxy_http

Step 2
更改 Apache 的設定檔,在 VirtualHost 中加入 proxy 的設定:

<VirtualHost *:80>

  <Proxy *>
    Allow from localhost
  </Proxy>

  ProxyPass        /rstudio/ http://localhost:18000/
  ProxyPassReverse /rstudio/ http://localhost:18000/
  RedirectMatch permanent ^/rstudio$ /rstudio/

</VirtualHost>

這個設定是讓所有連到 /rstudio/ 這個位置的連線直接導入 RStudio 的登入網頁 http://localhost:18000/,這樣網址就會比較簡潔,不會出現 port number。

Step 3
重新啓動 Apache。

sudo /etc/init.d/apache2 restart

常見問題(FAQ)

Problem 1
啟動 RStudio 時,如果出現類似下面這些訊息:


/opt/R/rstudio/bin/rserver: error while loading shared libraries: libboost_date_time.so.1.50.0: cannot open shared object file: No such file or directory
/usr/sbin/rstudio-server: line 24: return: can only `return’ from a function or sourced script
Starting rstudio-server /opt/R/rstudio/bin/rserver: error while loading shared libraries: libboost_date_time.so.1.50.0: cannot open shared object file: No such file or directory
startproc:  exit status of parent of /opt/R/rstudio/bin/rserver: 127
                                                                     failed

則表示 RStudio 啓動時,找不到 Boost 的 shared library,請參考上面的 Boost 安裝教學並檢查:

  • Boost 是否安裝完成,安裝時有沒有錯誤訊息。
  • Boost 的 ldconfig 設定是否正確。

Problem 2
啟動 RStudio 時出現 failed,而 /var/log/messages 中出現類似下面這些訊息:


Mar  4 08:18:20 ngs1t rserver[33336]: ERROR Unable to find an installation of R on the system (which R didn’t return valid output); LOGGED FROM: core::FilePath core::r_util::::systemDefaultRScript(std::string*) /home/seal/rstudio/rstudio-rstudio-d528686/src/cpp/core/r_util/REnvironmentPosix.cpp:217
Mar  4 08:18:20 ngs1t rserver[33336]: ERROR Unable to locate R binary by scanning standard locations; LOGGED FROM: core::FilePath core::r_util::::scanForRScript(const std::vector, std::allocator >, std::allocator, std::allocator > > >&, std::string*) /home/seal/rstudio/rstudio-rstudio-d528686/src/cpp/core/r_util/REnvironmentPosix.cpp:66
Mar  4 08:18:20 ngs1t rserver[33336]: ERROR Unable to find an installation of R on the system (which R didn’t return valid output); Unable to locate R binary by scanning standard locations; LOGGED FROM: int main(int, char* const*) /home/seal/rstudio/rstudio-rstudio-d528686/src/cpp/server/ServerMain.cpp:342

就表示 RStudio 找不到系統上 R 所安裝的位置,請檢查:

  • R 是否有正確安裝好,有沒有錯誤訊息。
  • RStudio 中所設定的 R 路徑是否正確。

原則上只要有問題,通常都可以在錯誤訊息中找到答案。