WeHelp
AWS (Amazon Web Services) 是全球最大的雲端運算平台,提供超過 200 種功能完整的隨選即用服務。
  1. 簡介 AWS 雲端服務
  2. AWS 會員帳戶註冊
  3. AWS EC2 伺服器
  4. SSH 遠端管理
  5. FastAPI 網站應用
  6. Node Express 網站應用
  7. PHP Laravel 網站應用
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 後端工程、資料庫
從 0 開始,成為後端工程師的學習路徑。