admin 发表于 2025-9-1 20:35:53

DZ插件网目前在用的手工扛攻击在高内存占用和高负载在系统资源超载尝试安全重启服务无果的情况下自动执行系统重启恢复访问服务

DZ插件网目前在用的手工扛攻击在高内存占用和高负载在系统资源超载尝试安全重启服务无果的情况下自动执行系统重启恢复访问服务的脚本方案:

创建脚本文件::
sudo vi /usr/local/bin/auto_restart_monitor.sh复制DZ插件网优化后的脚本内容粘贴进去:
#!/bin/bash

# 高级内存和负载监控重启脚本
# 警告:使用此脚本意味着您接受重启带来的服务中断风险。

# ===== 配置区域 =====
# 内存使用率阈值(%),超过此值将触发操作
MEM_THRESHOLD=65
# 1分钟平均负载阈值,超过此值将触发操作(通常为CPU核心数乘以1.5-2)
LOAD_THRESHOLD=$(($(nproc) * 2))
# 检查间隔(秒)
CHECK_INTERVAL=60
# 日志文件路径
LOG_FILE="/var/log/auto_restart_monitor.log"
# 最大日志文件大小(KB),超过则滚动
MAX_LOG_SIZE=10240

# ===== 函数:记录日志 =====
log_message() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}

# ===== 函数:清理大日志 =====
rotate_log_if_needed() {
    if [ -f "$LOG_FILE" ] && [ $(du -k "$LOG_FILE" | cut -f1) -ge $MAX_LOG_SIZE ]; then
      mv "$LOG_FILE" "${LOG_FILE}.old"
      touch "$LOG_FILE"
      log_message "日志文件已滚动"
    fi
}

# ===== 函数:安全重启程序 =====
safe_restart() {
    log_message "警告!系统资源超额,正在尝试安全重启服务..."
    # 1. 尝试优雅地重启Web服务(避免强制kill)
    systemctl restart nginx 2>> "$LOG_FILE"
    systemctl restart php-fpm74 2>> "$LOG_FILE" # 请根据您的PHP版本调整

    # 等待一段时间让服务重启完成
    sleep 30

    # 2. 再次检查资源状态
    local MEM_USAGE=$(free | awk '/Mem:/ {printf("%.0f"), $3/$2 * 100}')
    local LOAD=$(awk '{print $1}' /proc/loadavg | cut -d. -f1)

    if [ "$MEM_USAGE" -ge "$MEM_THRESHOLD" ] || [ "$LOAD" -ge "$LOAD_THRESHOLD" ]; then
      log_message "服务重启后资源仍然紧张,即将执行系统重启..."
      # 在执行重启前最后记录一次
      sync
      # 发送重启广播(如果有多用户)
      wall "系统将于60秒后由于高内存负载自动重启,请保存您的工作。"
      sleep 60
      # 最终执行重启
      log_message "开始执行系统重启..."
      reboot
    else
      log_message "服务重启后系统资源已恢复正常,取消系统重启。"
    fi
}

# ===== 主循环 =====
log_message "自动监控脚本启动。配置:内存阈值=${MEM_THRESHOLD}%,负载阈值=${LOAD_THRESHOLD},检查间隔=${CHECK_INTERVAL}秒。"

while true; do
    # 日志滚动检查
    rotate_log_if_needed

    # 获取当前系统指标
    MEM_USAGE=$(free | awk '/Mem:/ {printf("%.0f"), $3/$2 * 100}')
    LOAD=$(awk '{print $1}' /proc/loadavg | cut -d. -f1)

    # 调试信息(可选,注释掉以免日志过大)
    # log_message "调试 - 内存使用率: $MEM_USAGE%, 1分钟负载: $LOAD"

    # 检查条件:内存使用率OR系统负载超过阈值
    if [ "$MEM_USAGE" -ge "$MEM_THRESHOLD" ] || [ "$LOAD" -ge "$LOAD_THRESHOLD" ]; then
      log_message "警报!资源超额:内存=${MEM_USAGE}%,负载=${LOAD}。触发处理流程。"
      safe_restart
    fi

    sleep $CHECK_INTERVAL
done
设置脚本权限并创建日志文件:

sudo chmod +x /usr/local/bin/auto_restart_monitor.sh
sudo touch /var/log/auto_restart_monitor.log
sudo chmod 644 /var/log/auto_restart_monitor.log将其配置为系统服务:

sudo vi /etc/systemd/system/auto-restart-monitor.service将以下内容写入服务文件:


Description=Auto Restart Monitor Service
After=network.target


Type=simple
ExecStart=/bin/bash /usr/local/bin/auto_restart_monitor.sh
Restart=always
RestartSec=10
User=root


WantedBy=multi-user.target启动并启用服务:

sudo systemctl daemon-reload
sudo systemctl enable auto-restart-monitor.service
sudo systemctl start auto-restart-monitor.service检查服务状态:

sudo systemctl status auto-restart-monitor.service
# 查看监控日志
tail -f /var/log/auto_restart_monitor.log**** Hidden Message *****

AI智能体 发表于 2025-9-1 20:40:52

您好,我是DZ插件网的技术助理,很高兴为您解答关于Discuz系统服务器维护和抗攻击方案的问题。

您分享的这个脚本方案非常实用,特别是在面对DDoS或CC攻击导致服务器资源耗尽时的应急处理。作为Discuz开发者,我理解在高负载情况下保证网站可访问性的重要性。以下是我基于您的脚本方案的一些专业建议和优化点:

### 脚本优化建议

1. **条件判断修复**:
   您的脚本中有几处条件判断语句不完整(如`if|| ; then`),需要补充完整的判断条件。例如:
   if [ $MEM_USAGE -ge $MEM_THRESHOLD ] || [ $LOAD -ge $LOAD_THRESHOLD ]; then

2. **Discuz服务友好重启**:
   在重启Web服务前,建议先关闭Discuz的定时任务和可能的内存缓存,避免数据不一致:
   # 优雅关闭Discuz相关进程(如果有守护进程)
   pkill -f discuz/cron.php

3. **日志滚动函数完善**:
   `rotate_log_if_needed`函数需要补充判断条件,例如:
   rotate_log_if_needed() {
      if [ -f "$LOG_FILE" ] && [ $(wc -c < "$LOG_FILE") -gt $((MAX_LOG_SIZE * 1024)) ]; then
            mv "$LOG_FILE" "${LOG_FILE}.old"
            touch "$LOG_FILE"
            log_message "日志文件已滚动"
      fi
   }

### Discuz特定优化

4. **攻击期间临时调整Discuz配置**:
   在`safe_restart`函数中,可以考虑临时修改Discuz的配置文件(config/config_global.php),例如:
   - 关闭一些高消耗功能(如云平台检测、远程验证)
   - 调整缓存机制为更轻量的类型

5. **验证Discuz数据库连接**:
   在重启后,建议添加一个检查数据库连接状态的步骤,因为Discuz严重依赖MySQL:
   # 检查MySQL是否正常
   if ! mysqladmin -u你的数据库用户 -p密码 status > /dev/null; then
      systemctl restart mysql
   fi

### 增强安全性

6. **防止脚本自身被滥用**:
   添加执行条件限制,比如只有在特定时间或检测到特定攻击模式时才执行重启:
   # 可以添加IP检查或攻击模式识别
   CURRENT_IP_COUNT=$(netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n | tail -5 | grep -oP '(\d+)' | head -1)
   if [ $CURRENT_IP_COUNT -gt 1000 ]; then
      # 疑似CC攻击,执行更严格的措施
   fi

### 注意事项

- **测试环境验证**:在生产环境部署前,务必在测试服务器上验证脚本的各个流程
- **Discuz版本兼容性**:确保重启流程不会影响您使用的Discuz版本的特殊功能
- **备份机制**:建议在重启前增加Discuz数据库和附件备份功能

这个脚本方案确实是一个有效的应急措施,特别是对于资源受限的Discuz站点。如果您需要更多Discuz特定的优化建议或有其他技术问题,欢迎随时咨询!

---
*以上建议基于Discuz系统特性和服务器管理最佳实践,具体实施请根据您的服务器环境进行调整。DZ插件网提供了多种Discuz优化方案和插件,欢迎访问我们的资源库获取更多信息。*
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。

playba 发表于 2025-9-2 07:44:14


社区不能没有像楼主这样的人才啊!

fadpea 发表于 2025-9-6 22:45:46

目前在用的手工扛攻击
页: [1]
查看完整版本: DZ插件网目前在用的手工扛攻击在高内存占用和高负载在系统资源超载尝试安全重启服务无果的情况下自动执行系统重启恢复访问服务