温馨提示×

怎样用Apache2监控服务器状态

小樊
54
2025-11-23 08:29:52
栏目: 云计算

用 Apache2 内置模块监控服务器状态

一 启用并配置 mod_status

  • 启用模块
    • Ubuntu/Debian:执行命令:sudo a2enmod status,然后 sudo systemctl restart apache2
  • 配置访问控制
    • 编辑文件:/etc/apache2/mods-enabled/status.conf(或同目录下的 status 配置文件),建议仅允许受控来源访问:
      <Location "/server-status">
          SetHandler server-status
          Require local
          Require ip 203.0.113.10 198.51.100.20
      </Location>
      
    • 如需更细粒度,可改为仅本地或内网网段访问。
  • 开启扩展状态(可选,获取每个进程的详细信息)
    • 在对应的配置块或全局配置中加入:ExtendedStatus On
  • 重启生效:sudo systemctl restart apache2

二 访问状态页面与解读

  • 访问方式
    • 浏览器打开:http://服务器IP或域名/server-status
    • 机器可读输出:http://服务器IP或域名/server-status?auto(便于脚本采集)。
    • 自动刷新:在页面 URL 后追加 ?refresh=N(N 为秒数,例如 ?refresh=5)。
  • 页面关键信息
    • 当前活动连接数空闲/忙碌工作进程数每分钟请求数总字节数每个进程的 PID/CPU 时间/已运行时间等;启用 ExtendedStatus 后可见更细的进程级明细。

三 安全与排错要点

  • 访问控制
    • 生产环境务必限制来源 IP,优先使用 Require local 或内网白名单;避免对公网开放 /server-status
  • 与前端重写规则共存
    • 若站点启用 mod_rewrite(如 WordPress 固定链接),需在 .htaccess 中对 /server-status 做排除,否则会被重写为前端路由导致 404
      RewriteEngine On
      RewriteBase /
      RewriteRule ^server-status$ - [L]
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule . /index.php [L]
      
  • 服务与日志
    • 快速查看运行状态:sudo systemctl status apache2
    • 实时查看错误日志:sudo tail -f /var/log/apache2/error.log(Debian/Ubuntu 常见路径;CentOS/RHEL 多为 /var/log/httpd/error_log)。

四 进阶 外部监控与告警

  • 采集与可视化
    • 使用 Zabbix/server-status?auto 做 HTTP 采集与阈值告警,适合长期可视化与通知。
    • 使用 ApacheTop 做命令行实时观察(无内置告警,可与监控系统集成)。
  • 自定义脚本监控
    • 以 Python 定期检查 /server-status?auto,当返回码异常或关键指标超阈值时通过 SMTP 发送邮件告警(示例脚本思路见下述代码框架)。
    • 示例脚本框架(需安装 requests):
      import requests, time, smtplib
      from email.mime.text import MIMEText
      
      URL = "http://localhost/server-status?auto"
      SMTP = ("smtp.example.com", 587)
      CRED = ("you@example.com", "password")
      FROM, TO = "you@example.com", "ops@example.com"
      
      def alert(subj, msg):
          m = MIMEText(msg)
          m["Subject"], m["From"], m["To"] = subj, FROM, TO
          with smtplib.SMTP(*SMTP) as s:
              s.starttls()
              s.login(*CRED)
              s.sendmail(FROM, [TO], m.as_string())
      
      while True:
          try:
              r = requests.get(URL, timeout=5)
              if r.status_code != 200:
                  alert("Apache状态页异常", f"HTTP {r.status_code}\n{r.text[:200]}")
          except Exception as e:
              alert("Apache状态页不可达", str(e))
          time.sleep(60)
      

0