Files
vps_setup/auto_restart_apache.sh
T
2026-06-01 10:42:44 +07:00

201 lines
6.7 KiB
Bash

#!/bin/bash
# --- CẤU HÌNH TELEGRAM ---
TELEGRAM_TOKEN="5550493421:AAGepCf4ilO9pFHI1Ie4AvzfQk8TiajQCCw"
TELEGRAM_CHAT_ID="-1002063999592"
# --- CẤU HÌNH ĐƯỜNG DẪN ---
ACCESS_LOG="/www/wwwlogs/access_log"
LOG_OUTPUT="/www/wwwlogs/incident_report.log"
COUNT_FILE="/tmp/apache_error_count.txt"
THRESHOLD=200
# Lấy IP Public của Server
SERVER_IP=$(curl -s https://ifconfig.me/ip || curl -s https://icanhazip.com)
# Định dạng thời gian
CURRENT_TIME=$(date +"%d/%b/%Y:%H:%M")
LOG_TIME=$(date "+%Y-%m-%d %H:%M:%S")
# 1. KIỂM TRA SỨC KHỎE HỆ THỐNG (TỰ ĐỘNG PHÁT HIỆN PROXY NGINX + APACHE)
# Tự động phát hiện cổng của Apache
APACHE_PORT=80
if ss -tuln | grep -q :8080; then
APACHE_PORT=8080
elif netstat -tuln | grep -q :8080 2>/dev/null; then
APACHE_PORT=8080
fi
# Kiểm tra xem Nginx và Apache có đang chạy không
NGINX_ALIVE=$(pgrep -f nginx | wc -l)
PROC_ALIVE=$(pgrep -f httpd | wc -l)
# Kiểm tra HTTP Code cổng công cộng (Port 80)
HTTP_CODE=$(curl --write-out %{http_code} --silent --output /dev/null --connect-timeout 5 127.0.0.1:80)
# Kiểm tra HTTP Code Apache trực tiếp (Port 8080) nếu chạy qua proxy
BACKEND_HTTP_CODE=200
if [ "$APACHE_PORT" -eq 8080 ]; then
BACKEND_HTTP_CODE=$(curl --write-out %{http_code} --silent --output /dev/null --connect-timeout 5 127.0.0.1:8080)
fi
# 2. PHÂN TÍCH DỮ LIỆU SÂU
TMP_LOG=$(mktemp)
grep "$CURRENT_TIME" "$ACCESS_LOG" | grep -v "incident_report.log" | grep -v "127.0.0.1" > "$TMP_LOG"
REQ_COUNT=$(wc -l < "$TMP_LOG")
if [ "$REQ_COUNT" -gt 0 ]; then
# Top API kèm Method (GET/POST)
TOP_API=$(awk '{print $6, $7}' "$TMP_LOG" | tr -d '"' | sort | uniq -c | sort -rn | head -n 5)
# Top IP (Đã lọc bỏ local)
TOP_IP=$(awk '{print $1}' "$TMP_LOG" | sort | uniq -c | sort -rn | head -n 5)
# Top User-Agent (Phát hiện bot/crawl)
TOP_AGENTS=$(awk -F'\"' '{print $6}' "$TMP_LOG" | cut -d' ' -f1-3 | sort | uniq -c | sort -rn | head -n 3)
# Thống kê phân bổ Status Code (200, 404, 500...)
STATUS_STATS=$(awk '{print $9}' "$TMP_LOG" | sort | uniq -c | sort -rn)
# Top API phản hồi lâu nhất (Đổi micro giây sang giây)
TOP_SLOW=$(awk '{ printf "%.2fs %s %s\n", $NF/1000000, $6, $7 }' "$TMP_LOG" | tr -d '"' | sort -rn | head -n 5)
else
TOP_API="No requests"
TOP_IP="No requests"
TOP_AGENTS="No requests"
STATUS_STATS="No requests"
TOP_SLOW="No requests"
fi
# 3. LOGIC BIẾN CỐ (Bảo vệ thông minh)
IS_DOWN=false
RESTART_APACHE=false
RESTART_NGINX=false
# Trường hợp 1: Chạy Apache trực tiếp trên Port 80
if [ "$APACHE_PORT" -eq 80 ]; then
if [ "$HTTP_CODE" -ne 200 ]; then
if [ "$PROC_ALIVE" -eq 0 ] || [ "$HTTP_CODE" -eq 000 ] || [ "$HTTP_CODE" -ge 500 ]; then
IS_DOWN=true
RESTART_APACHE=true
fi
fi
# Trường hợp 2: Chạy Nginx (Port 80) + Apache (Port 8080) làm Reverse Proxy
else
# Kiểm tra Nginx
if [ "$NGINX_ALIVE" -eq 0 ] || [ "$HTTP_CODE" -eq 000 ]; then
IS_DOWN=true
RESTART_NGINX=true
fi
# Kiểm tra Apache Backend (Nếu Nginx sống nhưng trả về 502/504 Bad Gateway, hoặc Apache chết hẳn)
if [ "$PROC_ALIVE" -eq 0 ] || [ "$BACKEND_HTTP_CODE" -eq 000 ] || [ "$BACKEND_HTTP_CODE" -ge 500 ] || [ "$HTTP_CODE" -eq 502 ] || [ "$HTTP_CODE" -eq 504 ]; then
IS_DOWN=true
RESTART_APACHE=true
fi
fi
# 4. XỬ LÝ LOG CHI TIẾT VÀ BÁO CÁO
if [ "$IS_DOWN" = true ]; then
VAL=$(cat "$COUNT_FILE" 2>/dev/null || echo 0)
VAL=$((VAL + 1))
echo $VAL > "$COUNT_FILE"
HEADER="🚨 <b>[CRITICAL] APACHE DOWN/ERROR</b>"
# --- ĐẦY ĐỦ NỘI DUNG LOG CHI TIẾT KHI SẬP ---
{
echo "================ [$LOG_TIME] CRITICAL ================"
echo "Server IP: $SERVER_IP"
echo "Summary: $REQ_COUNT req/min - HTTP Status: $HTTP_CODE"
echo "Lần lỗi liên tiếp: $VAL"
echo "--------------------------------------------"
echo "Top API:"
echo "$TOP_API"
echo ""
echo "Status Stats:"
echo "$STATUS_STATS"
echo ""
echo "Slowest Requests:"
echo "$TOP_SLOW"
echo ""
echo "User Agents:"
echo "$TOP_AGENTS"
echo ""
echo "Top IP:"
echo "$TOP_IP"
echo "--------------------------------------------"
echo ""
} >> "$LOG_OUTPUT"
else
# Hoạt động bình thường -> Reset bộ đếm lỗi về 0
echo 0 > "$COUNT_FILE"
echo "Apache hoạt động bình thường."
if [ "$REQ_COUNT" -gt "$THRESHOLD" ]; then
HEADER="⚠️ <b>[WARNING] HIGH REQUEST DETECTED</b>"
else
# Trạng thái lý tưởng: Không lỗi, không vượt ngưỡng -> Thoát im lặng
rm -f "$TMP_LOG"
exit 0
fi
fi
# --- ĐẦY ĐỦ NỘI DUNG GỬI TELEGRAM ---
REPORT="----------------------------------
$HEADER
🖥️ Server: $SERVER_IP
⏰ Time: $LOG_TIME
📊 Requests/min: $REQ_COUNT (Thật)
🌐 HTTP Code: $HTTP_CODE
----------------------------------
🔥 <b>TOP API & METHOD:</b>
<code>$TOP_API</code>
⏳ <b>TOP SLOWEST (s):</b>
<code>$TOP_SLOW</code>
📡 <b>HTTP STATUS DISTRIBUTION:</b>
<code>$STATUS_STATS</code>
👥 <b>TOP AGENTS:</b>
<code>$TOP_AGENTS</code>
📍 <b>TOP IP (Excluding Local):</b>
<code>$TOP_IP</code>"
# --- RESTART NẾU LỖI LIÊN TIẾP 2 LẦN ---
if [ "$IS_DOWN" = true ] && [ "$VAL" -ge 2 ]; then
ACTION_MSG=""
if [ "$RESTART_APACHE" = true ]; then
fuser -k $APACHE_PORT/tcp > /dev/null 2>&1 || true
rm -f /www/server/apache/logs/httpd.pid
/etc/init.d/httpd start > /dev/null 2>&1 || systemctl start httpd > /dev/null 2>&1 || true
ACTION_MSG="Force Restarted Apache (Port $APACHE_PORT)!"
fi
if [ "$RESTART_NGINX" = true ]; then
/etc/init.d/nginx restart > /dev/null 2>&1 || systemctl restart nginx > /dev/null 2>&1 || true
if [ -n "$ACTION_MSG" ]; then
ACTION_MSG="$ACTION_MSG & Restarted Nginx!"
else
ACTION_MSG="Restarted Nginx (Port 80)!"
fi
fi
# Đính kèm thêm hành động sửa lỗi vào tin nhắn Telegram
REPORT="$REPORT 🛠️ <b>ACTION: $ACTION_MSG</b>"
# Ghi lại hành động vào file log hệ thống
echo "[$LOG_TIME] ACTION: $ACTION_MSG due to 2 consecutive failures." >> "$LOG_OUTPUT"
echo 0 > "$COUNT_FILE"
# --- TIẾN HÀNH GỬI TELEGRAM (Cho cả CRITICAL và WARNING) ---
curl -s -X POST "https://api.telegram.org/bot$TELEGRAM_TOKEN/sendMessage" \
--data-urlencode "chat_id=$TELEGRAM_CHAT_ID" \
--data-urlencode "text=$REPORT" \
-d "parse_mode=HTML" > /dev/null
fi
rm -f "$TMP_LOG"