init
This commit is contained in:
commit
358ad061f7
3 files changed
+732
No files matched your search
@@ -0,0 +1,201 @@
|
||||
#!/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"
|
||||
@@ -0,0 +1,266 @@
|
||||
#!/usr/bin/env bash
|
||||
# optimize_apache.sh
|
||||
# Kịch bản tự động tối ưu hóa Apache Web Server để chống nghẽn hàng đợi và Slowloris
|
||||
# Hỗ trợ aaPanel/cPanel và các bản phân phối Linux tiêu chuẩn (CentOS, RHEL, Ubuntu)
|
||||
# Usage: sudo ./optimize_apache.sh
|
||||
# curl -sSL https://git.nguoiduathu.eu.org/devops/vps_setup/raw/branch/main/optimize_apache.sh | sudo bash
|
||||
# or
|
||||
# wget -qO- https://git.nguoiduathu.eu.org/devops/vps_setup/raw/branch/main/optimize_apache.sh | sudo bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# Màu sắc hiển thị
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
echo -e "${BLUE}==================================================================${NC}"
|
||||
echo -e "${GREEN} TIẾN TRÌNH TỰ ĐỘNG TỐI ƯU HÓA APACHE WEB SERVER (HIGH PERFORMANCE)${NC}"
|
||||
echo -e "${BLUE}==================================================================${NC}"
|
||||
|
||||
# 1. KIỂM TRA QUYỀN ROOT
|
||||
if [ "$(id -u)" -ne 0 ]; then
|
||||
echo -e "${RED}LỖI: Vui lòng chạy script này dưới quyền root (sudo).${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 2. XÁC ĐỊNH ĐƯỜNG DẪN CẤU HÌNH APACHE
|
||||
APA_DIR=""
|
||||
HTTPD_CONF=""
|
||||
MPM_CONF=""
|
||||
DEFAULT_CONF=""
|
||||
SERVICE_CMD=""
|
||||
|
||||
if [ -d "/www/server/apache" ]; then
|
||||
# aaPanel / BT.cn
|
||||
APA_DIR="/www/server/apache"
|
||||
HTTPD_CONF="$APA_DIR/conf/httpd.conf"
|
||||
MPM_CONF="$APA_DIR/conf/extra/httpd-mpm.conf"
|
||||
DEFAULT_CONF="$APA_DIR/conf/extra/httpd-default.conf"
|
||||
SERVICE_CMD="/etc/init.d/httpd"
|
||||
echo -e "${GREEN}--> Phát hiện môi trường: aaPanel / Baota Control Panel${NC}"
|
||||
elif [ -f "/etc/httpd/conf/httpd.conf" ]; then
|
||||
# CentOS / RHEL tiêu chuẩn
|
||||
APA_DIR="/etc/httpd"
|
||||
HTTPD_CONF="$APA_DIR/conf/httpd.conf"
|
||||
MPM_CONF="$APA_DIR/conf.modules.d/00-mpm.conf"
|
||||
SERVICE_CMD="systemctl restart httpd"
|
||||
echo -e "${GREEN}--> Phát hiện môi trường: CentOS / RHEL (Standard)${NC}"
|
||||
elif [ -d "/etc/apache2" ]; then
|
||||
# Ubuntu / Debian tiêu chuẩn
|
||||
APA_DIR="/etc/apache2"
|
||||
HTTPD_CONF="$APA_DIR/apache2.conf"
|
||||
SERVICE_CMD="systemctl restart apache2"
|
||||
echo -e "${GREEN}--> Phát hiện môi trường: Ubuntu / Debian (Standard)${NC}"
|
||||
else
|
||||
echo -e "${RED}LỖI: Không tìm thấy thư mục cài đặt Apache tiêu chuẩn.${NC}"
|
||||
exit 2
|
||||
fi
|
||||
|
||||
echo -e "--> Thư mục Apache: ${YELLOW}$APA_DIR${NC}"
|
||||
echo -e "--> File cấu hình chính: ${YELLOW}$HTTPD_CONF${NC}"
|
||||
|
||||
# Tạo thư mục sao lưu cấu hình
|
||||
BACKUP_DIR="$APA_DIR/backup_optimize_$(date +%s)"
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
echo -e "--> Đã tạo thư mục sao lưu tại: ${YELLOW}$BACKUP_DIR${NC}"
|
||||
|
||||
# Sao lưu file cấu hình hiện tại
|
||||
[ -f "$HTTPD_CONF" ] && cp -a "$HTTPD_CONF" "$BACKUP_DIR/"
|
||||
[ -n "$MPM_CONF" ] && [ -f "$MPM_CONF" ] && cp -a "$MPM_CONF" "$BACKUP_DIR/"
|
||||
[ -n "$DEFAULT_CONF" ] && [ -f "$DEFAULT_CONF" ] && cp -a "$DEFAULT_CONF" "$BACKUP_DIR/"
|
||||
|
||||
# 3. TÍNH TOÁN CẤU HÌNH THEO TÀI NGUYÊN HỆ THỐNG
|
||||
TOTAL_RAM_KB=$(grep MemTotal /proc/meminfo | awk '{print $2}')
|
||||
TOTAL_RAM_GB=$((TOTAL_RAM_KB / 1024 / 1024))
|
||||
echo -e "--> Tổng dung lượng RAM hệ thống: ${YELLOW}${TOTAL_RAM_GB} GB${NC}"
|
||||
|
||||
# Tính toán MaxRequestWorkers dựa trên RAM
|
||||
# Trung bình 1 Thread của Event MPM chiếm ~5MB-10MB. 1 Worker Process chiếm ~30MB-50MB.
|
||||
# Chúng ta sẽ cấu hình an toàn nhưng vẫn đủ lớn để tải luồng video tĩnh.
|
||||
if [ "$TOTAL_RAM_GB" -le 1 ]; then
|
||||
MAX_WORKERS=150
|
||||
THREADS_PER_CHILD=25
|
||||
elif [ "$TOTAL_RAM_GB" -le 2 ]; then
|
||||
MAX_WORKERS=250
|
||||
THREADS_PER_CHILD=25
|
||||
elif [ "$TOTAL_RAM_GB" -le 4 ]; then
|
||||
MAX_WORKERS=384
|
||||
THREADS_PER_CHILD=32
|
||||
else
|
||||
MAX_WORKERS=800
|
||||
THREADS_PER_CHILD=40
|
||||
fi
|
||||
echo -e "--> Cấu hình tự động đề xuất MaxRequestWorkers: ${GREEN}$MAX_WORKERS${NC} (ThreadsPerChild: ${GREEN}$THREADS_PER_CHILD${NC})"
|
||||
|
||||
# 4. CHUYỂN ĐỔI MPM SANG EVENT MPM (NẾU ĐANG CHẠY PREFORK)
|
||||
echo -e "${BLUE}--> [Bước 1] Kiểm tra và cấu hình Event MPM...${NC}"
|
||||
if [ -f "$MPM_CONF" ] && [ -d "/www/server/apache" ]; then
|
||||
# Đối với aaPanel: Cấu hình Event MPM trong extra/httpd-mpm.conf
|
||||
# Đảm bảo bật Include conf/extra/httpd-mpm.conf trong httpd.conf
|
||||
sed -i 's/#Include conf\/extra\/httpd-mpm.conf/Include conf\/extra\/httpd-mpm.conf/g' "$HTTPD_CONF"
|
||||
|
||||
# Cập nhật thông số Event MPM trong httpd-mpm.conf
|
||||
# Tạo đoạn cấu hình mới
|
||||
NEW_MPM="<IfModule mpm_event_module>
|
||||
StartServers 3
|
||||
MinSpareThreads 25
|
||||
MaxSpareThreads 75
|
||||
ThreadLimit $THREADS_PER_CHILD
|
||||
ThreadsPerChild $THREADS_PER_CHILD
|
||||
MaxRequestWorkers $MAX_WORKERS
|
||||
MaxConnectionsPerChild 10000
|
||||
</IfModule>"
|
||||
|
||||
# Thay thế block mpm_event_module trong httpd-mpm.conf bằng thông số tối ưu
|
||||
# Tìm vị trí và thay thế bằng cách truyền biến qua môi trường để tránh lỗi ký tự đặc biệt
|
||||
NEW_MPM="$NEW_MPM" perl -i -0777 -pe 's/<IfModule mpm_event_module>.*?<\/IfModule>/$ENV{NEW_MPM}/s' "$MPM_CONF"
|
||||
echo -e "${GREEN} [OK] Đã cập nhật cấu hình Event MPM trong $MPM_CONF${NC}"
|
||||
|
||||
elif [ -f "/etc/httpd/conf.modules.d/00-mpm.conf" ]; then
|
||||
# CentOS standard: kích hoạt event, tắt prefork/worker
|
||||
sed -i 's/^LoadModule mpm_prefork_module/#LoadModule mpm_prefork_module/g' "$MPM_CONF"
|
||||
sed -i 's/^LoadModule mpm_worker_module/#LoadModule mpm_worker_module/g' "$MPM_CONF"
|
||||
sed -i 's/^#LoadModule mpm_event_module/LoadModule mpm_event_module/g' "$MPM_CONF"
|
||||
|
||||
# Thêm thông số Event MPM vào cuối file
|
||||
cat >> "$MPM_CONF" <<EOF
|
||||
|
||||
# Cấu hình Event MPM được tối ưu bởi script tự động
|
||||
<IfModule mpm_event_module>
|
||||
StartServers 3
|
||||
MinSpareThreads 25
|
||||
MaxSpareThreads 75
|
||||
ThreadLimit $THREADS_PER_CHILD
|
||||
ThreadsPerChild $THREADS_PER_CHILD
|
||||
MaxRequestWorkers $MAX_WORKERS
|
||||
MaxConnectionsPerChild 10000
|
||||
</IfModule>
|
||||
EOF
|
||||
echo -e "${GREEN} [OK] Đã kích hoạt và tối ưu Event MPM trong $MPM_CONF${NC}"
|
||||
|
||||
elif [ -d "/etc/apache2" ]; then
|
||||
# Ubuntu standard
|
||||
a2dismod mpm_prefork || true
|
||||
a2dismod mpm_worker || true
|
||||
a2enmod mpm_event || true
|
||||
|
||||
# Tối ưu cấu hình trong /etc/apache2/mods-available/mpm_event.conf
|
||||
MPM_EVENT_DEB="/etc/apache2/mods-available/mpm_event.conf"
|
||||
if [ -f "$MPM_EVENT_DEB" ]; then
|
||||
cp -a "$MPM_EVENT_DEB" "$BACKUP_DIR/"
|
||||
cat > "$MPM_EVENT_DEB" <<EOF
|
||||
# Cấu hình tối ưu Event MPM
|
||||
<IfModule mpm_event_module>
|
||||
StartServers 3
|
||||
MinSpareThreads 25
|
||||
MaxSpareThreads 75
|
||||
ThreadLimit $THREADS_PER_CHILD
|
||||
ThreadsPerChild $THREADS_PER_CHILD
|
||||
MaxRequestWorkers $MAX_WORKERS
|
||||
MaxConnectionsPerChild 10000
|
||||
</IfModule>
|
||||
EOF
|
||||
fi
|
||||
echo -e "${GREEN} [OK] Đã kích hoạt và tối ưu mpm_event trên Ubuntu${NC}"
|
||||
fi
|
||||
|
||||
# 5. TỐI ƯU HÓA KEEPALIVE VÀ TIMEOUTS ĐỂ TRÁNH NGHẼN KẾT NỐI
|
||||
echo -e "${BLUE}--> [Bước 2] Tối ưu hóa Timeout và Keep-Alive...${NC}"
|
||||
|
||||
# Thiết lập các giá trị tối ưu hóa trực tiếp vào httpd.conf
|
||||
# Giảm Timeout từ 300s -> 60s
|
||||
# Đảm bảo KeepAlive On, KeepAliveTimeout = 2s hoặc 3s (Tránh giữ kết nối rảnh quá lâu)
|
||||
# MaxKeepAliveRequests lớn (500) để phục vụ nhiều file tĩnh nhanh trên cùng 1 kết nối
|
||||
|
||||
# Cập nhật trong httpd.conf hoặc các file default
|
||||
if [ -f "$DEFAULT_CONF" ] && [ -d "/www/server/apache" ]; then
|
||||
# aaPanel sử dụng conf/extra/httpd-default.conf
|
||||
sed -i 's/#Include conf\/extra\/httpd-default.conf/Include conf\/extra\/httpd-default.conf/g' "$HTTPD_CONF"
|
||||
|
||||
# Sửa trong httpd-default.conf
|
||||
sed -i 's/^Timeout .*/Timeout 60/g' "$DEFAULT_CONF"
|
||||
sed -i 's/^KeepAlive .*/KeepAlive On/g' "$DEFAULT_CONF"
|
||||
sed -i 's/^MaxKeepAliveRequests .*/MaxKeepAliveRequests 500/g' "$DEFAULT_CONF"
|
||||
sed -i 's/^KeepAliveTimeout .*/KeepAliveTimeout 2/g' "$DEFAULT_CONF"
|
||||
echo -e "${GREEN} [OK] Đã cập nhật Timeout & Keep-Alive trong $DEFAULT_CONF${NC}"
|
||||
else
|
||||
# Bản phân phối tiêu chuẩn hoặc không có file default tách biệt
|
||||
# Xóa các dòng cũ nếu có trong httpd.conf
|
||||
sed -i '/^Timeout /d' "$HTTPD_CONF"
|
||||
sed -i '/^KeepAlive /d' "$HTTPD_CONF"
|
||||
sed -i '/^MaxKeepAliveRequests /d' "$HTTPD_CONF"
|
||||
sed -i '/^KeepAliveTimeout /d' "$HTTPD_CONF"
|
||||
|
||||
# Thêm cấu hình tối ưu vào cuối file httpd.conf
|
||||
cat >> "$HTTPD_CONF" <<EOF
|
||||
|
||||
# --- TỐI ƯU HÓA KẾT NỐI & TIMEOUTS ---
|
||||
Timeout 60
|
||||
KeepAlive On
|
||||
MaxKeepAliveRequests 500
|
||||
KeepAliveTimeout 2
|
||||
EOF
|
||||
echo -e "${GREEN} [OK] Đã cập nhật Timeout & Keep-Alive trong $HTTPD_CONF${NC}"
|
||||
fi
|
||||
|
||||
# 6. KÍCH HOẠT VÀ CẤU HÌNH CHỐNG SLOW CONNECT / SLOWLORIS (mod_reqtimeout)
|
||||
echo -e "${BLUE}--> [Bước 3] Kích hoạt và cấu hình mod_reqtimeout (Chống Slow Connection)...${NC}"
|
||||
# Đảm bảo module mod_reqtimeout được nạp
|
||||
if [ -d "/www/server/apache" ]; then
|
||||
# Kích hoạt module trong httpd.conf của aaPanel
|
||||
sed -i 's/#LoadModule reqtimeout_module/LoadModule reqtimeout_module/g' "$HTTPD_CONF"
|
||||
fi
|
||||
|
||||
# Thêm block cấu hình bảo vệ vào httpd.conf nếu chưa có
|
||||
if ! grep -q "mod_reqtimeout_module" "$HTTPD_CONF"; then
|
||||
cat >> "$HTTPD_CONF" <<EOF
|
||||
|
||||
# --- BẢO VỆ CHỐNG SLOWLORIS / SLOW CONNECTIONS ---
|
||||
<IfModule mod_reqtimeout_module>
|
||||
# Header: Cho phép tối đa 20s nhận Header, nếu tốc độ tối thiểu 500 bytes/s cho phép kéo dài đến tối đa 40s.
|
||||
# Body: Cho phép tối đa 20s nhận Body, nếu tốc độ tối thiểu 500 bytes/s cho phép kéo dài thêm.
|
||||
RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
|
||||
</IfModule>
|
||||
EOF
|
||||
echo -e "${GREEN} [OK] Đã thêm cấu hình bảo vệ RequestReadTimeout vào $HTTPD_CONF${NC}"
|
||||
else
|
||||
echo -e "${YELLOW} [!] Cấu hình mod_reqtimeout đã tồn tại trước đó, giữ nguyên.${NC}"
|
||||
fi
|
||||
|
||||
# 7. KIỂM TRA VÀ KHỞI ĐỘNG LẠI APACHE
|
||||
echo -e "${BLUE}--> [Bước 4] Kiểm tra cú pháp cấu hình Apache...${NC}"
|
||||
|
||||
TEST_CMD=""
|
||||
if [ -d "/www/server/apache" ]; then
|
||||
TEST_CMD="/www/server/apache/bin/apachectl configtest"
|
||||
elif command -v apache2ctl >/dev/null 2>&1; then
|
||||
TEST_CMD="apache2ctl configtest"
|
||||
else
|
||||
TEST_CMD="apachectl configtest"
|
||||
fi
|
||||
|
||||
if $TEST_CMD; then
|
||||
echo -e "${GREEN}--> Cú pháp cấu hình hợp lệ! Đang khởi động lại dịch vụ Apache...${NC}"
|
||||
if [ -x "$SERVICE_CMD" ]; then
|
||||
$SERVICE_CMD restart || $SERVICE_CMD start
|
||||
else
|
||||
$SERVICE_CMD
|
||||
fi
|
||||
echo -e "${GREEN}=== TỐI ƯU HÓA APACHE THÀNH CÔNG ===${NC}"
|
||||
echo -e "Hệ thống Apache hiện tại đã được cấu hình chạy ${YELLOW}Event MPM${NC} với các tham số kết nối ngắn để triệt tiêu tình trạng treo cổ chai."
|
||||
else
|
||||
echo -e "${RED}LỖI: Cú pháp cấu hình Apache không hợp lệ. Tiến hành khôi phục cấu hình ban đầu...${NC}"
|
||||
cp -a "$BACKUP_DIR"/* "$APA_DIR/" || true
|
||||
if [ -f "$BACKUP_DIR/httpd-mpm.conf" ] && [ -d "$APA_DIR/conf/extra" ]; then
|
||||
cp -a "$BACKUP_DIR/httpd-mpm.conf" "$APA_DIR/conf/extra/" || true
|
||||
fi
|
||||
if [ -f "$BACKUP_DIR/httpd-default.conf" ] && [ -d "$APA_DIR/conf/extra" ]; then
|
||||
cp -a "$BACKUP_DIR/httpd-default.conf" "$APA_DIR/conf/extra/" || true
|
||||
fi
|
||||
echo -e "${GREEN}--> Đã khôi phục trạng thái cũ. Vui lòng kiểm tra lại log lỗi Apache.${NC}"
|
||||
$TEST_CMD || true
|
||||
exit 3
|
||||
fi
|
||||
@@ -0,0 +1,265 @@
|
||||
#!/usr/bin/env bash
|
||||
# setup_nginx_reverse_proxy.sh
|
||||
# Kịch bản tự động cấu hình Nginx làm Front-end Reverse Proxy và chuyển Apache về Back-end (Port 8080)
|
||||
# Giúp Nginx gánh toàn bộ file tĩnh lớn (như MP4) và xử lý kết nối chậm cực kỳ hiệu quả
|
||||
# Hỗ trợ aaPanel/cPanel và các hệ thống chạy CentOS, RHEL, Ubuntu
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m'
|
||||
|
||||
echo -e "${BLUE}==================================================================${NC}"
|
||||
echo -e "${GREEN} TRIỂN KHAI NGINX REVERSE PROXY CHO APACHE (TỐI ƯU FILE TĨNH & MP4)${NC}"
|
||||
echo -e "${BLUE}==================================================================${NC}"
|
||||
|
||||
# 1. KIỂM TRA QUYỀN ROOT
|
||||
if [ "$(id -u)" -ne 0 ]; then
|
||||
echo -e "${RED}LỖI: Vui lòng chạy script này dưới quyền root (sudo).${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 2. XÁC ĐỊNH HỆ THỐNG & ĐƯỜNG DẪN CẤU HÌNH
|
||||
IS_AAPANEL=false
|
||||
APA_CONF_DIR=""
|
||||
HTTPD_CONF=""
|
||||
PORTS_CONF=""
|
||||
VHOST_DIR_APA=""
|
||||
VHOST_DIR_NGX=""
|
||||
NGINX_CONF_DIR=""
|
||||
|
||||
if [ -d "/www/server/apache" ]; then
|
||||
IS_AAPANEL=true
|
||||
APA_CONF_DIR="/www/server/apache/conf"
|
||||
HTTPD_CONF="$APA_CONF_DIR/httpd.conf"
|
||||
VHOST_DIR_APA="/www/server/panel/vhost/apache"
|
||||
VHOST_DIR_NGX="/www/server/panel/vhost/nginx"
|
||||
NGINX_CONF_DIR="/www/server/nginx/conf"
|
||||
echo -e "${GREEN}--> Phát hiện môi trường: aaPanel / Baota Control Panel${NC}"
|
||||
elif [ -d "/etc/httpd" ]; then
|
||||
APA_CONF_DIR="/etc/httpd/conf"
|
||||
HTTPD_CONF="$APA_CONF_DIR/httpd.conf"
|
||||
VHOST_DIR_APA="/etc/httpd/conf.d"
|
||||
NGINX_CONF_DIR="/etc/nginx"
|
||||
echo -e "${GREEN}--> Phát hiện môi trường: CentOS / RHEL (Standard)${NC}"
|
||||
elif [ -d "/etc/apache2" ]; then
|
||||
APA_CONF_DIR="/etc/apache2"
|
||||
HTTPD_CONF="$APA_CONF_DIR/apache2.conf"
|
||||
PORTS_CONF="$APA_CONF_DIR/ports.conf"
|
||||
VHOST_DIR_APA="$APA_CONF_DIR/sites-enabled"
|
||||
NGINX_CONF_DIR="/etc/nginx"
|
||||
echo -e "${GREEN}--> Phát hiện môi trường: Ubuntu / Debian (Standard)${NC}"
|
||||
fi
|
||||
|
||||
# Kiểm tra Nginx có được cài đặt chưa
|
||||
if ! command -v nginx >/dev/null 2>&1 && [ ! -f "/www/server/nginx/sbin/nginx" ]; then
|
||||
echo -e "${YELLOW}[!] Cảnh báo: Chưa tìm thấy Nginx trên hệ thống.${NC}"
|
||||
echo -e "Vui lòng cài đặt Nginx trước qua trình quản lý (aaPanel App Store) hoặc chạy script:"
|
||||
echo -e " ${BLUE}sudo ./install_nginx_highload_ol7.sh${NC}"
|
||||
echo -e "Sau đó chạy lại script này."
|
||||
exit 2
|
||||
fi
|
||||
|
||||
# Sao lưu cấu hình trước khi chỉnh sửa
|
||||
BACKUP_DIR="/tmp/backup_proxy_$(date +%s)"
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
echo -e "--> Đang tạo bản sao lưu cấu hình tại: ${YELLOW}$BACKUP_DIR${NC}"
|
||||
[ -f "$HTTPD_CONF" ] && cp -a "$HTTPD_CONF" "$BACKUP_DIR/"
|
||||
[ -n "${PORTS_CONF:-}" ] && [ -f "$PORTS_CONF" ] && cp -a "$PORTS_CONF" "$BACKUP_DIR/"
|
||||
[ -d "$VHOST_DIR_APA" ] && cp -a "$VHOST_DIR_APA" "$BACKUP_DIR/apache_vhosts"
|
||||
|
||||
# 3. ĐỔI CỔNG APACHE SANG PORT 8080 (VÀ 8443 CHO SSL)
|
||||
echo -e "${BLUE}--> [Bước 1] Đang đổi cổng lắng nghe của Apache sang 8080 (và SSL sang 8443)...${NC}"
|
||||
|
||||
# Chỉnh sửa cổng trong file cấu hình chính
|
||||
if [ "$IS_AAPANEL" = true ]; then
|
||||
# Thay đổi 'Listen 80' thành 'Listen 127.0.0.1:8080' để Apache chỉ chấp nhận kết nối nội bộ
|
||||
sed -i 's/^Listen 80/Listen 127.0.0.1:8080/g' "$HTTPD_CONF"
|
||||
sed -i 's/^Listen 443/Listen 127.0.0.1:8443/g' "$HTTPD_CONF"
|
||||
|
||||
# Cập nhật trong các vhost của Apache
|
||||
if [ -d "$VHOST_DIR_APA" ]; then
|
||||
echo -e "--> Đang cập nhật VirtualHost Ports trong vhosts của aaPanel..."
|
||||
find "$VHOST_DIR_APA" -type f -name "*.conf" -exec sed -i 's/<VirtualHost \*:80>/<VirtualHost 127.0.0.1:8080>/g' {} +
|
||||
find "$VHOST_DIR_APA" -type f -name "*.conf" -exec sed -i 's/<VirtualHost \*:443>/<VirtualHost 127.0.0.1:8443>/g' {} +
|
||||
fi
|
||||
|
||||
elif [ -f "${PORTS_CONF:-}" ]; then
|
||||
# Môi trường Ubuntu/Debian
|
||||
sed -i 's/Listen 80/Listen 127.0.0.1:8080/g' "$PORTS_CONF"
|
||||
sed -i 's/Listen 443/Listen 127.0.0.1:8443/g' "$PORTS_CONF"
|
||||
|
||||
# Cập nhật vhost của Apache
|
||||
if [ -d "$VHOST_DIR_APA" ]; then
|
||||
find "$VHOST_DIR_APA" -type f -name "*.conf" -exec sed -i 's/<VirtualHost \*:80>/<VirtualHost 127.0.0.1:8080>/g' {} +
|
||||
find "$VHOST_DIR_APA" -type f -name "*.conf" -exec sed -i 's/<VirtualHost \*:443>/<VirtualHost 127.0.0.1:8443>/g' {} +
|
||||
fi
|
||||
|
||||
else
|
||||
# Môi trường CentOS standard
|
||||
sed -i 's/^Listen 80/Listen 127.0.0.1:8080/g' "$HTTPD_CONF"
|
||||
|
||||
# Cập nhật vhost
|
||||
if [ -d "$VHOST_DIR_APA" ]; then
|
||||
find "$VHOST_DIR_APA" -type f -name "*.conf" -exec sed -i 's/<VirtualHost \*:80>/<VirtualHost 127.0.0.1:8080>/g' {} +
|
||||
fi
|
||||
fi
|
||||
|
||||
echo -e "${GREEN} [OK] Đã chuyển đổi Apache sang lắng nghe ở cổng cục bộ 8080/8443.${NC}"
|
||||
|
||||
# 4. TẠO CẤU HÌNH NGINX FRONT-END PROXY
|
||||
echo -e "${BLUE}--> [Bước 2] Đang thiết lập cấu hình Nginx Reverse Proxy...${NC}"
|
||||
|
||||
# Xác định thư mục chứa cấu hình Nginx
|
||||
NGINX_CONF_FILE=""
|
||||
if [ "$IS_AAPANEL" = true ]; then
|
||||
NGINX_CONF_FILE="/www/server/nginx/conf/conf.d/00_apache_proxy.conf"
|
||||
# Đảm bảo thư mục conf.d tồn tại
|
||||
mkdir -p "/www/server/nginx/conf/conf.d"
|
||||
else
|
||||
NGINX_CONF_FILE="/etc/nginx/conf.d/00_apache_proxy.conf"
|
||||
mkdir -p "/etc/nginx/conf.d"
|
||||
fi
|
||||
|
||||
# Viết file cấu hình Proxy chung
|
||||
cat > "$NGINX_CONF_FILE" <<'EOF'
|
||||
# Nginx Reverse Proxy Global Configurations
|
||||
proxy_connect_timeout 10s;
|
||||
proxy_send_timeout 90s;
|
||||
proxy_read_timeout 90s;
|
||||
proxy_buffer_size 128k;
|
||||
proxy_buffers 16 64k;
|
||||
proxy_busy_buffers_size 256k;
|
||||
proxy_temp_file_write_size 256k;
|
||||
|
||||
# Bật lưu cache đệm phản hồi từ backend để Nginx giải phóng Apache ngay lập tức
|
||||
proxy_buffering on;
|
||||
|
||||
# Chuyển tiếp các Header nhận diện client thực
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
EOF
|
||||
|
||||
echo -e "${GREEN} [OK] Đã ghi cấu hình Proxy toàn cục của Nginx tại: $NGINX_CONF_FILE${NC}"
|
||||
|
||||
# 5. KHUYÊN DÙNG CẤU HÌNH VIRTUAL HOST CHO NGINX
|
||||
echo -e "${BLUE}--> [Bước 3] Đang tạo file cấu hình Vhost mẫu cho Nginx để gánh file tĩnh...${NC}"
|
||||
|
||||
SAMPLE_VHOST_PATH=""
|
||||
if [ "$IS_AAPANEL" = true ]; then
|
||||
SAMPLE_VHOST_PATH="/www/server/panel/vhost/nginx/proxy_sample.conf.example"
|
||||
mkdir -p "/www/server/panel/vhost/nginx"
|
||||
else
|
||||
SAMPLE_VHOST_PATH="/etc/nginx/conf.d/proxy_sample.conf.example"
|
||||
fi
|
||||
|
||||
cat > "$SAMPLE_VHOST_PATH" <<'EOF'
|
||||
# FILE CẤU HÌNH MẪU VHOST NGINX PROXY CHO APACHE
|
||||
# Đổi tên file này thành .conf và điều chỉnh tên miền / root path phù hợp
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
# listen 443 ssl http2; # Mở ra nếu chạy HTTPS
|
||||
server_name yourdomain.com www.yourdomain.com 45.77.170.169;
|
||||
|
||||
# Thư mục gốc chứa source code của web (Khớp với DocumentRoot trong Apache)
|
||||
root /www/wwwroot/your_app;
|
||||
index index.php index.html index.htm;
|
||||
|
||||
# 1. NGINX TRỰC TIẾP PHÂN PHỐI FILE TĨNH VÀ VIDEO MP4 (Không qua Apache)
|
||||
location ~* \.(mp4|avi|webm|mkv|mov|mp3|ogg|wav|jpg|jpeg|gif|png|css|js|ico|xml|otf|ttf|woff|woff2)$ {
|
||||
sendfile on;
|
||||
tcp_nopush on;
|
||||
tcp_nodelay on;
|
||||
|
||||
# Thiết lập hết hạn cache lâu cho trình duyệt
|
||||
expires max;
|
||||
access_log off;
|
||||
log_not_found off;
|
||||
|
||||
# Cấu hình tối ưu truyền tải video trực tuyến (giúp tua nhanh mượt)
|
||||
mp4;
|
||||
mp4_buffer_size 1m;
|
||||
mp4_max_buffer_size 5m;
|
||||
|
||||
# Nếu không tìm thấy file tĩnh trên đĩa cứng, fallback gửi qua Apache
|
||||
try_files $uri @fallback;
|
||||
}
|
||||
|
||||
# 2. PROXY TOÀN BỘ CÁC REQUEST KHÁC (PHP, DYNAMIC) SANG APACHE PORT 8080
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:8080;
|
||||
|
||||
# Cho phép tải file lên kích thước lớn
|
||||
client_max_body_size 100m;
|
||||
client_body_buffer_size 128k;
|
||||
}
|
||||
|
||||
location @fallback {
|
||||
proxy_pass http://127.0.0.1:8080;
|
||||
}
|
||||
|
||||
# Bỏ qua log favicon
|
||||
location = /favicon.ico { access_log off; log_not_found off; }
|
||||
}
|
||||
EOF
|
||||
|
||||
echo -e "${GREEN} [OK] Đã tạo vhost cấu hình mẫu tại: $SAMPLE_VHOST_PATH${NC}"
|
||||
|
||||
# 6. KIỂM TRA VÀ KHỞI ĐỘNG LẠI DỊCH VỤ
|
||||
echo -e "${BLUE}--> [Bước 4] Kiểm tra cú pháp cấu hình và khởi chạy lại dịch vụ...${NC}"
|
||||
|
||||
APA_TEST=""
|
||||
NGX_TEST="nginx -t"
|
||||
APA_RESTART=""
|
||||
NGX_RESTART=""
|
||||
|
||||
if [ "$IS_AAPANEL" = true ]; then
|
||||
APA_TEST="/www/server/apache/bin/apachectl configtest"
|
||||
APA_RESTART="/etc/init.d/httpd restart"
|
||||
NGX_RESTART="/etc/init.d/nginx restart"
|
||||
elif [ -d "/etc/httpd" ]; then
|
||||
APA_TEST="apachectl configtest"
|
||||
APA_RESTART="systemctl restart httpd"
|
||||
NGX_RESTART="systemctl restart nginx"
|
||||
else
|
||||
APA_TEST="apache2ctl configtest"
|
||||
APA_RESTART="systemctl restart apache2"
|
||||
NGX_RESTART="systemctl restart nginx"
|
||||
fi
|
||||
|
||||
echo "--> Đang kiểm tra cấu hình Apache..."
|
||||
if ! $APA_TEST; then
|
||||
echo -e "${RED}LỖI: Kiểm tra cú pháp Apache thất bại. Tiến hành khôi phục cấu hình gốc...${NC}"
|
||||
cp -a "$BACKUP_DIR"/*conf "$APA_CONF_DIR/" || true
|
||||
[ -d "$BACKUP_DIR/apache_vhosts" ] && cp -a "$BACKUP_DIR/apache_vhosts"/* "$VHOST_DIR_APA/" || true
|
||||
exit 3
|
||||
fi
|
||||
|
||||
echo "--> Đang kiểm tra cấu hình Nginx..."
|
||||
if ! $NGX_TEST; then
|
||||
echo -e "${RED}LỖI: Kiểm tra cú pháp Nginx thất bại. Vui lòng kiểm tra lại file cấu hình proxy.${NC}"
|
||||
rm -f "$NGINX_CONF_FILE"
|
||||
exit 4
|
||||
fi
|
||||
|
||||
# Tiến hành restart dịch vụ
|
||||
echo -e "--> Đang khởi động lại Apache..."
|
||||
$APA_RESTART
|
||||
echo -e "--> Đang khởi động lại Nginx..."
|
||||
if [ "$IS_AAPANEL" = true ]; then
|
||||
/etc/init.d/nginx restart || /etc/init.d/nginx start
|
||||
else
|
||||
systemctl restart nginx || systemctl start nginx
|
||||
fi
|
||||
|
||||
echo -e "${GREEN}=== THIẾT LẬP NGINX PROXY APACHE HOÀN TẤT ===${NC}"
|
||||
echo -e "Bây giờ:"
|
||||
echo -e " - Apache đang lắng nghe an toàn ở cổng cục bộ: ${YELLOW}127.0.0.1:8080 / 127.0.0.1:8443${NC}"
|
||||
echo -e " - Nginx lắng nghe cổng công cộng: ${YELLOW}80 / 443${NC} và chuyển tiếp dữ liệu."
|
||||
echo -e "Vui lòng xem và áp dụng file vhost mẫu ${YELLOW}$SAMPLE_VHOST_PATH${NC} cho tên miền của bạn để Nginx trực tiếp tải file video .mp4 nhanh gấp nhiều lần!"
|
||||
Reference in new issue
Block a user