commit 3b959d594cdd1b4467920af4c1811b8c22d26147 Author: Chu Văn Hải Date: Mon Jun 1 10:08:40 2026 +0700 init diff --git a/auto_restart_apache.sh b/auto_restart_apache.sh new file mode 100644 index 0000000..8c77ae4 --- /dev/null +++ b/auto_restart_apache.sh @@ -0,0 +1,201 @@ +#!/bin/bash + +# --- CẤU HÌNH TELEGRAM --- +TELEGRAM_TOKEN="" +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="🚨 [CRITICAL] APACHE DOWN/ERROR" + + # --- ĐẦ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="⚠️ [WARNING] HIGH REQUEST DETECTED" + 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 +---------------------------------- +🔥 TOP API & METHOD: +$TOP_API + +⏳ TOP SLOWEST (s): +$TOP_SLOW + +📡 HTTP STATUS DISTRIBUTION: +$STATUS_STATS + +👥 TOP AGENTS: +$TOP_AGENTS + +📍 TOP IP (Excluding Local): +$TOP_IP" + +# --- 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 🛠️ ACTION: $ACTION_MSG" + + # 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" \ No newline at end of file diff --git a/optimize_apache.sh b/optimize_apache.sh new file mode 100644 index 0000000..c15bd36 --- /dev/null +++ b/optimize_apache.sh @@ -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=" + StartServers 3 + MinSpareThreads 25 + MaxSpareThreads 75 + ThreadLimit $THREADS_PER_CHILD + ThreadsPerChild $THREADS_PER_CHILD + MaxRequestWorkers $MAX_WORKERS + MaxConnectionsPerChild 10000 +" + + # 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>/$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" < + StartServers 3 + MinSpareThreads 25 + MaxSpareThreads 75 + ThreadLimit $THREADS_PER_CHILD + ThreadsPerChild $THREADS_PER_CHILD + MaxRequestWorkers $MAX_WORKERS + MaxConnectionsPerChild 10000 + +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" < + StartServers 3 + MinSpareThreads 25 + MaxSpareThreads 75 + ThreadLimit $THREADS_PER_CHILD + ThreadsPerChild $THREADS_PER_CHILD + MaxRequestWorkers $MAX_WORKERS + MaxConnectionsPerChild 10000 + +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" < [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" < + # 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 + +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 diff --git a/setup_nginx_reverse_proxy.sh b/setup_nginx_reverse_proxy.sh new file mode 100644 index 0000000..5e2f336 --- /dev/null +++ b/setup_nginx_reverse_proxy.sh @@ -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///g' {} + + find "$VHOST_DIR_APA" -type f -name "*.conf" -exec sed -i 's///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///g' {} + + find "$VHOST_DIR_APA" -type f -name "*.conf" -exec sed -i 's///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///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!"