Files
vps_setup/setup_nginx_reverse_proxy.sh
T
2026-06-02 13:08:22 +07:00

266 lines
10 KiB
Bash

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