#!/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!"