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
- Tạo file mới, ví dụ:
setup_ols_auto.sh - Dán nội dung script vào file
- Chỉnh lại biến ở phần đầu cho phù hợp
- Chạy lệnh:
bash setup_ols_auto.sh - Kiểm tra phản hồi HTTP:
curl -I -H "Host: your-domain.com" http://127.0.0.1Nếu hiển thị
HTTP/1.1 200 OK→ hệ thống hoạt động bình thường. - 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