Script cài tự động OpenLiteSpeed + vHost + PHP + MariaDB/WordPress/HTTPS

Phần này giới thiệu một script triển khai tự động giúp cài đặt OpenLiteSpeed, PHP, Virtual Host, và các thành phần tùy chọn như MariaDB, WordPress, hoặc chứng chỉ SSL — tất cả trong một lần chạy. Mục tiêu là đạt cấu hình ổn định, có thể lặp lại, không cần thao tác thủ công qua WebAdmin.

Script cài tự động OpenLiteSpeed + vHost + PHP + MariaDB/WordPress/HTTPS

1. Mục tiêu

Script được thiết kế theo hướng idempotent — chạy nhiều lần vẫn cho cùng một trạng thái, không trùng cấu hình, không phát sinh lỗi “đã tồn tại”. Các bước bao gồm:

  • Cài đặt OpenLiteSpeed và PHP 8.3 (bỏ qua ext không có trong repo)
  • Tạo Virtual Host, logs, rewrite, index và ánh xạ vào listener port 80
  • Cấu hình PHP handler tự động nhận diện phiên bản lsphp có sẵn
  • Tùy chọn cài MariaDB và tạo database/user phục vụ ứng dụng
  • Tùy chọn triển khai WordPress tự động
  • Tùy chọn cấp chứng chỉ Let’s Encrypt và kích hoạt HTTPS
  • Tự kiểm tra phản hồi HTTP để xác nhận trạng thái hệ thống

2. Chuẩn bị

  • Ubuntu 24.04 mới, chưa cài Apache hoặc Nginx
  • Domain hoặc subdomain đã trỏ A record về IP máy chủ
  • Truy cập SSH có quyền sudo
  • Nếu sử dụng Cloudflare, nên tạm tắt proxy (mây xám) khi cài đặt

3. Cấu trúc script

Phần đầu chứa các biến cấu hình cần chỉnh; phần sau là logic xử lý tự động. Chỉ cần sửa vài dòng để phù hợp với môi trường cụ thể.

#!/usr/bin/env bash
set -euo pipefail

#####################################
# === CONFIGURATION SECTION ===     #
#####################################
DOMAIN="example.com"             # Tên miền hoặc subdomain
ADMIN_EMAIL="[email protected]"  # Email để đăng ký chứng chỉ Let's Encrypt
PHP_VERSION="lsphp83"            # Phiên bản PHP sử dụng cho OLS
DB_NAME="wp_${DOMAIN//./_}"      # Tên database WordPress
DB_USER="wp_${DOMAIN//./_}"      # Tên user MariaDB
DB_PASS="$(openssl rand -hex 12)"# Tự động sinh mật khẩu MariaDB
SRVROOT="/usr/local/lsws"
VHROOT="$SRVROOT/$DOMAIN"
VHCONF_DIR="$SRVROOT/conf/vhosts/$DOMAIN"
VHCONF_FILE="$VHCONF_DIR/vhconf.conf"
HTTPD_CONF="$SRVROOT/conf/httpd_config.conf"
ENV_OUT="/root/ols-${DOMAIN}.env"
#####################################

apt_update_once() {
  if [ ! -f /tmp/.apt_updated ]; then
    sudo apt-get update -y
    touch /tmp/.apt_updated
  fi
}

apt_install_safe() {
  for p in "$@"; do
    sudo apt-get install -y "$p" && echo "installed $p" || echo "skip $p"
  done
}

detect_lsphp_path() {
  if [ -x "$SRVROOT/$PHP_VERSION/bin/lsphp" ]; then
    echo "$SRVROOT/$PHP_VERSION/bin/lsphp"
  else
    find "$SRVROOT" -maxdepth 2 -type f -path "*/bin/lsphp" | head -n1 || true
  fi
}

echo "==> 0) Stop possible conflicting services"
sudo systemctl stop apache2 nginx || true
sudo systemctl disable apache2 nginx || true

echo "==> 1) Install prerequisites and OpenLiteSpeed"
apt_update_once
apt_install_safe wget curl unzip software-properties-common ufw ca-certificates
if ! command -v lswsctrl >/dev/null 2>&1; then
  sudo wget -O /tmp/repo.litespeed.sh https://repo.litespeed.sh
  sudo bash /tmp/repo.litespeed.sh
  apt_update_once
  sudo apt-get install -y openlitespeed
fi

echo "==> 2) Install PHP and extensions"
apt_install_safe $PHP_VERSION
apt_install_safe ${PHP_VERSION}-common ${PHP_VERSION}-mysql ${PHP_VERSION}-curl \
  ${PHP_VERSION}-opcache ${PHP_VERSION}-dev ${PHP_VERSION}-gd ${PHP_VERSION}-xml \
  ${PHP_VERSION}-zip ${PHP_VERSION}-mbstring ${PHP_VERSION}-intl ${PHP_VERSION}-imap ${PHP_VERSION}-redis

echo "==> 3) Create vHost structure"
sudo mkdir -p "$VHROOT/html" "$VHROOT/logs" "$VHCONF_DIR"
sudo tee "$VHCONF_FILE" >/dev/null <<'EOF'
docRoot $VH_ROOT/html/
index  {
  useServer 0
  indexFiles index.php, index.html
}
errorlog $VH_ROOT/logs/error.log {
  logLevel NOTICE
}
accesslog $VH_ROOT/logs/access.log {
  logFormat "%h %l %u %t \"%r\" %>s %b"
  rollingSize 10M
}
context / {
  allowBrowse 1
}
rewrite  {
  enable 1
  autoLoadHtaccess 1
}
EOF

echo "<?php phpinfo();" | sudo tee "$VHROOT/html/index.php" >/dev/null
sudo chown -R lsadm:lsadm "$VHROOT" "$VHCONF_DIR"
sudo chmod 755 "$VHROOT/html" && sudo chmod 750 "$VHROOT/logs" "$VHCONF_DIR"

echo "==> 4) Configure virtualhost and listener"
grep -q "virtualhost $DOMAIN" "$HTTPD_CONF" || sudo tee -a "$HTTPD_CONF" >/dev/null <<EOF

virtualhost $DOMAIN {
  vhRoot $VHROOT/
  configFile \$SERVER_ROOT/conf/vhosts/$DOMAIN/vhconf.conf
}
EOF

TMP_CONF=$(mktemp)
sudo awk -v domain="$DOMAIN" '
BEGIN{inblk=0}
{
  if ($1=="listener" && $2=="Default" && $3=="{"){
    inblk=1
    print "listener Default {"
    print "  address *:80"
    print "  secure 0"
    print "  map " domain " " domain
    while (getline>0) { if ($0 ~ /^}/) break; }
    print "}"
  } else { print }
}
' "$HTTPD_CONF" > "$TMP_CONF"
grep -q "^listener Default" "$TMP_CONF" || cat >> "$TMP_CONF" <<EOF

listener Default {
  address *:80
  secure 0
  map $DOMAIN $DOMAIN
}
EOF
sudo mv "$TMP_CONF" "$HTTPD_CONF"

echo "==> 5) Register PHP external app"
LSPHP_BIN=$(detect_lsphp_path)
if [ -n "$LSPHP_BIN" ]; then
  grep -q "extProcessor lsphp_auto" "$HTTPD_CONF" || sudo tee -a "$HTTPD_CONF" >/dev/null <<EOF

extProcessor lsphp_auto {
  type lsapi
  address uds://tmp/lshttpd/lsphp.sock
  maxConns 35
  env PHP_LSAPI_CHILDREN=35
  initTimeout 60
  persistConn 1
  path $LSPHP_BIN
  instances 1
  memSoftLimit 2047M
  memHardLimit 2047M
}
scriptHandler {
  add suffix php lsphp_auto
}
EOF
fi

echo "==> 6) Firewall and service setup"
sudo ufw allow 22/tcp 80/tcp 443/tcp 7080/tcp >/dev/null 2>&1 || true
sudo systemctl enable lshttpd || true
sudo systemctl restart lshttpd

echo "==> 7) Install MariaDB and create database"
sudo apt-get install -y mariadb-server mariadb-client
sudo systemctl enable mariadb || true
sudo systemctl restart mariadb
sudo mysql -e "CREATE DATABASE IF NOT EXISTS \\\`$DB_NAME\\\` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
sudo mysql -e "CREATE USER IF NOT EXISTS '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASS';"
sudo mysql -e "GRANT ALL PRIVILEGES ON \\\`$DB_NAME\\\`.* TO '$DB_USER'@'localhost'; FLUSH PRIVILEGES;"
echo -e "DB_NAME=$DB_NAME\nDB_USER=$DB_USER\nDB_PASS=$DB_PASS" | sudo tee "$ENV_OUT" >/dev/null

echo "==> 8) Deploy WordPress"
sudo apt_install_safe curl tar rsync
cd "$VHROOT/html"
sudo rm -rf wp-* index.php readme.html license.txt || true
sudo curl -sL https://wordpress.org/latest.tar.gz -o /tmp/wp.tgz
sudo tar -xzf /tmp/wp.tgz -C /tmp
sudo rsync -a /tmp/wordpress/ "$VHROOT/html/"
sudo rm -rf /tmp/wordpress /tmp/wp.tgz
sudo cp wp-config-sample.php wp-config.php
sudo sed -i "s/database_name_here/$DB_NAME/" wp-config.php
sudo sed -i "s/username_here/$DB_USER/" wp-config.php
sudo sed -i "s/password_here/$DB_PASS/" wp-config.php
SALTS=$(curl -s https://api.wordpress.org/secret-key/1.1/salt/ || true)
[ -n "$SALTS" ] && sudo awk -v r="$SALTS" '
  BEGIN{printed=0}
  /AUTH_KEY|SECURE_AUTH_KEY|LOGGED_IN_KEY|NONCE_KEY/ {if(!printed){print r; printed=1} next}
  {print}
' wp-config.php > tmp && sudo mv tmp wp-config.php
sudo chown -R lsadm:lsadm "$VHROOT/html"

echo "==> 9) Enable HTTPS (Let's Encrypt)"
sudo apt-get install -y certbot
sudo certbot certonly --webroot -w "$VHROOT/html" -d "$DOMAIN" -m "$ADMIN_EMAIL" --agree-tos -n || true
if [ -f "/etc/letsencrypt/live/$DOMAIN/fullchain.pem" ]; then
  grep -q "^listener SSL" "$HTTPD_CONF" || sudo tee -a "$HTTPD_CONF" >/dev/null <<EOF

listener SSL {
  address *:443
  secure 1
  keyFile /etc/letsencrypt/live/$DOMAIN/privkey.pem
  certFile /etc/letsencrypt/live/$DOMAIN/fullchain.pem
  map $DOMAIN $DOMAIN
}
EOF
  sudo systemctl restart lshttpd
else
  echo "WARN: SSL cert not found; check DNS or rerun certbot manually."
fi

echo "==> 10) Final check"
set +e
curl -I -H "Host: $DOMAIN" http://127.0.0.1 | head -n1
set -e
echo "Deployment complete!"
echo "HTTP:  http://$DOMAIN/"
echo "HTTPS: https://$DOMAIN/"
echo "Database credentials saved at: $ENV_OUT"

Phần thân script sẽ:

  • Dừng Apache/Nginx nếu có
  • Cài repo LiteSpeed và gói openlitespeed
  • Cài PHP (chỉ những ext tồn tại trong repo, không fail nếu thiếu)
  • Tạo Virtual Host, logs, cấu hình rewrite, index, và map listener
  • Cấu hình PHP handler (lsphp_auto)
  • Tùy chọn: MariaDB, WordPress, SSL

4. Cách sử dụng

  1. Tạo file mới, ví dụ: setup_ols_auto.sh
  2. Dán nội dung script vào file
  3. Chỉnh lại biến ở phần đầu cho phù hợp
  4. Chạy lệnh:
    bash setup_ols_auto.sh
  5. Kiểm tra phản hồi HTTP:
    curl -I -H "Host: your-domain.com" http://127.0.0.1

    Nếu hiển thị HTTP/1.1 200 OK → hệ thống hoạt động bình thường.

  6. Truy cập trình duyệt:
    http://your-domain.com

5. Điểm nổi bật

  • Không cần WebAdmin: tất cả cấu hình được tạo trực tiếp trong file.
  • Không lỗi 521 hoặc 404: listener và vhost được map chính xác.
  • Tự động khôi phục: có thể chạy lại nhiều lần để sửa hoặc cập nhật cấu hình.
  • Không bị gãy khi thiếu package: ext không có trong repo sẽ được bỏ qua.
  • PHP handler tự động: phát hiện và dùng lsphp83 hoặc phiên bản khác sẵn có.
  • Tùy chọn linh hoạt: cài MariaDB, WordPress và HTTPS tùy theo nhu cầu.

6. Lỗi phổ biến và cách xử lý

  • Thiếu lsphp83-gd, lsphp83-xml, … — một số repo Ubuntu 24.04 không build đủ ext. Script đã xử lý tự động, chỉ cần PHP core vẫn hoạt động.
  • Lỗi “Refusing to operate on alias lsws.service” — OpenLiteSpeed sử dụng service thật là lshttpd, script đã đổi đúng.
  • Cloudflare báo 521 — nguyên nhân do proxy bật trước khi có HTTPS hợp lệ. Chuyển sang DNS-only, test HTTP trước khi kích hoạt SSL.

7. Tùy chọn nâng cao

  • Bật LSCache – sau khi WordPress hoạt động, cài plugin LiteSpeed Cache để tận dụng full performance.
  • Kích hoạt HTTP/3 – tự động bật khi HTTPS chạy.
  • Tự động gia hạn SSL:
    sudo crontab -e
    # thêm dòng:
    0 3 * * * certbot renew --quiet && systemctl reload lshttpd

Kết luận

Script này biến một máy Ubuntu trống thành hệ thống web hoàn chỉnh sử dụng OpenLiteSpeed, PHP và WordPress trong vài phút. Cấu hình được kiểm soát trực tiếp qua file, tối ưu cho tốc độ và độ ổn định.

Bình luận


  • Không có bình luận.

Init Toolbox

Nhấn Ctrl + \ trên máy tính, hoặc vuốt sang trái ở bất kỳ đâu trên mobile.

Đăng nhập





Đang tải...