- itsm/ -> workspace/guardia-itsm/ - manager/ -> workspace/guardia-manager/ - app/ -> workspace/guardia-messenger/ - manual/ -> workspace/guardia-docs/ workspace/zioinfo-web/ unchanged. git mv preserves full commit history. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
134 lines
5.9 KiB
Bash
134 lines
5.9 KiB
Bash
#!/bin/bash
|
|
# ============================================================
|
|
# GUARDiA SM | web_apache_sm.sh
|
|
# 대상: Apache HTTP Server (httpd)
|
|
# 파라미터: APACHE_PORT=80 APACHE_SSL_PORT=443 APACHE_CTL=apachectl
|
|
# APACHE_CONF=/etc/httpd/conf/httpd.conf CHECK_URL=http://localhost
|
|
# ============================================================
|
|
set -euo pipefail
|
|
APACHE_PORT=${APACHE_PORT:-80}
|
|
APACHE_SSL_PORT=${APACHE_SSL_PORT:-443}
|
|
APACHE_CTL=${APACHE_CTL:-$(command -v apachectl 2>/dev/null || echo "apachectl")}
|
|
APACHE_CONF=${APACHE_CONF:-/etc/httpd/conf/httpd.conf}
|
|
CHECK_URL=${CHECK_URL:-"http://localhost"}
|
|
OK="[OK]"; WARN="[WARN]"; CRIT="[CRIT]"
|
|
SEP="─────────────────────────────────────────"
|
|
RESULT=0
|
|
|
|
echo "======================================================"
|
|
echo " GUARDiA SM 점검 | Apache HTTP Server | $(hostname -s)"
|
|
echo " 점검 시각: $(date '+%Y-%m-%d %H:%M:%S %Z')"
|
|
echo "======================================================"
|
|
|
|
# ── 1. 프로세스 상태 ──────────────────────────────────────
|
|
echo; echo "[$SEP] 1. 프로세스 상태"
|
|
PROC_COUNT=$(pgrep -c "httpd|apache2" 2>/dev/null || echo 0)
|
|
if [ "$PROC_COUNT" -gt 0 ]; then
|
|
echo " ${OK} Apache 프로세스 실행 중 (${PROC_COUNT}개)"
|
|
ps aux | grep -E "httpd|apache2" | grep -v grep | awk \
|
|
'{printf " PID:%-8s CPU:%-6s MEM:%-6s CMD:%s\n",$2,$3,$4,substr($0,index($0,$11))}' | head -5
|
|
else
|
|
echo " ${CRIT} Apache 프로세스 없음"
|
|
RESULT=2
|
|
fi
|
|
|
|
# ── 2. 포트 리스닝 ───────────────────────────────────────
|
|
echo; echo "[$SEP] 2. 포트 리스닝"
|
|
for PORT in $APACHE_PORT $APACHE_SSL_PORT; do
|
|
if ss -tlnp 2>/dev/null | grep -q ":${PORT} " || \
|
|
netstat -tlnp 2>/dev/null | grep -q ":${PORT} "; then
|
|
echo " ${OK} 포트 ${PORT} LISTEN 중"
|
|
else
|
|
echo " ${WARN} 포트 ${PORT} LISTEN 없음"
|
|
[ $RESULT -lt 1 ] && RESULT=1
|
|
fi
|
|
done
|
|
|
|
# ── 3. 설정 파일 문법 검사 ────────────────────────────────
|
|
echo; echo "[$SEP] 3. 설정 파일 검사"
|
|
if command -v "$APACHE_CTL" &>/dev/null; then
|
|
SYNTAX=$($APACHE_CTL -t 2>&1 || true)
|
|
if echo "$SYNTAX" | grep -qi "Syntax OK"; then
|
|
echo " ${OK} 설정 문법 정상"
|
|
else
|
|
echo " ${CRIT} 설정 문법 오류:"
|
|
echo "$SYNTAX" | tail -5 | sed 's/^/ /'
|
|
RESULT=2
|
|
fi
|
|
else
|
|
echo " ${WARN} apachectl 을 찾을 수 없음 (경로: $APACHE_CTL)"
|
|
[ $RESULT -lt 1 ] && RESULT=1
|
|
fi
|
|
|
|
# ── 4. HTTP 응답 코드 점검 ────────────────────────────────
|
|
echo; echo "[$SEP] 4. HTTP 응답 점검"
|
|
if command -v curl &>/dev/null; then
|
|
HTTP_CODE=$(curl -sk -o /dev/null -w "%{http_code}" \
|
|
--max-time 5 --connect-timeout 3 "${CHECK_URL}" 2>/dev/null || echo "ERR")
|
|
RESP_TIME=$(curl -sk -o /dev/null -w "%{time_total}" \
|
|
--max-time 5 --connect-timeout 3 "${CHECK_URL}" 2>/dev/null || echo "N/A")
|
|
if echo "$HTTP_CODE" | grep -qE "^[23]"; then
|
|
echo " ${OK} HTTP ${HTTP_CODE} — 응답시간 ${RESP_TIME}s (${CHECK_URL})"
|
|
elif [ "$HTTP_CODE" = "ERR" ]; then
|
|
echo " ${CRIT} HTTP 연결 실패 (${CHECK_URL})"
|
|
RESULT=2
|
|
else
|
|
echo " ${WARN} HTTP ${HTTP_CODE} (${CHECK_URL})"
|
|
[ $RESULT -lt 1 ] && RESULT=1
|
|
fi
|
|
else
|
|
echo " ${WARN} curl 없음 — HTTP 응답 점검 건너뜀"
|
|
[ $RESULT -lt 1 ] && RESULT=1
|
|
fi
|
|
|
|
# ── 5. 로드된 모듈 목록 ──────────────────────────────────
|
|
echo; echo "[$SEP] 5. 주요 모듈 상태"
|
|
if command -v "$APACHE_CTL" &>/dev/null; then
|
|
MODULES=$($APACHE_CTL -M 2>/dev/null || true)
|
|
for MOD in ssl rewrite proxy proxy_http headers expires deflate; do
|
|
if echo "$MODULES" | grep -qi "${MOD}_module"; then
|
|
echo " ${OK} mod_${MOD} 로드됨"
|
|
else
|
|
echo " ${WARN} mod_${MOD} 미로드"
|
|
fi
|
|
done
|
|
fi
|
|
|
|
# ── 6. 최근 에러 로그 ─────────────────────────────────────
|
|
echo; echo "[$SEP] 6. 최근 에러 로그 (마지막 10줄)"
|
|
ERR_LOG=""
|
|
for P in /var/log/httpd/error_log /var/log/apache2/error.log /usr/local/apache2/logs/error_log; do
|
|
[ -r "$P" ] && { ERR_LOG="$P"; break; }
|
|
done
|
|
if [ -n "$ERR_LOG" ]; then
|
|
ERRS=$(tail -20 "$ERR_LOG" 2>/dev/null | grep -iE "\[error\]|\[crit\]|\[alert\]|\[emerg\]" | tail -10 || true)
|
|
if [ -n "$ERRS" ]; then
|
|
echo " ${WARN} 최근 오류 감지:"
|
|
echo "$ERRS" | sed 's/^/ /'
|
|
[ $RESULT -lt 1 ] && RESULT=1
|
|
else
|
|
echo " ${OK} 최근 오류 없음 (${ERR_LOG})"
|
|
fi
|
|
else
|
|
echo " ${WARN} 에러 로그 파일을 찾을 수 없음"
|
|
fi
|
|
|
|
# ── 7. 연결 수 ────────────────────────────────────────────
|
|
echo; echo "[$SEP] 7. 연결 통계"
|
|
CONN=$(ss -tnp 2>/dev/null | grep -E ":${APACHE_PORT}|:${APACHE_SSL_PORT}" | wc -l || echo 0)
|
|
ESTAB=$(ss -tnp 2>/dev/null | grep -E ":${APACHE_PORT}|:${APACHE_SSL_PORT}" | grep ESTAB | wc -l || echo 0)
|
|
echo " 전체 연결 수 : ${CONN}"
|
|
echo " ESTABLISHED : ${ESTAB}"
|
|
|
|
# ── 요약 ─────────────────────────────────────────────────
|
|
echo
|
|
echo "======================================================"
|
|
case $RESULT in
|
|
0) echo " 최종 결과: ${OK} Apache 정상" ;;
|
|
1) echo " 최종 결과: ${WARN} 주의 항목 있음" ;;
|
|
2) echo " 최종 결과: ${CRIT} 즉시 조치 필요" ;;
|
|
esac
|
|
echo " 점검 완료: $(date '+%Y-%m-%d %H:%M:%S')"
|
|
echo "======================================================"
|
|
exit $RESULT
|