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!
