Bạn đang sử dụng Webinoly để quản lý server LEMP (Linux, Nginx, MySQL/MariaDB, PHP) trên Ubuntu và cần triển khai IonCube Loader để chạy các ứng dụng PHP mã hóa? Script tự động cài đặt IonCube Loader phiên bản 1.0 là giải pháp hoàn hảo, giúp bạn cài đặt IonCube một cách nhanh chóng, an toàn và hiệu quả.
IonCube Loader là một extension PHP cần thiết để chạy các file PHP được mã hóa, thường được yêu cầu bởi các ứng dụng thương mại như WHMCS, phần mềm quản lý hosting, hoặc các plugin/theme WordPress cao cấp. Mặc dù Webinoly cung cấp một stack LEMP mạnh mẽ với các lệnh đơn giản để quản lý Nginx, PHP, và MariaDB, nó không tích hợp sẵn IonCube Loader. Việc cài đặt IonCube Loader không quá phức tạp, tuy nhiên nếu cài đặt thủ công có thể tốn thời gian, dễ xảy ra lỗi, và đòi hỏi kiến thức về cấu hình PHP. Script install_ioncube_webinoly_v1.0.sh ra đời để tự động hóa toàn bộ quy trình, từ phát hiện phiên bản PHP, tải file, cấu hình, đến xác nhận hoạt động. Với script này, bạn có thể cài đặt IonCube Loader chỉ trong vài phút, ngay cả khi mới làm quen với quản trị server, mang lại sự tiện lợi vượt trội cho các ứng dụng yêu cầu IonCube như WHMCS hay plugin WordPress mã hóa.
Tính năng nổi bật của Script v1.0
- Tự động phát hiện và cài đặt: Tự động nhận diện phiên bản PHP (7.4–8.3) và chọn file IonCube Loader phù hợp. Nếu không tìm thấy loader chính xác, script sẽ fallback sang phiên bản gần nhất hoặc mới nhất, đảm bảo tương thích tối đa.
- Cấu hình chuẩn hóa: Tạo file cấu hình 20-ioncube.ini trong thư mục mods-available và sử dụng symlink cho cả PHP-FPM và CLI, tuân theo chuẩn cấu hình PHP trên Ubuntu, dễ dàng bảo trì và gỡ bỏ.
- Kiểm tra toàn diện: Kiểm tra quyền root, kết nối mạng, trạng thái PHP-FPM, cấu hình Nginx, và quyền ghi thư mục extension, đảm bảo quá trình cài đặt diễn ra suôn sẻ.
- Ghi log chi tiết: Lưu toàn bộ quá trình vào /var/log/ioncube_install.log với dấu thời gian, giúp dễ dàng theo dõi và xử lý sự cố.
- Dọn dẹp an toàn: Tự động xóa file tạm sau khi hoàn tất hoặc khi gặp lỗi, giữ server sạch sẽ.
- Hỗ trợ tùy chỉnh: Cho phép chỉ định phiên bản PHP qua tham số (ví dụ: ./script.sh 8.1), phù hợp với server chạy nhiều phiên bản PHP.
Hướng dẫn sử dụng
Cài đặt IonCube Loader với script v1.0 rất đơn giản. Dưới đây là các bước chi tiết, với mã nguồn được định dạng để hiển thị đẹp mắt bằng plugin Enlighter:
1. Tạo script:
Lưu script vào file install_ioncube_webinoly_v1.0.sh:
sudo nano install_ioncube_webinoly_v1.0.sh
Dán nội dung script dưới đây, lưu và thoát.
#!/bin/bash # ========================================================== # Script: Cài đặt IonCube Loader cho Webinoly (v1.0) # Mục đích: Hỗ trợ PHP 7.4–8.3, dò loader mới nhất, fallback, log chi tiết # Phiên bản: v1.0 (07/10/2025) # Log: /var/log/ioncube_install.log # ========================================================== set -euo pipefail trap 'rm -rf "/tmp/ioncube" "ioncube_loaders.tar.gz" 2>/dev/null' EXIT LOG_FILE="/var/log/ioncube_install.log" mkdir -p "$(dirname "$LOG_FILE")" chmod 644 "$LOG_FILE" 2>/dev/null || true exec > >(tee -a "$LOG_FILE") 2>&1 echo "=== IONCUBE INSTALL START: $(date '+%Y-%m-%d %H:%M:%S') ===" # --- Root check --- if [[ $EUID -ne 0 ]]; then echo "❌ Lỗi: script phải chạy với quyền root." exit 1 fi # --- PHP version param or autodetect --- if [[ ${1-} ]]; then PHP_VERSION="$1" if [[ ! -d "/etc/php/$PHP_VERSION" ]]; then echo "❌ Lỗi: PHP $PHP_VERSION không tồn tại tại /etc/php/$PHP_VERSION" exit 1 fi else PHP_VERSION=$(ls /etc/php | grep -E '^[0-9]+\.[0-9]+$' | sort -V | tail -n1 || true) fi if [[ -z "${PHP_VERSION:-}" ]]; then echo "❌ Lỗi: Không tìm thấy PHP trên hệ thống. Cài đặt PHP trước (VD: sudo webinoly -stack)." exit 1 fi echo "🔹 Target PHP version: $PHP_VERSION" echo "🔹 PHP CLI: $(php -v | head -n1 || true)" # --- Kiểm tra binary PHP-FPM (gợi ý 3) --- FPM_BIN=$(command -v "php-fpm${PHP_VERSION//./}" || command -v php-fpm || true) if [[ -x "$FPM_BIN" ]]; then echo "🔹 PHP-FPM binary: $FPM_BIN" echo "🔹 PHP-FPM version: $($FPM_BIN -v | head -n1 || true)" else echo "⚠️ Không tìm thấy php-fpm binary, bỏ qua kiểm tra." fi # --- Ensure php-fpm service exists / start if necessary --- if systemctl list-units --full -all | grep -q "php${PHP_VERSION}-fpm.service"; then if ! systemctl is-active --quiet "php${PHP_VERSION}-fpm"; then echo "⚠️ php${PHP_VERSION}-fpm không active, thử khởi động..." systemctl start "php${PHP_VERSION}-fpm" || { echo "❌ Không thể khởi động php${PHP_VERSION}-fpm; kiểm tra bằng: systemctl status php${PHP_VERSION}-fpm" exit 1 } fi else echo "⚠️ Không tìm thấy php${PHP_VERSION}-fpm.service — tiếp tục nhưng có thể cần cấu hình thủ công." fi # --- Version numeric compare (warn for >8.1) --- PHP_MAJOR=$(echo "$PHP_VERSION" | cut -d. -f1) PHP_MINOR=$(echo "$PHP_VERSION" | cut -d. -f2) if (( PHP_MAJOR > 8 || (PHP_MAJOR == 8 && PHP_MINOR > 1) )); then echo "⚠️ Cảnh báo: IonCube có thể chưa hỗ trợ đầy đủ PHP $PHP_VERSION. Kiểm tra https://www.ioncube.com/loaders.php" read -p "→ Có tiếp tục? (y/N): " CONF [[ "$CONF" != "y" && "$CONF" != "Y" ]] && { echo "Huỷ bỏ."; exit 1; } fi # --- Network check (gợi ý 1: thay ping bằng curl) --- echo "🔹 Kiểm tra kết nối tới downloads.ioncube.com..." if ! curl -Is https://downloads.ioncube.com | head -n1 | grep -q "200"; then echo "❌ Không thể kết nối tới downloads.ioncube.com (HTTP không trả về 200 OK) — kiểm tra DNS/kết nối/firewall." exit 1 fi # --- Determine extension_dir using php-config for target PHP if available --- PHP_CONFIG_BIN="/usr/bin/php-config${PHP_VERSION//./}" if [[ -x "$PHP_CONFIG_BIN" ]]; then EXT_DIR=$("$PHP_CONFIG_BIN" --extension-dir 2>/dev/null || true) fi if [[ -z "$EXT_DIR" ]]; then EXT_DIR=$(php -i 2>/dev/null | awk -F ' => ' '/^extension_dir/ {print $2; exit}' || true) fi if [[ -z "$EXT_DIR" ]]; then echo "❌ Không xác định được extension_dir từ php-config hoặc php -i" exit 1 fi echo "🔹 extension_dir: $EXT_DIR" if [[ ! -w "$EXT_DIR" ]]; then echo "❌ Không có quyền ghi vào $EXT_DIR. Kiểm tra quyền hoặc chạy script với sudo/root." exit 1 fi # --- Prepare temp dir and download --- TEMP_DIR="/tmp/ioncube" mkdir -p "$TEMP_DIR" cd "$TEMP_DIR" || exit 1 IONCUBE_URL="https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz" echo "🔸 Downloading ioncube loaders..." if ! wget --no-cache -q "$IONCUBE_URL" -O ioncube_loaders.tar.gz; then echo "❌ Lỗi: không tải được gói từ $IONCUBE_URL. Kiểm tra https://www.ioncube.com/loaders.php" exit 1 fi if [[ ! -s ioncube_loaders.tar.gz ]]; then echo "❌ File tải về rỗng/hỏng." exit 1 fi # --- Extract --- tar xzf ioncube_loaders.tar.gz # --- Find best loader file --- TARGET_SO="ioncube/ioncube_loader_lin_${PHP_VERSION}.so" if [[ -f "$TARGET_SO" ]]; then SELECTED="$TARGET_SO" else echo "⚠️ Không tìm thấy loader chính xác cho PHP $PHP_VERSION — tìm bản fallback..." MAJ="${PHP_MAJOR}." mapfile -t candidates < <(ls ioncube/ioncube_loader_lin_${MAJ}*.so 2>/dev/null | sort -V || true) if [[ ${#candidates[@]} -gt 0 ]]; then SELECTED=$(printf "%s\n" "${candidates[@]}" | sort -V | tail -n1) else SELECTED=$(ls ioncube/ioncube_loader_lin_*.so 2>/dev/null | sort -V | tail -n1 || true) fi fi if [[ -z "${SELECTED:-}" || ! -f "$SELECTED" ]]; then echo "❌ Không tìm thấy bất kỳ loader phù hợp nào trong gói đã tải." exit 1 fi SELECTED_VERSION=$(basename "$SELECTED" | grep -oE '[0-9]+\.[0-9]+') echo "🔹 Đã chọn loader: ioncube_loader_lin_${SELECTED_VERSION}.so (cho PHP $PHP_VERSION)" # --- Cảnh báo fallback (gợi ý 2) --- if [[ "$SELECTED_VERSION" != "$PHP_VERSION" ]]; then echo "⚠️ Loader không trùng khớp hoàn toàn: dùng bản $SELECTED_VERSION cho PHP $PHP_VERSION. Có thể gặp vấn đề tương thích, kiểm tra https://www.ioncube.com/loaders.php" fi # --- Copy into extension dir --- DEST_SO="$EXT_DIR/ioncube_loader_lin_${PHP_VERSION}.so" cp "$SELECTED" "$DEST_SO" chmod 644 "$DEST_SO" echo "🔸 Copy tới $DEST_SO" # --- Create mods-available conf and enable for fpm/cli (gợi ý 4: kiểm tra và thông báo nếu tạo mới) --- MODS_DIR="/etc/php/${PHP_VERSION}/mods-available" if [[ ! -d "$MODS_DIR" ]]; then echo "⚠️ Không tìm thấy $MODS_DIR, tạo mới..." mkdir -p "$MODS_DIR" fi IONCUBE_INI="${MODS_DIR}/20-ioncube.ini" echo "zend_extension=${DEST_SO}" > "$IONCUBE_INI" echo "🔸 Tạo $IONCUBE_INI" for TYPE in fpm cli; do CONF_D="/etc/php/${PHP_VERSION}/${TYPE}/conf.d" if [[ -d "$CONF_D" ]]; then ln -sf "$IONCUBE_INI" "${CONF_D}/20-ioncube.ini" echo "🔸 Enabled ioncube for $TYPE (symlink -> ${CONF_D}/20-ioncube.ini)" else echo "⚠️ Thư mục conf.d không tồn tại: $CONF_D — bỏ qua." fi done # --- Test nginx config before restart --- echo "🔹 Kiểm tra cấu hình Nginx..." if ! nginx -t &>/dev/null; then echo "❌ Cấu hình Nginx không hợp lệ. Kiểm tra /var/log/nginx/error.log" exit 1 fi # --- Restart services --- echo "🔄 Restarting php-fpm (if exists) and nginx..." if systemctl list-units --full -all | grep -q "php${PHP_VERSION}-fpm.service"; then systemctl restart "php${PHP_VERSION}-fpm" || { echo "❌ Không thể restart php${PHP_VERSION}-fpm. Xem /var/log/php${PHP_VERSION}-fpm.log" exit 1 } fi systemctl restart nginx || { echo "❌ Không thể restart nginx. Xem /var/log/nginx/error.log" exit 1 } # --- Verify loader loaded in CLI --- echo "🔹 Kiểm tra ioncube trong PHP CLI modules..." if php -m 2>/dev/null | grep -qi ioncube; then echo "✅ IonCube đã nạp trong CLI." else echo "⚠️ IonCube chưa xuất hiện trong CLI. Kiểm tra php -i | grep ioncube, hoặc xem /var/log/php${PHP_VERSION}-fpm.log" fi # --- Final check and instructions --- echo "🎉 Hoàn tất: IonCube Loader đã được cài đặt cho PHP $PHP_VERSION." echo "🔎 Kiểm tra PHP-FPM bằng cách tạo file /var/www/html/phpinfo.php với nội dung '<?php phpinfo(); ?>'" echo "Log chi tiết: $LOG_FILE" echo "=== IONCUBE INSTALL END: $(date '+%Y-%m-%d %H:%M:%S') ==="
2. Cấp quyền thực thi:
sudo chmod +x install_ioncube_webinoly_v1.0.sh
3. Chạy script:
Tự động chọn PHP mới nhất:
sudo ./install_ioncube_webinoly_v1.0.sh
Chỉ định phiên bản PHP (ví dụ: PHP 8.1):
sudo ./install_ioncube_webinoly_v1.0.sh 8.1
4. Kiểm tra kết quả:
Script hiển thị trạng thái cài đặt và ghi log vào /var/log/ioncube_install.log.
Tạo file phpinfo.php để kiểm tra qua trình duyệt:
<?php phpinfo(); ?>
Lưu file vào /var/www/html/phpinfo.php, truy cập qua trình duyệt (ví dụ: http://your-domain/phpinfo.php), và xóa file sau khi kiểm tra để đảm bảo an toàn:
sudo rm /var/www/html/phpinfo.php
5. Khắc phục sự cố
Lỗi tải file: Nếu không tải được IonCube Loader, kiểm tra URL mới nhất tại https://www.ioncube.com/loaders.php và cập nhật biến IONCUBE_URL trong script:
IONCUBE_URL="https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz"
PHP không hỗ trợ: Script cảnh báo nếu dùng PHP 8.2+, cho phép chọn tiếp tục hoặc downgrade phiên bản PHP:
sudo webinoly -php-ver=8.1
Lỗi dịch vụ: Kiểm tra log được script ghi tại:
cat /var/log/php${PHP_VERSION}-fpm.log cat /var/log/nginx/error.log
Khôi phục cấu hình: Script tự động backup cấu hình và sử dụng file 20-ioncube.ini riêng. Để gỡ cài đặt, xóa file:
sudo rm /etc/php/${PHP_VERSION}/mods-available/20-ioncube.ini sudo rm /etc/php/${PHP_VERSION}/fpm/conf.d/20-ioncube.ini sudo rm /etc/php/${PHP_VERSION}/cli/conf.d/20-ioncube.ini
Script install_ioncube_webinoly_v1.0.sh là công cụ tốt để tích hợp IonCube Loader vào server Webinoly, giúp bạn triển khai các ứng dụng PHP mã hóa như WHMCS hay plugin WordPress một cách dễ dàng và hiệu quả. Với khả năng tự động hóa, kiểm tra thông minh, và cấu hình chuẩn hóa, script này không chỉ tiết kiệm thời gian mà còn đảm bảo độ tin cậy cho các dự án hosting hoặc phát triển web. Nếu bạn cần sử dụng IonCube Loader trên Webinoly, đây là giải pháp không thể bỏ qua!