init
This commit is contained in:
commit
956baaa4af
3 files changed
+765
No files matched your search
@@ -0,0 +1,233 @@
|
||||
#!/bin/bash
|
||||
# curl -sSL https://git.nguoiduathu.eu.org/devops/vps_setup/raw/branch/main/auto_restart_apache.sh -o auto_restart_apache.sh && chmod +x auto_restart_apache.sh
|
||||
# or
|
||||
# wget -qO- https://git.nguoiduathu.eu.org/devops/vps_setup/raw/branch/main/auto_restart_apache.sh -O auto_restart_apache.sh && chmod +x auto_restart_apache.sh
|
||||
|
||||
# --- HỖ TRỢ TỰ ĐỘNG CẬP NHẬT SCRIPT ---
|
||||
if [ "$1" = "update" ]; then
|
||||
echo "Đang cập nhật auto_restart_apache.sh..."
|
||||
SCRIPT_PATH="${BASH_SOURCE[0]}"
|
||||
if [ -z "$SCRIPT_PATH" ]; then
|
||||
SCRIPT_PATH="auto_restart_apache.sh"
|
||||
fi
|
||||
curl -sSL https://git.nguoiduathu.eu.org/devops/vps_setup/raw/branch/main/auto_restart_apache.sh -o "$SCRIPT_PATH" && chmod +x "$SCRIPT_PATH"
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "Cập nhật thành công!"
|
||||
exit 0
|
||||
else
|
||||
echo "Cập nhật thất bại!"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# --- CẤU HÌNH TELEGRAM (Tải từ file .env) ---
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
if [ -f "$SCRIPT_DIR/.env" ]; then
|
||||
set -a
|
||||
source "$SCRIPT_DIR/.env"
|
||||
set +a
|
||||
elif [ -f "./.env" ]; then
|
||||
set -a
|
||||
source "./.env"
|
||||
set +a
|
||||
fi
|
||||
|
||||
# Dự phòng giá trị mặc định nếu không tìm thấy hoặc chưa cấu hình trong .env
|
||||
TELEGRAM_TOKEN="${TELEGRAM_TOKEN:-}"
|
||||
TELEGRAM_CHAT_ID="${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 :8288; then
|
||||
APACHE_PORT=8288
|
||||
elif netstat -tuln | grep -q :8288 2>/dev/null; then
|
||||
APACHE_PORT=8288
|
||||
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 8288) nếu chạy qua proxy
|
||||
BACKEND_HTTP_CODE=200
|
||||
if [ "$APACHE_PORT" -eq 8288 ]; then
|
||||
BACKEND_HTTP_CODE=$(curl --write-out %{http_code} --silent --output /dev/null --connect-timeout 5 127.0.0.1:8288)
|
||||
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 8288) 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"
|
||||
Reference in new issue
Block a user