服务器过载时的 Apache2 状态

服务器过载时的 Apache2 状态

当 apache2 过载时,如何检查其状态?即当它不响应 HTTP 请求时?

apache2ctl status基本上是wget状态页面上的。我需要一些可以在命令行中工作而无需请求该页面的东西。

答案1

我知道有两种方法可能会对你有用:

1)mod_backdoor 指定了一个特殊的线程和监听套接字,允许您在所有正常线程都被占用时点击/server-status(应该可以在网络搜索中轻松找到它)

http://people.apache.org/~trawick/mod_backdoor.txt http://people.apache.org/~trawick/mod_backdoor.c

2)如果您允许 perl 使用磁盘上的记分牌(ScoreBoardFile),那么 perl 可以解析 apache 记分牌

http://search.cpan.org/~opi/Apache2-ScoreBoardFile-0.01/lib/Apache2/ScoreBoardFile.pm

答案2

这是拥有适当的监控系统可以带来回报的案例之一。它会收集一段时间内的所有统计数据,即使服务中断,也会显示最新的已知统计数据。更不用说当您的资源池开始变空时,您可以收到警报,这样您就可以在服务中断之前采取行动。

当牛奶已经洒在地板上时,我想 r_3 建议的是一个相当不错的解决方案。

答案3

安装适当的监控系统,或者使用 bash:

#!/bin/bash
# WTF APACHE???
# cpu count
CPU=$(cat /proc/cpuinfo | grep "^processor" | wc -l)
# load average count
LOAD_5=$(cat /proc/loadavg | awk '{print $2}')
LOAD_AVERAGE_5=$(($(echo ${LOAD_5} | awk '{print 100 * $1}') / ${CPU}))
# Red Alert : 85% high load 5 min
# send some mail with status
if [ ${LOAD_AVERAGE_5} -ge 85 ] ; then
        httpd status > /tmp/apache_status.log
        mail -s "APACHE STATUS" [email protected] < /tmp/apache_status.log
        service httpd stop
    else [ ${LOAD_AVERAGE_5} -le 50 ] ; then
        if ps aux | grep [h]ttpd; then echo 'OK'; else service httpd start; fi
fi

答案4

有趣的问题,但我确信你不能。一种解决方法可能是终止一些 apache 线程,并确保您是第一个连接到新生成的进程以显示 apache 状态的人。

编辑:是的,让我们玩一下 bash

以下步骤通过拉动 Apache 服务器状态页面的记分牌并让您定义何时做出反应来实现。

为此,请使用 _f_custom() 函数。我已构建了两个示例:

  1. 如果发送回复模式中有超过 150 个进程,您将收到一封电子邮件
  2. 如果空位少于 20 个,也请发送电子邮件。

`

#!/bin/bash
_sleep="5"

_f_getfullstatus() {
    curl $_uri 2> /dev/null
}

_f_mailto() {
    ( echo -e "To:$1\nFrom:$1\nSubject:${2}:\n\n${3} ${4}" ; _f_getfullstatus ) | sendmail -t
}

_f_custom() {
    case "$1" in
            _)
            ;;
            S)
            ;;
            W)
            if [[ $2 -gt 150 ]] ; then _f_mailto $_email "Houson, we've got a problem" "Currently there are $2 processes in "sending reply" mode" ; fi
            ;;
            K)
            ;;
            D)
            ;;
            L)
            ;;
            G)
            ;;
            I)
            ;;
            .)
            if [[ $2 -lt 20 ]] ; then _f_mailto $_email "Running out of open slots" "there are only $2 available atm" ; fi
            ;;
    esac
}

_f_count() {
    for _status in _ S R W K D C L G I \.
            do
            _counter=$(echo $_auto_output | sed "s/[^$_status]//g" | wc -m)
            if [[ $_verbose == "yes" ]] ; then
                    echo -n "Status of key ${_status}:" 
                    echo $_counter
            fi
            _f_custom $_status $_counter
    done
}

while [[ $# > 0 ]] ; do
    _opt="$1"
    case $_opt in
            -u)
            shift
            _uri="$1"
            ;;
            -m)
            shift
            _email="$1"
            ;;
            -s)
            shift
            _sleep="$1"
            ;;
            -D)
            _daemon="yes"
            ;;
            -v)
            _verbose="yes"
            ;;
    esac
    shift
done

_auto_output=$(curl ${_uri}?auto 2> /dev/null | tail -1 | sed 's/Scoreboard: //g')

if [[ $_daemon == "yes" ]] ; then
    while true ; do
            _f_count
            sleep $_sleep
    done
else
    _f_count
fi

这需要sendmail并且curl$PATH

因为 --help 未实现:

-u: URI to server-status page -m: sets a emailaddress to send your errors to -v: let it run verbosly -D: let it run in w while true loop (daemonize) -s: interval in seconds between status requests

相关内容