Node Express 網站應用
以下說明一個常見流程:透過 SSH 登入 Ubuntu 伺服器後,部署並啟動 Node.js + Express 網站應用。假設:
- Ubuntu 伺服器可透過 SSH 登入
- 專案使用 `package.json`
- Express 應用入口可能是 `app.js`、`server.js` 或 `index.js`
- 應用監聽 `3000` 埠
---
## 1. 透過 SSH 登入伺服器
在本機終端機執行:
```bash
ssh username@SERVER_IP
```
例如:
```bash
ssh ubuntu@203.0.113.10
```
若 SSH 使用非預設的 22 埠:
```bash
ssh -p 2222 ubuntu@203.0.113.10
```
登入後,可以確認系統版本:
```bash
cat /etc/os-release
```
---
## 2. 更新 Ubuntu 套件
```bash
sudo apt update
sudo apt upgrade -y
```
安裝常用工具:
```bash
sudo apt install -y git curl build-essential
```
`build-essential` 可協助安裝某些需要編譯的 npm 套件。
---
## 3. 安裝 Node.js 與 npm
建議使用 **nvm**,方便切換 Node.js 版本。
### 安裝 nvm
```bash
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
```
重新載入 Shell 設定:
```bash
source ~/.bashrc
```
確認 nvm 是否安裝成功:
```bash
nvm --version
```
### 安裝 Node.js
若專案使用 Node.js LTS:
```bash
nvm install --lts
nvm use --lts
nvm alias default 'lts/*'
```
確認版本:
```bash
node -v
npm -v
```
若專案指定特定版本,例如 Node.js 20:
```bash
nvm install 20
nvm use 20
nvm alias default 20
```
若專案有 `.nvmrc`:
```bash
cd /path/to/project
nvm install
nvm use
```
---
## 4. 取得 Express 專案
### 方法 A:從 Git 儲存庫下載
先建立應用程式目錄:
```bash
sudo mkdir -p /var/www
sudo chown -R $USER:$USER /var/www
```
下載專案:
```bash
cd /var/www
git clone https://github.com/your-account/your-project.git my-express-app
cd my-express-app
```
若是私有 Git 儲存庫,通常需要 SSH Key 或存取權杖。
### 方法 B:使用 SCP 從本機上傳
在本機執行:
```bash
scp -r ./my-express-app username@SERVER_IP:/var/www/
```
如果需要指定 SSH 私鑰:
```bash
scp -i ~/.ssh/my-key -r ./my-express-app ubuntu@203.0.113.10:/var/www/
```
---
## 5. 安裝專案相依套件
進入專案目錄:
```bash
cd /var/www/my-express-app
```
若有 `package-lock.json`,建議使用:
```bash
npm ci
```
若沒有 `package-lock.json`,可以使用:
```bash
npm install
```
正式環境通常使用:
```bash
npm ci --omit=dev
```
不過如果啟動程式依賴 `devDependencies`,就不能省略它們。
---
## 6. 設定環境變數
不要直接把密碼、資料庫連線字串或 API Key 寫死在程式碼中。
可以建立 `.env`:
```bash
nano .env
```
例如:
```env
NODE_ENV=production
PORT=3000
DATABASE_URL=postgresql://user:password@localhost:5432/mydb
JWT_SECRET=replace-with-a-secure-secret
```
Express 程式需要載入 dotenv,例如:
```js
require('dotenv').config();
const express = require('express');
const app = express();
const port = process.env.PORT || 3000;
app.get('/', (req, res) => {
res.send('Hello Express');
});
app.listen(port, '0.0.0.0', () => {
console.log(`Server running on port ${port}`);
});
```
注意:
- `.env` 不要提交到 Git
- 將 `.env` 加入 `.gitignore`
- 生產環境的密碼應使用高強度字串
- `0.0.0.0` 可讓伺服器接受外部連線;若只使用反向代理,也可以考慮只綁定本機
---
## 7. 確認啟動指令
查看 `package.json`:
```bash
cat package.json
```
常見格式如下:
```json
{
"scripts": {
"start": "node server.js",
"dev": "nodemon server.js"
}
}
```
正式環境啟動:
```bash
npm start
```
或者直接執行:
```bash
node server.js
```
若程式入口是 `app.js`:
```bash
node app.js
```
啟動後,從伺服器本機測試:
```bash
curl http://localhost:3000
```
如果看到網站回應,表示 Express 已正常啟動。
確認程式是否監聽 3000 埠:
```bash
ss -tulpn | grep 3000
```
---
## 8. 不建議直接使用 SSH 前景啟動
直接執行:
```bash
npm start
```
當 SSH 連線中斷時,程式可能會停止。因此正式環境應使用程序管理器,例如 **PM2**。
---
## 9. 使用 PM2 持續執行 Node.js
安裝 PM2:
```bash
npm install -g pm2
```
在專案目錄啟動應用:
```bash
cd /var/www/my-express-app
pm2 start server.js --name my-express-app
```
如果是透過 npm script 啟動:
```bash
pm2 start npm --name my-express-app -- start
```
查看狀態:
```bash
pm2 status
```
查看日誌:
```bash
pm2 logs my-express-app
```
查看最近的日誌:
```bash
pm2 logs my-express-app --lines 100
```
重啟應用:
```bash
pm2 restart my-express-app
```
停止應用:
```bash
pm2 stop my-express-app
```
刪除 PM2 程序:
```bash
pm2 delete my-express-app
```
讓伺服器重開機後自動啟動:
```bash
pm2 save
pm2 startup
```
執行 `pm2 startup` 後,PM2 會顯示一行需要使用 `sudo` 執行的指令,複製並執行該指令,接著再執行:
```bash
pm2 save
```
---
## 10. 開放防火牆埠
如果要直接從外部存取 `3000`:
```bash
sudo ufw allow 3000/tcp
sudo ufw status
```
但正式網站通常不直接公開 Node.js 的 3000 埠,而是:
- Node.js 只監聽 `3000`
- Nginx 監聽 `80` 和 `443`
- Nginx 將請求轉發給 Express
建議只開放 SSH、HTTP、HTTPS:
```bash
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
```
確認規則:
```bash
sudo ufw status verbose
```
啟用 UFW 前,務必先允許 SSH,否則可能把自己鎖在伺服器外。
---
## 11. 使用 Nginx 反向代理
安裝 Nginx:
```bash
sudo apt install -y nginx
```
建立網站設定:
```bash
sudo nano /etc/nginx/sites-available/my-express-app
```
填入:
```nginx
server {
listen 80;
server_name example.com www.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
```
將設定啟用:
```bash
sudo ln -s /etc/nginx/sites-available/my-express-app \
/etc/nginx/sites-enabled/my-express-app
```
測試設定:
```bash
sudo nginx -t
```
重新載入 Nginx:
```bash
sudo systemctl reload nginx
```
如果有預設網站設定,可以移除:
```bash
sudo rm /etc/nginx/sites-enabled/default
sudo systemctl reload nginx
```
此時可以用網域或伺服器 IP 存取:
```text
http://example.com
```
DNS 必須先將網域的 A 記錄指向伺服器 IP。
---
## 12. 設定 HTTPS
安裝 Certbot:
```bash
sudo apt install -y certbot python3-certbot-nginx
```
申請 SSL 憑證:
```bash
sudo certbot --nginx -d example.com -d www.example.com
```
Certbot 通常會自動修改 Nginx 設定並設定 HTTPS。
測試自動續期:
```bash
sudo certbot renew --dry-run
```
完成後網站可透過:
```text
https://example.com
```
存取。
---
## 13. 更新網站版本
日後更新程式時,可以執行:
```bash
cd /var/www/my-express-app
git pull origin main
npm ci --omit=dev
pm2 restart my-express-app
```
如果使用資料庫 Migration,還需要執行專案指定的指令,例如:
```bash
npm run migrate
```
實際指令依使用的 ORM 或框架而定。
---
## 14. 常用除錯指令
### 查看 PM2 狀態
```bash
pm2 status
```
### 查看應用程式日誌
```bash
pm2 logs my-express-app
```
### 查看 Nginx 錯誤
```bash
sudo tail -f /var/log/nginx/error.log
```
### 查看 Nginx 存取紀錄
```bash
sudo tail -f /var/log/nginx/access.log
```
### 查看服務是否監聽埠號
```bash
sudo ss -ltnp
```
### 查看系統服務狀態
```bash
sudo systemctl status nginx
```
### 測試本機 Express
```bash
curl -i http://127.0.0.1:3000
```
---
## 建議的正式部署架構
```text
使用者瀏覽器
│
▼
Nginx :80 / :443
│
▼
Express / Node.js :3000
│
▼
資料庫或其他服務
```
最基本的部署流程可以簡化為:
```bash
ssh ubuntu@SERVER_IP
sudo apt update
sudo apt install -y git curl build-essential
# 安裝 Node.js 後
cd /var/www
git clone https://github.com/your-account/your-project.git my-express-app
cd my-express-app
npm ci
npm install -g pm2
pm2 start npm --name my-express-app -- start
pm2 save
pm2 startup
```
正式環境建議再搭配 Nginx、HTTPS、UFW 防火牆,以及適當的環境變數管理。
相關學習地圖、教學課程
Python 後端工程、資料庫