重要實作流程(置頂)
- 先把 Nginx 安裝起來(但先不要去動任何設定!)
- 把原本跑在 80 port 的 Apache 先關掉
- 確認 Nginx 可以正常在 80 port 執行
- 處理上傳到機器上的檔案 (node.modules 把它裝好、資料庫也要連線好)
- 確認在上傳上來的檔案直接執行 node index.js 不會出現任何 Error (記得開啟測試用的 port 直接在瀏覽器上面連線確認是否正常執行)
- 確認單獨執行程式沒有問題後,再把程式移到 Pm2 上面執行(也要測試 Pm2 執行不會有錯誤)
- 前面的步驟都沒有任何錯誤之後,再來設定 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>
:可以看到程式的 logpm2 info <id>
:可以看到細部資訊pm2 stop <id>
:可以暫停這個 Serverpm2 restart <id>
:可以重啟這個 Serverpm2 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
:啟動 Nginxsudo systemctl restart nginx
:重啟 Nginx
(每一次建立新的 Server 都需要建立新的檔案,把給使用者使用的網址對應到指定的 port,建立完新的檔案後,記得要重啟 Nginx)
補充:如果是要設定 Nginx 直接做轉址: (這個如果用不到就不用設定)
server {
listen 80;
server_name example.tw;
location / {
rewrite ^ <要轉過去的網址> ;
}
}
補充
- 切記,檔案部署到機器的時候,Module 要確定都有裝好,資料庫也要確認是否有建立好。
- 當我們要在部署的機器上監聽多個 port 的時候,要先到 EC2 的 Security Group 新增這幾個 port
- 由於 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