Apache运维巡检脚本需聚焦真实风险,结构分初始化、检测函数、输出聚合三块,用原生命令检查服务状态、端口合规、配置语法、日志异常及信息泄露,定时执行并记录日志。
编写规范的 Apache 运维巡检与管理脚本,关键在于聚焦真实风险、结构清晰、可读可维护、低干扰运行。不堆砌功能,不依赖外部工具链,用原生命令组合实现精准检查和安全响应。
Apache 巡检不是“扫全端口”,而是盯住几个高危面:
systemctl is-active apache2(Ubuntu)或 systemctl is-active httpd(CentOS)确认服务活跃;再通过 ps aux | grep -v grep | grep apache 检查主进程数是否异常(如突增数十个空闲 worker)ss -tuln | grep ':80|:443',验证仅监听业务端口;若发现 :8080、:8000 等非标准端口,进一步用 lsof -i :8080 查启动用户和路径,排除未授权实例apache2ctl configtest 或 httpd -t 验证语法;检查 /etc/apache2/apache2.conf 或 /etc/httpd/conf/httpd.conf 的修改时间:stat -c "%y %n" /etc/apache2/apache2.conf,近24小时内的非计划变更需告警/var/log/apache2/error.log(Ubuntu)或 /var/log/httpd/error_log(CentOS)中最近1小时的 Permission denied、Segmentation fault、Invalid argument 行数,超5条即标记风险ServerSignature 和 ServerTokens 是否已关闭(应在配置中为 Off 和 Prod),用 grep -E "^(ServerSignature|ServerTokens)" /etc/apache2/apache2.conf 2>/dev/null || echo "not found" 快速定位一个可交付的脚本应分三块,函数化封装,避免重复逻辑:
APACHE_CONF="/etc/apache2/apache2.conf"、ERROR_LOG="/var/log/apache2/error.log"、WHITELIST_PORTS="80 443",便于不同环境复用check_apache_running() 返回 0/1;check_config_syntax() 执行 apache2ctl configtest &>/dev/null 并判断退出码/tmp/apache-check-$(date +%s).log);仅当任一检测失败时,才打印摘要+详情,避免正常运行时刷屏脚本价值取决于能否稳定嵌入运维节奏:
/usr/local/bin/apache-check.sh,加执行权限:chmod +x /usr/local/bin/apache-check.sh
0 */2 * * * /usr/local/bin/apache-check.sh >> /var/log/apache-check.log 2>&1
logrotate,配置示例:/var/log/apache-check.log { daily rotate 7 compress missingok }
echo "Apache config test FAILED on $(hostname)" | mail -s "ALERT: Apache Config Error" [email protected]
以下为精简但完整的框架,适配 Ubuntu/Debian(CentOS 只需替换路径与命令名):
#!/bin/bashLOG_FILE="/var/log/apache-check.log"
APACHE_CONF="/etc/apache2/apache2.conf"
ERROR_LOG="/var/log/apache2/error.log"
check_running() { systemctl is-active --quiet apache2 && return 0 || return 1; }
check_ports() { ss -tuln | awk '$5 ~ /:80$|:443$/ {print $5}' | wc -l | grep -q "^2$" && return 0 || return 1; }
check_config() { apache2ctl configtest &>/dev/null && return 0 || return 1; }
echo "=== $(date) ===" >> "$LOG_FILE"
check_running && echo "[OK] Apache service running" || echo "[FAIL] Apache service down" >> "$LOG_FILE"
check_ports && echo "[OK] Only 80/443 listening" || echo "[WARN] Unexpected port in use" >> "$LOG_FILE"
check_config && echo "[OK] Config syntax valid" || echo "[FAIL] Config syntax error" >> "$LOG_FILE"
echo "" >> "$LOG_FILE"