iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 26
0

Node.js-Backend見聞錄(25):關於Server建置

前言

關於Server建置部分,我們會使用AWS的EC2服務來說明,並試著將我們的之前做好的商品系統給push上去,再藉由建置好的EC2主機來開啟專案。好讓API URL不在是由localhost的本地端運行,而是透過一個Host來運行。

主機環境

後端語言:Node.js
OS(local): Mac OS
OS(remote): Ubuntu

首先

首先,我們得要去註冊一個AWS的帳號(廢話)。待註冊好後,我們先進入到EC2的頁面,可以看到左手邊一系列的選項可選,我們先選擇Instances的選項。

註記:EC2的服務可以讓我們免費試用一年,不過適用的主機也只有最低階配備能使用,但已經足夠讓我們來嘗試架設一台Server了。

之後點選Launch Instance來開始選擇我們要建置什麼主機:

Choosen an Amazon Machine Image

這些OS都是Amazon Machine Image(AMI)選項。AMI是Amazon預先設定的伺服器範本,在選單中的每個AMI都預設好一個作OS,可以想像成Amazon已經幫我們安裝好OS,我們只要選擇所想要使用的OS即可。

先點選Free tier only的選項,該選項會顯示為所有免費可選的主機,之後我們選擇一個ubuntuServer的主機。最後,點選Select來接續下一步。

Choosen an Instance Type

在該頁面能看到有CPU, Memory, Storage...等。也就是主機的配備設定,但這部分由於我們是使用免費專案,所以直接點選有免費專案的選項即可。最後,再選擇Review and Launch往下一步走。

Review Instance Launch

最後,我們可以在該頁面中看到之前設定好的內容。但之前的設定其實都是以免費方案為主,唯一能讓我們思考的也只有AMI的不同。待確定後,就選取Lanunch來跳到下一步動作。

Select an existing key pair or create a new key pair

這部分意思是要我們用SSH的方式來進行登入。

註記:關於SSH(Secure Shell),它是一種安全的網路傳輸協定,它給Client端及Server端之間開啟一個安全的tunnel,所有需要傳輸的指令或資料都可以透過這個tunnel來進行傳遞。SSH最常用在這種遠端登入的服務,它的運作原理是產生一組key pairs分成公鑰及私鑰。私鑰會留在Client端,公鑰會放在Server端,當今天有用戶想要登入到Server端時,只要驗證這個私鑰可以解開公鑰,那用戶就能登入該Server端。換個例子說明,想像成公鑰是一把鎖,而私鑰則是一把鑰匙,這鑰匙與鎖的關係讀者應該就不難想像了。

接著選擇Create a new key pair的選項,並為這個Key pair取個你所喜歡的名稱後再按下Download Key Pair的選項。當按下後就會把私鑰給下載下來了。下載後再按下Launch Instances來啟動Server。

註記:Key Pair的私鑰檔案為唯一,若將它遺失就不能在登入該Server了。另外,若是別人擁有這把私鑰也能夠登入到該Server,請小心保存。

Launch Status

就能看到整個Server啟動後的狀態,最後按下View Instance就能回到一開始的Instance列表的頁面。

連接Server

由於筆者的OS是MacOS所以這部分的說明會以這OS為主(但Linux也適用)。

移動pem檔案

我們先將私鑰的pem檔案移動到.ssh的資料夾中,先找到我們剛剛下載下來的檔案,並輸入:

$ mv ~/Downloads/PenguinRun.pem ~/.ssh/PenguinRun.pem

這部分筆者的pem是放在Downloads裡面,所以只要輸入mv指令,就能將該檔案移動到.ssh的資料夾中。

設定pem權限

為了確保私鑰不會被檢視,我們先使用chmod指令來更改該檔案的權限。

$ chmod 400 ~/.ssh/PenguinRun.pem

之後,我們輸入指令ls -l來檢視該檔案的權限是否已經被變更。

$ ls -l

結果能看到:

註記:chmod 400意思是這個檔案Read by owner,也就是只有使用者本身才能看到。

登入EC2

先到Instance介面來看我們主機的IP是多少,可至紅圈部分來看或直接複製起來也行,待會登入會用到。

之後,我們輸入下述指令:

$ ssh -i "PenguinRun.pem" ubuntu@ec1-111-111-111-111.ap-northeast-1.compute.amazonaws.com

註記:111-111-111-111為示範IP。讀者輸入自己EC2上的IP

屆時會出現一個問題:

The authenticity of host 'ec2-111-111-111-111.ap-northeast-1.compute.amazonaws.com (111-111-111-111)' can't be established.
ECDSA key fingerprint is...
Are you sure you want to continue connecting (yes/no)? yes

我們只要輸入yes後,就可以登入到我們主機了。

安裝開發環境

再來就跟我們在關於後端觀念(四)-怎麼建立後端開發環境所描述的動作差不多,也就是安裝Node.js並將我們放置在github的專案給git clone下來即可。

安裝Node.js

這部分我們就根據Node.js官網所說的在ubuntu環境下安裝的方式進行。首先,先輸入指令:

curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -

待執行完成後就會出現:

## Run `apt-get install nodejs` (as root) to install Node.js v8.x and npm

也就是我們只要再輸入下列指令,就安裝完成。

sudo apt-get install -y nodejs

最後,我們在輸入下列指令來看是否有安裝完成:

$ node --version
v.8.9.4

建立使用者資料夾

我們先按pwd指令來確定目前的位置在哪邊:

$ pwd
/home/ubuntu

於是發現我們目前在/home/ubuntu的資料夾中,我們先用cd ..指令回到/home的目錄中。

$ cd ..

之後,在建立一個屬於可以代表我們使用者的資料夾來做運用:

$ mkdir PenguinRun
mkdir: cannot create directory ‘PenguinRun’: Permission denied

註記:筆者這部分以PenguinRun的使用者資料夾來做說明。

但這時會出現權限不足的問題,接續我們在使用sudo的權限來設置,並使用ls的指令來檢查:

$ sudo mkdir PenguinRun
$ ls
PenguinRun  ubuntu

當設置完成後,我們就以PenguinRun來當基底,並整理出所有任何你想放置的東西。

透過git匯入專案

這步驟就是將我們先前所做好的商品系統匯入到這台Server中。首先,先將我們在git的url複製下來並使用git clone的指令來將整個專案匯入。

$ git clone <git url>

待匯入後先輸入npm install來將整個專案所使用到的package給安裝進去。

$ npm install

待安裝後,就使用npm start來啟動整個專案。

$ npm start

但若是讀者是按照筆者之前所說的去實作整個商品系統的話,通常會發現到會出現個connection error的回覆,這是因為我們資料庫當初是建置在local也就是本地端的主機上。所以,若是讀者想要在該環境上使用該資料庫,等同於還要再額外設定資料庫才行。但這部分的操作,筆者就不多做說明。

所以,我們換個方式來測試看看要怎在Sever上開啟API。

撰寫測試程式碼

由於,我們已經安裝好Node.js,所以換個角度想我們直接寫個最簡單的hello world且HTTP method為GET就行。從Server上輸入nano sample.js來直接進行撰寫:

//引入node的http模組。
const http = require("http");

//定義個function來處理即將到來的http request.
requestHandler = (request, response) => {

    // 回傳JSON格式的response訊息
    const json = JSON.stringify({
        say: "hi",
    });

    response.end(json);
}

//使用http模組來建立一個server,並使用上述定義的function來處理request.
const server = http.createServer(requestHandler);

//啟動server並使用3333的port.
server.listen(3333);

待撰寫結束後按ctrl + x離開,並會詢問是否儲存檔案,這時選則y即可。在接續使用ls指令來看是否有成功建置。

$ ls
sample.js

之後,使用node sample.js指令來啟用該檔案。

$ node sample.js

最後,開啟瀏覽器並輸入111-111-111-111:3333會發現不管怎麼連都連不上。沒關係,代表我們還有地方還未設定到。

設定Elastic IP

我們再回到AWS EC2的部分,先至Elastic IPs選項,並點選Allocate New Address鈕來建立一個新的IP。

註記:這是因為EC2的主機若要讓外人能夠連接,還需要額外設定個彈性IP來使用。

按下Allocate 按鈕後,就會給我們一個新的IP做使用,最後再按Close離開。

接續點選新增過後的Elastic IP並在上面的Actions中選擇Associate address

再來,在Instance中選擇我們之前剛建立好的Instance,接續Private IP選擇相對應的IP,最後按下Associate按鈕。

但這時會發現我們一開始的Server IP也會隨著Elastic IP而改變。等同於我們起初所登入的111-111-111-111也會跟著改變成222-222-222-222,假如讀者目前還在主機上,也會被強制登出。

註記:222-222-222-222將比喻成新的Server IP。

但我們還是可以拿取一開始所拿到的私鑰來進行登入,但讀者就得要將登入的IP換成是我們剛剛轉換好的222-222-222-222來做登入。

接續,我們一樣回到撰寫測試程式碼,再次測試看看能不能使用Server IP來開啟API。照步驟到最後,發現還是不行,那該怎麼辦呢?沒關係,我們在設置最後一個東西就可以了!(真的是最後)

設定Security Group

一樣回到AWS EC2的部分,選取Security Group按鈕,並選擇我們剛剛所建立好的Server,再來選擇Inbound選項的Edit按鈕。

之後,選擇Add Rule並在Type項目中選擇Custom TCP,並在Post Range寫入剛剛在撰寫測試程式碼部分的port(3333)。最後點選Save離開。

測試

最後的最後(真的是最後了)開啟我們的專案:

$ node sample.js

開啟隨便個瀏覽器,並輸入API URL還有指定的port就能看到我們成功了!

小結

讀者在這一連串的設定後,不知道對於Server的建置有沒有更加了解呢?筆者在這部分是選用AWS EC2服務來說明,但其他還有像google的Google Cloud Platform服務也可以玩,都是一年內免費。關於Server建置的議題還有「HTTPS設定」、「reverse proxy」...等。好多好多議題可以研究。若讀者對Server建置有興趣,不仿去研究看看這些。後續我們將進入到進階實作的部分。


上一篇
Node.js-Backend見聞錄(24):實作-商品系統(七)-確認訂單部分
下一篇
Node.js-Backend見聞錄(26):進階實作-關於第三方登入(一)
系列文
Node JS-Back end見聞錄31

尚未有邦友留言

立即登入留言