backup.sh 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #!/usr/bin/env bash
  2. # 功能:备份 nginx 日志到 backup 目录
  3. SVC_DIR=/home/jsproxy/server
  4. LOG_DIR=$SVC_DIR/nginx/logs
  5. LOG_FILE=$LOG_DIR/proxy.log
  6. LOG_SIZE=$(( 32 * 1024 * 1024 ))
  7. ERR_FILE=$LOG_DIR/error.log
  8. ERR_SIZE=$(( 1 * 1024 * 1024 * 1024 ))
  9. # error.log 达到 ERR_SIZE,开始备份(目前只清理)
  10. errsize=$(stat --printf=%s $ERR_FILE)
  11. if (( $errsize >= $ERR_SIZE )); then
  12. echo > $ERR_FILE
  13. fi
  14. # proxy.log 达到 LOG_SIZE,开始备份
  15. logsize=$(stat --printf=%s $LOG_FILE)
  16. if (( $logsize < $LOG_SIZE )); then
  17. exit
  18. fi
  19. logtime=$(date "+%Y-%m-%d-%H-%M-%S")
  20. logfile=$SVC_DIR/log-svc/backup/$logtime.log
  21. #
  22. # 先移走日志文件,然后创建新的日志文件,通知 nginx 重新打开
  23. # https://www.nginx.com/resources/wiki/start/topics/examples/logrotation/
  24. #
  25. mv $LOG_FILE $logfile
  26. touch $LOG_FILE
  27. kill -USR1 $(< $LOG_DIR/nginx.pid)
  28. sleep 1
  29. #
  30. # 日志压缩
  31. # 根据实际情况调整策略,在不影响系统的前提下,充分利用剩余 CPU
  32. # 可尝试其他工具(例如 7z),在开销和效果之间找一个平衡点
  33. #
  34. echo "compress $logtime ($logsize bytes)"
  35. if (( $logsize > 100 * 1024 * 1024 )); then
  36. # 日志较大,使用快速压缩
  37. nice -n 19 \
  38. gzip $logfile
  39. else
  40. # 日志不大,使用高强度压缩
  41. nice -n 19 \
  42. ~/tools/brotli $logfile --rm
  43. fi
  44. echo "done"