2014年4月14日 星期一

架設 Scala Play 2.2.x 在雲端Server上

前言 2014 4 14
有段時間沒更新了, 是在研究Play Framework的架構和實作, 並且實驗性的放到雲端伺服器上面, 能夠直接支援Play framework的Cloud Server不多, 所以多花的時間測試和佈署Play Server, 想說能夠透過Play 來增加對Scala的深度, 尤其在快速佈署且可擴充的雲端服務

Play on Scala雖然底層還是JVM在跑, 但因為在Play 2.0版之後, 架構大改, 並不能完全無痛的轉換成Java Servlet 的War, 尤其是針對舊版的 Servlet, 儘管我沒實驗過, 上網調查一下Play2! in Gae有發現一個Project play2-war-plugin可以幫你把Play包成Servlet 的War, 可是針對不同版本的Play與Servlet, 支援度都有落差, 再者最新版的Servlet3.x 也不知GAE支援與否, 在如此限制多的條件下, 想要快速佈署只好另尋出入, 忍痛放棄免費的GAE

本篇有實作兩個Cloud server
  1. Clever cloud
  2. AWS EC2

Clever cloud 

是一個在法國的企業, 可能不是這麼有名, 而且還是要收費, 只是帳號一開始給你20歐元玩看看, 它的優點是你只要註冊好新創一個App, 然後在App console 中的INFORMATION那邊, 有一個Deployment URL GIT可以讓你直接佈署你的play application

你只要把你的Play project 建成Git repositories
Git repositories建置和Code提交指令(系統要先裝好git)
git code
git init //把改project變成git repository 
git add . //把所有檔案加到git track中, 保持追蹤這些檔案的版本控制 
git commit -m "first commit" //提交已經被track的版本控制檔案, 記錄這一個版本,-m 是附上這一個提交版本的註解, 以便以後追蹤

建好Git repository後就可以直接上傳project到Clever cloud上
用git 指令 git psuh + 給你的 Deployment URL GIT, 就會開始上傳Play project到Clever cloud
上傳完就會佈署到Play server並且啟動你的Play application
可以透過App console 中的DOMAIN NAMES來找到他給你的URL
透過該URL就可以連到你的Play application,

Clever cloud佈署 Play非常簡單且快速, 主要也是因為他已經幫你建好Play server, 你只要把code上傳就可以了

AWS EC2

儘管Clever cloud方便但是要錢, 所以還是去找一些免費方案讓來測試練習,
AWS EC2的Cloud service已經行之有年, 算是市面上最大且最完善的Cloud service,
而且還有一年免費, 其實是最好的選擇,
先註冊AWS 帳號, 網路上很多教學文這邊就不贅述了
接著創建一個最基本的Linux的Instance, 也是網路上很多教學文這邊就不贅述了

我是創建最基本版的Linux


這邊主要是跟大家分享怎麼建置Play server環境並且正確的佈署你的Play Application, 特別是透過Windows的putty ssh連到EC2的 Linux 來建置環境, 官方教學文, 熟悉官方的話可以跳過步驟1

1, putty 設定


連線的IP, 在你的EC2 Console 的Instance 上, 點選你創的Linux instance, 會出現相關資訊, 裡面有個Public IP , 可以透過該IP 用ssh連你的instance,
在putty 打instance Public IP , port 用 22 -> ssh連線專用的port
要外部連線到instance必然要透過你從AWS下載的Private KEY連線, 下載的格式是pem檔, 可是putty只吃ppk KEY, 你可以再去下載PuTTYgen來做格式轉換

把你設定好的Session用個名稱存起來以後可以直接連線不必一直重新設定
這邊是用TokyoEC2來存Session
接著就可以連線到你的EC2 Instance 如下圖


登入時會要你輸入使用者名稱, 預設的使用者名稱是ec2-user,
然後就進入EC2 的Linux Instance指令模式, 可以開始下指令建置Play 環境拉~

2. Install Oracle JDK

預設的Instance只有JVM 沒有JDK, 這樣是無法Compile Play project,
如果用wget會無法正常在Oracle網站取得JDK安裝檔
主要是因為 Oracle 網頁那邊會要你先勾選認可他的使用條約, 這在指令介面沒法運作
因此我這邊是先在Windows這一端下載好JDK Linux 64bit 版的rpm, 然後用pscp 傳過去
pscp 重Windows傳檔到EC2 Linux Instance AWS有教學, 基本上他的指令就是
pscp -i Private-key-pair.ppk YourJDK.rpm ec2-user@public_dns:/usr/local/YourJDK.rpm
先把pscp.exe, JDK rpm檔跟 ppk private KEY放在同一個資料夾,
用cmd進入該資料夾, 執行上面的指令,
因為pscp也是透過ssh連線上傳檔案, 所以也還是要ppk private KEY來認證,
指令裡面的public_dns就是在EC2 Console 的Instance裡面會有Public DNS, 就是了
執行完指令就會把檔案上傳到EC2 linux instance上
然後切換到/usr/local/目錄下執行
sudo rpm -Uvh YuorJDK.rpm
就會開始安裝JDK
並且更新你的Java指令位置
sudo rm /usr/bin/java
sudo ln -s /usr/java/default/bin/java /usr/bin/java

裝完你打javac -version看有無安裝成功, 安裝成功會出現JDK版本

3 Install Scala

原本Scala也想照著JDK模式走, 但發現在Windows 的系統去下載Scala安裝包他只會給你最新版的msi 檔, (網站太強就是雞婆XD)   msi檔無法在Linux系統下直接安裝(要裝外掛軟體) , 最好還是從Linux Instance下載安裝, 但早期網路上Linux 安裝Scala 的教學中給你的wget 網址, 都只會Page Not found, 因為Scala的安裝包的URL已經改變, 最簡單方式就是在Windows去找Scala官方找安裝包的下載點URL, 複製連結網址, 比如我今天找到的是Scala 2.10.4版本
EX: http://www.scala-lang.org/files/archive/scala-2.10.4.msi 
然後把後面的msi 改成 tgz, 變成
EX: http://www.scala-lang.org/files/archive/scala-2.10.4.tgz
接著 Linux instance那邊執行
建立Scala資料夾, 並下載Scala tgz包
sudo mkdir  /usr/share/scala
cd /usr/share/scala
sudo wget http://www.scala-lang.org/files/archive/scala-2.10.4.tgz
解壓縮Scala tgz包 
sudo tar -xzvf scala-2.10.4.tgz
設定Scala可以執行的權限
sudo  chmod a+x /usr/share/scala/scala-2.10.4/bin/*
PS: a是user group other都有, x 是可以執行權限
建立好到處直接執行的指令路徑
sudo ln -s /usr/share/scala/scala-2.10.4/bin/scala /usr/bin/scala
sudo ln -s /usr/share/scala/scala-2.10.4/bin/scalac /usr/bin/scalac
sudo ln -s /usr/share/scala/scala-2.10.4/bin/scalap /usr/bin/scalap
sudo ln -s /usr/share/scala/scala-2.10.4/bin/fsc /usr/bin/fs
如此一來Scala就安裝好了, 你可以試著打Scala指令看有無進入Scala的Interpreter模式


4, Install Play

安裝Play Framework 跟Scala很像, 先去Play官方網頁下載處, 取好Play包的下載URL
EX: http://downloads.typesafe.com/play/2.2.2/play-2.2.2.zip
然後在Linux instance那邊執行下載
sudo mkdir /usr/share/play
cd /usr/share/play
sudo wget http://downloads.typesafe.com/play/2.2.2/play-2.2.2.zip
解壓縮Play的zip包, 並加上play指令的執行權限
sudo unzip play-2.2.2.zip
sudo chmod a+x /usr/share/play/play-2.2.2/play
增加ec2-user帳號的對於play資料夾下的任何行為權限, 把play的ownership給ec2-user , 如果沒有的話ec2-user就無法有權限的新增檔案
sudo chown -R ec2-user:ec2-user /usr/share/play
創造可以到處直接執行play指令的路徑
sudo ln -s /usr/share/play/play-2.2.2/play /usr/bin/play

設定好play環境後, 就可以執行看看play 指令看有無進入play互動模式

Deploying your play application 

安裝好Play之後就可以把你的play project傳到Linux instance上面, 可以透過git 下載or play dist打包成只有compile好的二進位standalone 版本直接執行, 我這邊介紹最基本的, 從Play source project中進入play 模式來佈署你的application

在你的Play project中用
sudo play
進入play模式, 前面的sudo很重要, 因為這樣才有最高級權限來執行play server的執行
接著在play互動模式中啟動你的server
start 80
start 是play執行production的模式, 後面的80是port , 沒有給port的話預設是會在port 9000上
如果進入play時沒有給sudo, 你就無法把你的play application放到port 80上面
會有Jboss netty server binding error出現如下

因為port 80是預設接收Http request, 需要最高權限才能改放你的play application
正確啟動之後會如下圖
會跟你說你的play server是在process 6728中執行
接著你就可以按ctrl + d 離開互動, 去做其他事情
或者按ctrl + c 離開互動也關閉你的play server

這時候你可以開瀏覽器去輸入你的網址, EC2 的Instance會有給你一個Public DNS, 那個就是預設給你的網址URL. 它會連到你的Instance port 80 去, 就可以看到你的play applcaiotion

PS, 你要記得為你的instance 的Security group加上接收HTTP Port 80的權限, 那邊掌管有哪些網路port可以連到你的instance, 在Launch一台新的 instance 時候它只會預設給 ssh 的 port 22, 那時候可以新增 Http, 或者launch instance後, 再去 instance的 Description 中找 Security groups, 點進你的Security groups 並增加Http 的管道, 如下圖,

 開通http之後, 你的play application才可以接收到外部request

Stop Play server

如果是按ctrl + d 離開互動, play server還在背景執行, 你可以再回到play project中執行
sudo play stop
就會關閉你的play application的server process


大致上是如此, 有甚麼問問題歡迎留言討論

沒有留言:

張貼留言