維運管理
本文件說明 AppFuse 應用系統的日常維運操作,包含服務管理、監控、備份還原與更新升級。
服務管理
服務架構
直接部署:Systemd 管理
服務管理指令
# 啟動服務
sudo systemctl start appfuse.service
sudo systemctl start nginx.service
# 停止服務
sudo systemctl stop appfuse.service
sudo systemctl stop nginx.service
# 重啟服務
sudo systemctl restart appfuse.service
sudo systemctl reload nginx.service # Nginx 建議用 reload
# 查看狀態
sudo systemctl status appfuse.service
sudo systemctl status nginx.service
# 設定開機啟動
sudo systemctl enable appfuse.service
sudo systemctl enable nginx.service
# 停用開機啟動
sudo systemctl disable appfuse.service
查看服務日誌
# 即時追蹤日誌
sudo journalctl -u appfuse.service -f
# 查看最近 100 行
sudo journalctl -u appfuse.service -n 100
# 查看特定時間範圍
sudo journalctl -u appfuse.service --since "2024-01-01" --until "2024-01-02"
# 查看今天的日誌
sudo journalctl -u appfuse.service --since today
Tomcat 管理
# 啟動 Tomcat
$CATALINA_HOME/bin/startup.sh
# 停止 Tomcat
$CATALINA_HOME/bin/shutdown.sh
# 查看日誌
tail -f $CATALINA_HOME/logs/catalina.out
# 重新部署(熱部署)
# 將新的 WAR 檔案複製到 webapps 目錄
cp app-server.war $CATALINA_HOME/webapps/
監控
健康檢查
健康檢查端點
# 基本健康檢查
curl http://localhost:8080/actuator/health
# 回應:{"status":"UP"}
# 詳細健康檢查(需認證)
curl -u admin:password http://localhost:8080/actuator/health
# 應用程式資訊
curl http://localhost:8080/actuator/info
# 效能指標
curl http://localhost:8080/actuator/metrics
curl http://localhost:8080/actuator/metrics/jvm.memory.used
健康檢查腳本
建立 /opt/appfuse/bin/health-check.sh:
#!/bin/bash
API_URL="http://localhost:8080/actuator/health"
NGINX_URL="http://localhost/"
echo "=== AppFuse 健康檢查 ==="
echo "時間: $(date)"
echo ""
# 檢查後端
echo -n "後端服務: "
BACKEND_STATUS=$(curl -s -o /dev/null -w "%{http_code}" $API_URL)
if [ "$BACKEND_STATUS" = "200" ]; then
echo "✓ 正常 (HTTP $BACKEND_STATUS)"
else
echo "✗ 異常 (HTTP $BACKEND_STATUS)"
fi
# 檢查前端
echo -n "前端服務: "
FRONTEND_STATUS=$(curl -s -o /dev/null -w "%{http_code}" $NGINX_URL)
if [ "$FRONTEND_STATUS" = "200" ]; then
echo "✓ 正常 (HTTP $FRONTEND_STATUS)"
else
echo "✗ 異常 (HTTP $FRONTEND_STATUS)"
fi
# 檢查資料庫連線(透過健康檢查端點)
echo -n "資料庫連線: "
DB_STATUS=$(curl -s $API_URL | grep -o '"db":{"status":"[^"]*"' | grep -o 'UP\|DOWN')
if [ "$DB_STATUS" = "UP" ]; then
echo "✓ 正常"
else
echo "✗ 異常"
fi
echo ""
echo "=== 檢查完成 ==="
日誌管理
日誌檔案位置
| 服務 | 日誌位置 |
|---|---|
| app-server | /opt/appfuse/logs/app-server.log |
| Nginx access | /var/log/nginx/access.log |
| Nginx error | /var/log/nginx/error.log |
| Tomcat | $CATALINA_HOME/logs/catalina.out |
日誌輪轉配置
應用程式日誌
建立 /etc/logrotate.d/appfuse:
/opt/appfuse/logs/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 0640 appmgr appmgr
dateext
dateformat .%Y-%m-%d
}
Tomcat 日誌
建立 /etc/logrotate.d/tomcat:
/home/appmgr/opt/apache-tomcat-*/logs/catalina.out {
copytruncate
daily
dateext
dateformat .%Y-%m-%d
rotate 90
compress
delaycompress
missingok
}
測試與啟用
# 測試配置(dry-run)
sudo logrotate -d /etc/logrotate.d/appfuse
sudo logrotate -d /etc/logrotate.d/tomcat
# 手動執行輪轉
sudo logrotate -f /etc/logrotate.d/appfuse
sudo logrotate -f /etc/logrotate.d/tomcat
設定排程(選用)
如果系統未自動執行 logrotate,可手動加入 crontab:
sudo crontab -e
加入:
0 0 * * * /usr/sbin/logrotate /etc/logrotate.d/tomcat >/dev/null 2>&1
效能監控
JVM 監控
# 查看 JVM 記憶體使用
curl http://localhost:8080/actuator/metrics/jvm.memory.used
curl http://localhost:8080/actuator/metrics/jvm.memory.max
# 查看 GC 統計
curl http://localhost:8080/actuator/metrics/jvm.gc.pause
# 查看執行緒
curl http://localhost:8080/actuator/metrics/jvm.threads.live
系統監控
# CPU 和記憶體
top -p $(pgrep -f app-server.jar)
# 磁碟使用
df -h /opt/appfuse
# 網路連線
netstat -tlnp | grep -E '8080|80|443'
備份與還原
備份策略
備份項目說明
| 項目 | 路徑 | 備份頻率 | 保留期限 |
|---|---|---|---|
| 資料庫 | MySQL/PostgreSQL | 每日 | 30 天 |
| 應用程式配置 | /opt/appfuse/conf/ | 每次變更 | 永久 |
| 上傳檔案 | /opt/appfuse/data/ | 每日 | 90 天 |
| 日誌檔案 | /opt/appfuse/logs/ | 每月封存 | 12 個月 |
資料庫備份
MySQL
# 完整備份
mysqldump -u root -p --single-transaction --routines --triggers appdb > backup-$(date +%Y%m%d).sql
# 壓縮備份
mysqldump -u root -p --single-transaction appdb | gzip > backup-$(date +%Y%m%d).sql.gz
# 自動備份腳本
#!/bin/bash
BACKUP_DIR=/opt/appfuse/backup/db
DATE=$(date +%Y%m%d)
mysqldump -u backup_user -p'password' --single-transaction appdb | gzip > $BACKUP_DIR/appdb-$DATE.sql.gz
# 保留最近 30 天
find $BACKUP_DIR -name "*.sql.gz" -mtime +30 -delete
PostgreSQL
# 完整備份
pg_dump -U postgres -F c appdb > backup-$(date +%Y%m%d).dump
# 壓縮備份
pg_dump -U postgres appdb | gzip > backup-$(date +%Y%m%d).sql.gz
SQL Server
-- 備份資料庫
-- 注意:備份目錄必須是 mssql 使用者有權限存取的目錄
BACKUP DATABASE appdb TO DISK = '/var/opt/mssql/backup/appdb-20240101.bak';
-- 備份並壓縮
BACKUP DATABASE appdb TO DISK = '/var/opt/mssql/backup/appdb-20240101.bak'
WITH COMPRESSION;
資料庫還原
MySQL
# 從 SQL 檔案還原
mysql -u root -p appdb < backup-20240101.sql
# 從壓縮檔還原
gunzip < backup-20240101.sql.gz | mysql -u root -p appdb
PostgreSQL
# 從 dump 檔案還原
pg_restore -U postgres -d appdb backup-20240101.dump
# 從 SQL 檔案還原
psql -U postgres -d appdb < backup-20240101.sql
SQL Server
-- 還原資料庫
RESTORE DATABASE appdb
FROM DISK = '/var/opt/mssql/backup/appdb-20240101.bak'
WITH REPLACE;
GO
-- 查看備份檔案內容
RESTORE FILELISTONLY FROM DISK = '/var/opt/mssql/backup/appdb-20240101.bak';
GO
檔案備份
#!/bin/bash
# backup-files.sh
BACKUP_DIR=/opt/appfuse/backup
DATE=$(date +%Y%m%d)
# 備份配置檔
tar -czf $BACKUP_DIR/conf-$DATE.tar.gz /opt/appfuse/conf/
# 備份上傳檔案
tar -czf $BACKUP_DIR/data-$DATE.tar.gz /opt/appfuse/data/
# 清理舊備份
find $BACKUP_DIR -name "conf-*.tar.gz" -mtime +90 -delete
find $BACKUP_DIR -name "data-*.tar.gz" -mtime +90 -delete
自動備份排程
編輯 crontab:
sudo crontab -e
加入排程:
# 每日凌晨 2 點備份資料庫
0 2 * * * /opt/appfuse/bin/backup-db.sh >> /opt/appfuse/logs/backup.log 2>&1
# 每日凌晨 3 點備份檔案
0 3 * * * /opt/appfuse/bin/backup-files.sh >> /opt/appfuse/logs/backup.log 2>&1
# 每日執行日誌輪轉
0 0 * * * /usr/sbin/logrotate /etc/logrotate.d/appfuse
更新升級
更新流程
後端更新
# 1. 備份現有版本
cp $CATALINA_HOME/webapps/app-server.war /opt/appfuse/backup/app-server-$(date +%Y%m%d).war
# 2. 停止服務
sudo systemctl stop appfuse.service
# 3. 部署新版本
cp new-app-server.war $CATALINA_HOME/webapps/app-server.war
# 4. 啟動服務
sudo systemctl start appfuse.service
# 5. 驗證
curl http://localhost:8080/app-server/actuator/health
前端更新
# 1. 備份現有版本
cp $CATALINA_HOME/webapps/app-web-host.war /opt/appfuse/backup/app-web-host-$(date +%Y%m%d).war
# 2. 停止服務
sudo systemctl stop appfuse.service
# 3. 部署新版本
cp new-app-web-host.war $CATALINA_HOME/webapps/app-web-host.war
# 4. 啟動服務
sudo systemctl start appfuse.service
# 5. 驗證
curl http://localhost/app-web/
回滾程序
# 後端回滾
sudo systemctl stop appfuse.service
cp /opt/appfuse/backup/app-server-YYYYMMDD.war $CATALINA_HOME/webapps/app-server.war
sudo systemctl start appfuse.service
# 前端回滾
sudo systemctl stop appfuse.service
cp /opt/appfuse/backup/app-web-host-YYYYMMDD.war $CATALINA_HOME/webapps/app-web-host.war
sudo systemctl start appfuse.service
# 資料庫回滾
mysql -u root -p appdb < /opt/appfuse/backup/db/appdb-YYYYMMDD.sql
維運檢查清單
每日檢查
- 檢查服務健康狀態
- 檢查磁碟空間
- 檢視錯誤日誌
- 確認備份完成
每週檢查
- 檢視效能指標趨勢
- 檢查安全更新
- 清理暫存檔案
- 驗證備份可還原
每月檢查
- 檢視系統資源使用趨勢
- 評估擴展需求
- 更新文件
- 測試災難復原程序
下一步
遇到問題時,請參閱 故障排除。