[ 筆記 ] Express 03 - Deployment


Posted by krebikshaw on 2020-10-11

重要實作流程(置頂)

  1. 先把 Nginx 安裝起來(但先不要去動任何設定!)
  2. 把原本跑在 80 port 的 Apache 先關掉
  3. 確認 Nginx 可以正常在 80 port 執行
  4. 處理上傳到機器上的檔案 (node.modules 把它裝好、資料庫也要連線好)
  5. 確認在上傳上來的檔案直接執行 node index.js 不會出現任何 Error (記得開啟測試用的 port 直接在瀏覽器上面連線確認是否正常執行)
  6. 確認單獨執行程式沒有問題後,再把程式移到 Pm2 上面執行(也要測試 Pm2 執行不會有錯誤)
  7. 前面的步驟都沒有任何錯誤之後,再來設定 Nginx 的轉址(最後記得 restart Nginx)

切記一但做到某個流程出現 bug,就一定要先把 bug 修掉才能夠再進下一個流程,不然新舊 bug 混在一起會非常難修

還有一點:

  • 機器上記得要把 Node npm 先安裝好
  • 把檔案傳上 Server 的時候,不要把 node.modules 資料夾整個傳上來,只要把 package.json 傳上來後,用 sudo npm install 安裝就好
    • 記得用 npm -v 確認版本夠不夠新
    • 如果不夠新請用下列指令來把版本更新
      • curl -sL https://deb.nodesource.com/setup_13.x | sudo -E bash -
      • sudo apt-get install -y nodejs
    • 如果需要把機器上的 node.modules 刪掉
      • rm -rf node_modules

檔案路由

  • 上傳檔案放置的位置:
    • var/www/html/
  • Nginx 的 log
    • var/log/nginx/error.log
  • Nginx 的設定檔
    • etc/nginx/nginx.conf
    • etc/nginx/sites-enabled/default
  • 反向代理路徑設定放的位置
    • etc/nginx/sites-available/

進入正題:

Deployment 部署

當我們的 Express 開發完成後,需要部署到 Server 的機器。
不像我們在 Localhost 上面跑的時候,利用 node index.js 指令來啟動 Server,利用 control + c 來停止。
在租借的機器上面,需要讓程式跑在背景,在需要使用的時候隨時將程式喚醒。所以針對不同的部署方式,需要利用到不同的工具

Nginx + PM2

安裝:

npm install pm2 -g

使用方式:

當我們要將其中一個服務 index.js 跑起來,可以下這個指令:

pm2 start index.js

跑起來之後,系統會給這組 index.js 服務一組新的 id

接下來就可以透過下列指令來達成一些事情:

  • pm2 ls :可以看到 Server 的運行狀態
  • pm2 logs <id>:可以看到程式的 log
  • pm2 info <id>:可以看到細部資訊
  • pm2 stop <id>:可以暫停這個 Server
  • pm2 restart <id>:可以重啟這個 Server
  • pm2 delete <id>:可以把程式重背景執行環境刪掉

藉由 pm2 讓我們可以同時讓遠端機器在背景環境下執行多個不同的服務,但是由於同一台機器,只能夠接收一個 80 port,所以我們要利用一個「反向代理」的方式,讓我們在 80 port 放一台代理伺服器,藉由分辨不同的網址,代理伺服器會幫我們把 request 轉址到對應的 server。

Nginx

參考網站:https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-18-04
https://ithelp.ithome.com.tw/articles/10188498?sc=rss.qu

安裝:

sudo apt update
sudo apt install nginx
sudo ufw allow 'Nginx HTTP'  // 設定防火牆

使用方式:

安裝完成後,在 /etc/nginx/sites-available/ 路徑底下新增一個設定檔(檔名寫下要給使用者使用的網址)

並且打開檔案,按照固定格式,寫下下列的設定內容

server {
    listen       80;
    server_name  example.com;

    location / {
      proxy_pass http://127.0.0.1:3001;
    }
}
  • server_name 填上要給使用者使用的網址
  • proxy_pass 後面接上要轉換的 port
//  接著要在 CLI 上面執行
sudo ln -s /etc/nginx/sites-available/<剛剛新建的檔案名稱> /etc/nginx/sites-enabled/

上述設定完成後,只要將 Nginx 啟動,就可以執行了

CLI 指令:

  • systemctl status nginx :確認 Nginx 目前的狀態
  • sudo systemctl start nginx :啟動 Nginx
  • sudo systemctl restart nginx :重啟 Nginx

(每一次建立新的 Server 都需要建立新的檔案,把給使用者使用的網址對應到指定的 port,建立完新的檔案後,記得要重啟 Nginx)

補充:如果是要設定 Nginx 直接做轉址: (這個如果用不到就不用設定)

server {
    listen       80;
    server_name  example.tw;

    location / {
      rewrite ^ <要轉過去的網址> ;
    }
}

補充

  1. 切記,檔案部署到機器的時候,Module 要確定都有裝好,資料庫也要確認是否有建立好。
  2. 當我們要在部署的機器上監聽多個 port 的時候,要先到 EC2 的 Security Group 新增這幾個 port
  3. 由於 ubunto 安裝好的時候,80 port 已經被 Apache 佔用了,Nginx 會沒辦法使用,所以要先到 /etc/apache2/ports.conf/etc/apache2/sites-enabled/000-default.conf 先更改 apache 監聽的 port
# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf

Listen 80

<IfModule ssl_module>
        Listen 443
</IfModule>

<IfModule mod_gnutls.c>
        Listen 443
</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
~

記得這邊設定好,要重啟 Apache sudo /etc/init.d/apache2 restart,不然會跟我一樣,天亮了都調不好

修復紀錄

在設定 Ubunto 的 port 的時候,好像不小心把用來給 SSH 連線用的 22 port 關掉了,導致我自己電腦要利用 SSH 連線上 Ubunto 的時候完全連不進去。

後來找到了直接在 EC2 後台連進機器裡的方法

  • 先登入 EC2 後台系統,找到你的那台機器,到「連線」的頁面之後,選到 Session Manager,點選底下的「偏好設定」

  • 進入底下頁面後,找到「Session Manager」打開它,並點選「開始進行工作階段」

  • 選擇自己的那台機器之後,點選「開始進行工作階段」

  • 就可以進入到輸入指令的頁面,來開啟 port 22

好用指令

☞ Nginx 安裝完成後:
  • 確認防火牆是否有打開
    • sudo ufw status
  • 確認目前 80 port 是誰在使用
    • sudo netstat -tunlp | grep 80
  • 確認執行時出現的錯誤
    • sudo cat /var/log/nginx/error.log
☞ 如果需要把壞掉的程式移除:
  • 先使用移除指令:
    • sudo apt-get remove --purge <要移除的軟體>
    • sudo apt-get autoremove --purge
  • 再重新安裝起來
    • sudo install <要安裝的軟體>
☞ Pm2 啟動程式失敗:
  • 先把 pm2 的程式關掉
    • pm2 delete <id>
  • 到那個 project 直接用 node 執行起來看 log

#nginx







Related Posts

筆記、[FE101] 前端基礎 HTML

筆記、[FE101] 前端基礎 HTML

[BE201] 、超簡易留言板(下)

[BE201] 、超簡易留言板(下)

Spring boot系列(二)環境設定

Spring boot系列(二)環境設定


Comments