Ricky 叩叮俱樂部

在開始之前,先來杯長島冰茶吧~

0%

Ubuntu 18.04 LTS+Apache+PM2

前言

自從進來公司後所有的專案都是採用SPA開發,但在部署上時常會碰到一些小問題

像是當前後台並不是用子網域的方式分開,例如:

  • https:backstage.xxx.com/

  • https:xxx.com/

而是採用子目錄的方式分開:例如:

  • https:xxx.com/

  • https:xxx.com/bakcstage

要如何快速方便設定好Apache就是一個令人頭痛的地方

而如果前台剛好使用的是node.js,就可以用PM2來解決這樣的困境

那我們一起來看下去吧~!

Ubuntu

這邊使用的是GCP平台,因此在建立Ubuntu時可先賦予root密碼

1
$ sudo passwd root

可切換至root帳號

1
$ su -

這樣在操作下列步驟時,執行指令前就不用另外加sudo

Node.js+Vue

這次教學打算先架一個簡單的Vue cli當作node.js的專案,這部分可以參考這一篇

PM2

PM2是自帶負載平衡的node.js程序管理器

當你需要部署node專案,讓它有效分配主機CPU及記憶體資源時,並且獨立運作在主機上時

它會是你很好的選擇,而其中PM2PM代表著 Process Manager

process可以指服務、程序、應用,這邊統一以程序作為中文譯詞

安裝

在全域模式下安裝PM2

1
$ npm install pm2@latest -g

-g:global

新增程序

透過啟動js建立一個程序

1
$ pm2 start <.js>

透過指令方式建立一個程序

1
$ pm2 start "<COMMAND>"

也可以直接透過靜態檔案建立

1
$ pm2 serve <PATH> <PORT>

如果你要啟動一個vue專案可以這麼做

1
$ pm2 start "npm run start" --name <APP NAME> --watch --max-memory-restart 1000M --log ~/.pm2/logs/<APP NAME>/ --time

可以附加的參數如下(以下–都為兩個-):

  • –name:指定 app 一個名字

  • –watch:檔案有變更時,會自動重啟

  • –max-memory-restart:記憶體使用超過這個門檻時,將自動重啟

  • –log:設定 log 的目錄,若要重新設定目錄,需將原本的程序刪掉後重新建立

  • –error:設定 error log 目錄

  • –log-date-format:指定 log 的格式

  • –time:給 log 加上時間前綴

  • –spa:限定serve使用,會重導所有的請求到index.html

  • –restart-delay:自動重啟時,要 delay 多久

  • –basic-auth-username –basic-auth-password:限定serve使用,讓該頁面需要帳號密碼方可存取

管理程序

顯示管理程序狀態

1
$ pm2 [list|ls|status]

pm2_list.png

顯示管理程序CPU及記憶體使用狀態

1
$ pm2 monit

pm2_monit.png

顯示指定程序狀態

1
$ pm2 show <APP NAME>

pm2_show.png

直接kill再重啟程序

1
$ pm2 restart <APP NAME>

停止程序

1
$ pm2 stop <APP NAME>

停止並刪除程序

1
$ pm2 delete <APP NAME>

而除了<APP NAME>之外,你也可以替換成all或是<id>

all: 所有程序 / id: 該程序編號

開機時自動啟用

如果希望主機重啟時能夠重新啟用PM2的話可以這麼做

1
$ pm2 startup

另外不要忘記儲存當前設定好的應用

1
$ pm2 save

Apache

當你透過PM2的任何一種方式建立好程序後

再來就是編輯我們的Apache設定檔.confProxyPassMatch則設定後台要進入的目錄

1
2
3
4
5
6
7
<VirtualHost *:80>
...

ProxyPassMatch ^/<PATH> !
ProxyPass / http://localhost:3000/
ProxyPassReverse / http://localhost:3000/
</VirtualHost>

啟用該設定檔

1
$ a2ensite <.conf>

最後重啟Apache就大功告成了

1
$ systemctl restart apache2