This commit is contained in:
Chu Văn Hải committed 2026-06-02 13:08:22 +07:00
commit 212a531add
3 files changed
+748

No files matched your search

+216
View File
@@ -0,0 +1,216 @@
#!/bin/bash
# curl -sSL https://git.nguoiduathu.eu.org/devops/vps_setup/raw/branch/main/auto_restart_apache.sh | sudo bash
# or
# wget -qO- https://git.nguoiduathu.eu.org/devops/vps_setup/raw/branch/main/auto_restart_apache.sh | sudo bash
# --- 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"
+267
View File
@@ -0,0 +1,267 @@
#!/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_MB=$((TOTAL_RAM_KB / 1024))
TOTAL_RAM_GB=$(awk '/MemTotal/{printf "%.2f", $2/1024/1024}' /proc/meminfo)
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_MB" -le 1024 ]; then
MAX_WORKERS=150
THREADS_PER_CHILD=25
elif [ "$TOTAL_RAM_MB" -le 2048 ]; then
MAX_WORKERS=250
THREADS_PER_CHILD=25
elif [ "$TOTAL_RAM_MB" -le 4096 ]; 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 nghẽn 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
+265
View File
@@ -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!"