Cài đặt LCMP - Linux Caddy Mariadb PHP trên WordPress

GitHub Đây là phiên bản cài đặt LCMP Linux-Caddy-MariaDB-PHP trên WordPress, hỗ trợ sẵn HTTP/3, SSL, phiên bản cụ thể AlmaLinux 9 - Caddy v2.7.4 - PHP 7.4.33 - MariaDB 10.11.5

Có rất nhiều script auto ngoài thị trường, nhưng phần lớn chúng chỉ chạy trên các webserver như Apache, Nginx, LiteSpeed (OpenLiteSpeed) … còn Caddy thì mình chưa thấy ai viết cả script auto hoàn chỉnh nào cả

Các bài hướng dẫn cài đặt thì nhiều, nhưng chúng đều ở mức cực kì cơ bản, bài chuyên sâu nhất mình thấy là các lệnh cài đặt Caddy, MariaDB, PHP, Wordpress từ bài hướng dẫn của Teddysun

Phần lớn các câu lệnh cài đặt mình lấy từ bài hướng dẫn của Teddysun, phiên bản cài đặt bên dưới cũng là phiên bản mình đang dùng để cài đặt cho thèng bibica.net, ý tưởng ban đầu là để chạy trên VPS cấu hình thấp, giá rẻ < $5, 1 vCore, 1 GB RAM

Mình đã cố gắng chuyển mọi thứ đang dùng bên Nginx sang Caddy, nhu cầu của mình cũng ở mức cơ bản, trên Nginx chỉ dùng thêm Reverse Proxy FastCgi Cache để custom domain và cache các file ảnh từ Jetpack Photon, Cloudinary, khoản Reverse Proxy thì Caddy làm siêu tốt, nhưng cache thì không hỗ trợ, search thì thấy addon Caddy Http Cache do thành viên sillygod viết bổ xung, dùng để cache khá ổn, ai mà cấu hình chẳng chịt bên trong Nginx thì công đoạn chuyển giao cực hơn, vì gần như phải sửa lại toàn bộ

Trong trường hợp bạn muốn dùng bản PHP hay MariaDB khác hoặc dùng trên VPS nhiều vCore, nhiều RAM hơn thì chỉnh sửa lại 1 tẹo là được

Caddy chào hàng sản phẩm bằng 2 tính năng rất hiếm ở thời điểm nó ra mắt, là hỗ trợ HTTP/2 (hoặc HTTP/3 ở hiện tại) và tự động cấu hình gia hạn SSL, 2 tính năng này được bật mặc định, người dùng không cần cấu hình bất cứ dòng nào, tuy thế với mình, người đang sử dụng gần như mọi dịch vụ từ Cloudflare, nó đã có sẵn HTTP/3 và SSL, 2 tính năng chào hàng của Caddy, gần như vô dụng

Khi sử dụng thực tế, mình gặp chuyện rất quái, mà khi viết xong bài này rồi, vẫn không thể nào giải thích được

Caddy, PHP và MariaDB trên AlmaLinux 9 nó mượt một cách kì lạ, cũng phần cứng thế, cũng cấu hình PHP, MariaDB như thế, cùng data của thèng bibica.net, cùng 1 đường mạng VNPT, trên Nginx nó mượt, nhưng Caddy lại cho cảm giác mượt hơn, dù xét theo thời gian load nhanh chậm, nó gần như tương đồng

Trên Nginx thi thoảng mình gặp tình huống click chuyển trang, đôi khi nó quay khá lâu, còn trên Caddy thì 99% các lần, đều thấy chạy như ăn cướp 😀 đặc biệt là khu vực admin của WordPress, bị trí không cache, ở thao tác viết bài, lưu bài tự động, lưu bài thủ công, xem trước bài viết …. Caddy nhanh hơn rõ rệt, cảm giác cắn vào dabasera rất ngọt 😀

Về điểm này thì Caddy khá giống Litespeed, dùng cảm giác mượt, nhưng không giải thích được nó mượt là làm sao 😀 vì dựa vào các con số benchmarks thì đa phần na ná nhau cả

Ưu điểm:

Do tự cài thủ công, nên gần như muốn gì thì cài vào, có thể setup chạy trên x86_64, arm64 hay only IPv6 thoải mái, kiểm soát lỗi (nếu có) cũng đơn giản hơn, vì tự làm cả =))

Muốn cài thêm addon cho PHP, Candy cũng khá đơn giản, các câu lệnh cơ bản tương tự

Tốc độ và chịu tải khá tương đồng với các script auto đang có ngoài thị trường, các thao tác trong quản trị admin WordPress nhanh hơn khá rõ

Cấu hình trên Caddy rất ít, mở file cấu hình ra, có thể quan sát toàn bộ các cấu hình (trên Nginx dùng Centminmod nhìn cấu hình là nhũn não luôn)

Khuyết điểm:

Cái gì cũng phải …. tự cài 😀 cái gì cũng phải tự học và Google, phải copy, paste 1 đống lệnh cả khi cài đặt lẫn tạo mới trang 😛

Bản thân Caddy thì theo mình là tuyệt vời, nhưng rất nhiều tính năng, Caddy chưa hỗ trợ, thậm chí 1 tính năng khá cơ bản là cache Caddy cũng không có??? các plugin do end user tự viết thêm thì hiệu năng, tính năng, độ ổn định …. thường khá tệ

Nếu chỉ cài đặt WordPress, trên 1 trang cá nhân, quản lý thông thường thì rất đáng trải nghiệm dùng thử, nhưng nếu bạn cấu hình phức tạp phía server, phải đọc 1 đống hướng dẫn từ Caddy, siêu mất thời gian, đôi khi tính năng nào đó, trên các server khác có, mà trên Caddy lại chẳng ai thèm làm 😀

Rất nhiều bài hướng dẫn, review về Caddy nó đều quá cũ, không có tác dụng ở phiên bản hiện tại, tìm kiếm thông tin thực sự mệt mỏi, phần lớn người dùng cũng chỉ cài đặt sơ bộ, chạy ít ngày cho biết rồi dùng lại Apache, Litespeed, Nginx cho quen thuộc …. nên rất khó kiếm bài chuyên sâu nào về Caddy

Để hoàn thành phần cache ở bài viết này, ngoài chuyện xem hướng dẫn bằng tiếng Anh từ trang chủ Caddy, mình phải xem khá nhiều hướng dẫn từ 1 số thành viên người Trung Quốc và Nhật Bản, ơn trời là Google dịch sát nghĩa, đọc hiểu :]] kiểu đơn giản là add thêm plugin cho Caddy, ấn vào xem thì nó yêu cầu cài vào go, sau đó cài xcaddy, sau đó mới cài plugin đó, trong khi trong doc hướng dẫn của Caddy, dùng tùy chọn caddy add-package là chạy rồi

Bạn nào rảnh, thích ngâm cứu cái mới, có thể cài thử 😀 tạm thì mình vẫn chưa hài lòng lắm với hiệu năng Caddy Http Cache khi cache qua reverse proxy, còn lại thì ổn

Cấu hình thử nghiệm:

  1. OS: AlmaLinux 9, UpCloud 1 GB RAM - Singapore
  2. OS: AlmaLinux 9, Oracle 4-6-24 GB RAM - Singapore

Cấu hình mình dùng thử khá nhiều, từ tối thiểu 1 GB RAM tới tối đa 24 GB RAM

Bản cài đặt bên dưới mình giải thích khá nhiều, nếu bạn chỉ muốn cài nhanh gọn, chạy là được, có thể xem bản cài đặt mình dùng cho thèng haproxy.tech

Cài đặt LCMP

  • Cài đặt wget
sudo dnf install wget -y
  • Chạy trên x86_64, ARM64, IPv4 thông thường
sudo wget https://go.bibica.net/lcmp -O lcmp.sh && sudo chmod +x lcmp.sh && sudo ./lcmp.sh
  • Nếu VPS của bạn chỉ có IPv6 thì cài đặt bản này
sudo wget https://go.bibica.net/lcmp_ipv6 -O lcmp_ipv6.sh && sudo chmod +x lcmp_ipv6.sh && sudo ./lcmp_ipv6.sh
  • Thông tin Database tạo sẵn
Database Root Password: Thisisdbrootpassword
Database Name: wordpress_database_name_99999
Database User: wordpress_user_99999
Database Pass: password_pass_99999

Sau khi cài đặt xong, thông tin cơ bản của VPS nó sẽ như hình bên dưới

2023-09-27_18-15-31

  • Vào thư mục root, sẽ thấy 2 thư mục là www và caddy (set thế để vào các thư mục quan trọng nhanh hơn)
  • Mình đã tạo sẵn cấu hình cho domain bibica.net chạy WordPress, domain api.bibica.net là trang images dùng Jetpack Photon, domain i0.bibica.net và i.bibica.net dùng Cloudinary (mở ra tham khảo nếu bạn lần đầu dùng Caddy)

Cài đặt WordPress

Để demo thì mình sẽ tạo 1 trang WordPress mới với domain là lcmp.bibica.net

  • Tạo file cấu hình Caddy cho lcmp.bibica.net
nano /etc/caddy/conf.d/lcmp.bibica.net.conf
  • Điền vào nội dung bên dưới (sửa lại nội dung dòng 1-2-4-7 theo domain bạn dùng)
www.lcmp.bibica.net {
    redir https://lcmp.bibica.net{uri}
}
lcmp.bibica.net {

# Set this path to your site's directory.
    root * /var/www/lcmp.bibica.net/htdocs
# ssl cloudflare
#    tls /etc/ssl/bibica.net.pem /etc/ssl/bibica.net.key

     encode zstd gzip

    @disallowed {
       path /xmlrpc.php
        path /wp-content/uploads/*.php
    }

    rewrite @disallowed /index.php

    # Serve a PHP site through php-fpm
    php_fastcgi unix//run/php-fpm/www.sock

    
    @static {
        file
        path *.css *.js *.ico *.woff *.woff2
    }
    handle @static {
        header Cache-Control "public, max-age=31536000"
    }

    @static-img {
        file
        path *.gif *.jpg *.jpeg *.png *.svg *.webp *.avif
    }
    handle @static-img {
        header Cache-Control "public, max-age=31536000, immutable"
    }


    # Enable the static file server.
    file_server {
    precompressed zstd gzip
        index index.html
    }


    log {
        output file /var/log/caddy/ssl_access.log {
            roll_size 100mb
            roll_keep 3
            roll_keep_for 7d
        }
    }
}

Mặc định Caddy sẽ tự tạo và renew SSL + HTTP3, demo mình cũng để Caddy tự làm

Nếu thích dùng ssl ngoài như Cloudflare thì bỏ dấu # đằng trước tls /etc/ssl/bibica.net.pem /etc/ssl/bibica.net.key, chép file .pem .key của bạn vào thư mục /etc/ssl/ (tương tự cấu trúc thế là được)

  • Khởi động lại Caddy
systemctl restart caddy
  • Dùng WP-CLI để download và cài đặt WordPress cho nhanh
mkdir -p /var/www/lcmp.bibica.net/htdocs
cd /var/www/lcmp.bibica.net/htdocs
wp core download --allow-root
wp core config --dbhost=localhost --dbname=wordpress_database_name_99999 --dbuser=wordpress_user_99999 --dbpass=password_pass_99999 --allow-root
chown -R caddy:caddy /var/www/lcmp.bibica.net/htdocs
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;
  • Lúc này có thể đổi DNS, vào lcmp.bibica.net sẽ thấy có SSL, hiện ra trang cài đặt WordPress
  • Vì lý do nào đó, nếu chưa có ssl, có thể khởi động lại Caddy để tạo lại ssl
systemctl restart caddy

Cấu hình reverse proxy cho Jetpack Photon

Nếu bạn đang custom domain cho Jetpack Photon thì có thể dùng cấu hình reverse_proxy bên dưới

  • Tạo file cấu hình Caddy cho api.bibica.net
nano /etc/caddy/conf.d/api.bibicad.net.conf
  • Điền vào nội dung bên dưới
api.bibica.net {
    tls /etc/ssl/bibica.net.pem /etc/ssl/bibica.net.key
    handle_path /* {
           http_cache {
    	   cache_type in_memory
#        cache_type file 
#        path /var/www/bibica.net/cache
        match_path /
        default_max_age 3153600000s
    status_header api.bibica.net
    }
    rewrite * /img.bibica.net/{uri}
    reverse_proxy https://i0.wp.com {
    header_up Host {upstream_hostport}
    }
    }
}

Mình đang sử dụng thêm addon Caddy Http Cache để cache cho Caddy (với mong muốn tốc độ sẽ nhanh hơn)

cache_type in_memory là đang lưu cache trực tiếp vào RAM, trong trường hợp bạn muốn lưu cache vào ổ cứng thì xóa dòng đó đi, xóa tiếp dấu # ở 2 dòng # cache_type file # path /var/www/bibica.net/cache để chuyển sang lưu trên ổ cứng

status_header là tiêu đề cache, báo HIT, MISS …

match_path / là cache tất cả mọi thứ, do trên domain api.bibica.net chỉ dùng ảnh từ Jetpack Photon, nên mình cấu hình như thế

Giá trị rewritereverse_proxy thì đổi lại theo link Jetpack Photon của bạn

Cấu hình reverse proxy cho Cloudinary

Nếu bạn đang custom domain cho Cloudinary thì có thể dùng cấu hình reverse_proxy bên dưới

  • Tạo file cấu hình Caddy cho i.bibica.net
nano /etc/caddy/conf.d/i.bibicad.net.conf
  • Điền vào nội dung bên dưới
i.bibica.net {
header -Cache-Control
header -server-timing
header -Content-Disposition
header -Content-Type
header -Vary
header -accept-ranges
header -access-control-allow-origin
header -access-control-expose-headers
header -content-dpr
header -etag
header -last-modified
header -timing-allow-origin
header -x-content-type-options
header -x-request-id
header Cache-Control "public, max-age=315360000, immutable"

    tls /etc/ssl/bibica.net.pem /etc/ssl/bibica.net.key
    

    handle_path /* {
    http_cache {
    	cache_type in_memory
#        cache_type file 
#        path /var/www/bibica.net/cache
        match_path /
        default_max_age 3153600000s
    status_header i.bibica.net
    }
    rewrite * /xinclub/f_webp,q_auto:best/img/{uri}
    reverse_proxy https://res.cloudinary.com {
    header_up Host {upstream_hostport}
}
}
}

Tương tự như cấu hình cho Jetpack Photon, mình chỉ bổ xung thêm các giá trị header - là xóa dòng header đó đi

Sử dụng thực tế hàng ngày thì có thể cài thêm

  1. Releem tự cấu hình cho MySQL
  2. Monitor service PHP, Mysql, Nginx giúp tự khởi động lại dịch vụ nếu chẳng may lỗi xảy ra

Việc cài đặt căn bản là như thế, các bước bên dưới chủ yếu giải thích thêm các câu lệnh, dành cho bạn nào quan tâm, có thể tự cấu hình các phiên bản riêng theo ý thích

Giải thích các lệnh bên trong file setup x86_64, ARM64

  • IPv4 thông thường thì dùng nameserver Google và Cloudflare
# Set nameserver google, cloudflare
echo -e "nameserver 8.8.8.8\nnameserver 1.1.1.1" > /etc/resolv.conf
  • IPv6 thì dùng nameserver trex.fi
# Set nameserver trex.fi
echo -e "nameserver 2001:67c:2b0::4\nnameserver 2001:67c:2b0::6" > /etc/resolv.conf
  • Cập nhập OS và cài đặt 1 số thứ râu ria
# Update
sudo dnf update -y
sudo dnf install epel-release -y
sudo dnf install htop -y
sudo dnf install zip -y
sudo dnf install unzip -y
sudo dnf install screen -y
sudo dnf install wget -y
  • Đổi về giờ Việt Nam
# Set time Viet Nam
timedatectl set-timezone Asia/Ho_Chi_Minh
  • Bật BBR
# Enable TCP BBR congestion control
cat <<EOF > /etc/sysctl.conf
# TCP BBR congestion control
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
EOF
  • Tạo 2GB RAM ảo
# swapfile
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo cp /etc/fstab /etc/fstab.bak
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
sudo sysctl vm.swappiness=10
  • Tắt SELINUX
# SELINUX=disabled
sed -i 's@^SELINUX.*@SELINUX=disabled@g' /etc/selinux/config
setenforce 0
  • Tắt firewall
# Off Firewall
sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo systemctl mask --now firewalld
  • Cài đặt Caddy và addon cdp-cache
# Setup Caddy
dnf install -y dnf-plugins-core
dnf copr enable @caddy/caddy -y && dnf install -y caddy && caddy version
caddy add-package github.com/sillygod/cdp-cache

mkdir -p /data/www/default
mkdir -p /var/log/caddy/
mkdir -p /etc/caddy/conf.d/
chown -R caddy.caddy /data/www/default
chown -R caddy.caddy /var/log/caddy/
wget --no-check-certificate https://raw.githubusercontent.com/bibicadotnet/LCMP-bibicad.net/main/Caddy/Caddyfile -O /etc/caddy/Caddyfile

Nếu bạn muốn cài thêm addon khác thì dùng cấu trúc tương tự caddy add-package github.com/sillygod/cdp-cache

  • Cài đặt Mariadb 10.11
# Setup mariadb 10.11
wget -qO mariadb_repo_setup.sh https://downloads.mariadb.com/MariaDB/mariadb_repo_setup
chmod +x mariadb_repo_setup.sh
./mariadb_repo_setup.sh --mariadb-server-version=mariadb-10.11
dnf install -y MariaDB-common MariaDB-server MariaDB-client MariaDB-shared MariaDB-backup
lnum=$(sed -n '/\[mariadb\]/=' /etc/my.cnf.d/server.cnf)
sed -i "${lnum}acharacter-set-server = utf8mb4\n\n\[client-mariadb\]\ndefault-character-set = utf8mb4" /etc/my.cnf.d/server.cnf
systemctl start mariadb
db_pass_root="Thisisdbrootpassword"
mysql -e "grant all privileges on *.* to root@'127.0.0.1' identified by \"${db_pass_root}\" with grant option;"
mysql -e "grant all privileges on *.* to root@'localhost' identified by \"${db_pass_root}\" with grant option;"
mysql -uroot -p${db_pass_root} 2>/dev/null <<EOF
drop database if exists test;
delete from mysql.db where user='';
delete from mysql.db where user='PUBLIC';
delete from mysql.user where user='';
delete from mysql.user where user='mysql';
delete from mysql.user where user='PUBLIC';
flush privileges;
exit
EOF
systemctl stop mariadb

Nếu dùng bản Mariadb khác thì thay mariadb-10.11 bằng con số đó

  • Cài đặt PHP 7.4
# Setup php 7.4
dnf config-manager --set-enabled crb
dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm
dnf module reset -y php
dnf module install -y php:remi-7.4
dnf install -y php-cli php-bcmath php-embedded php-gd php-imap php-mysqlnd php-dba php-pdo php-pdo-dblib php-pgsql php-odbc php-enchant php-gmp php-intl php-ldap php-snmp php-soap php-tidy php-opcache php-process php-pspell php-shmop php-sodium php-ffi php-brotli php-lz4 php-xz php-zstd
dnf install -y php-pecl-imagick-im7 php-pecl-zip php-pecl-mongodb php-pecl-grpc php-pecl-yaml php-pecl-uuid php-zip
chown root.caddy /var/lib/php/session
chown root.caddy /var/lib/php/wsdlcache
chown root.caddy /var/lib/php/opcache

Muốn dùng bản PHP 8.2 thì thay remi-7.4 thành remi-8.2

Các module

  • Tối ưu 1 số giá trị PHP, MariaDB
# Optimization PHP, MariaDB
wget --no-check-certificate https://raw.githubusercontent.com/bibicadotnet/LCMP-bibicad.net/main/PHP/php.ini -O /etc/php.ini
wget --no-check-certificate https://raw.githubusercontent.com/bibicadotnet/LCMP-bibicad.net/main/PHP/www.conf -O /etc/php-fpm.d/www.conf
wget --no-check-certificate https://raw.githubusercontent.com/bibicadotnet/LCMP-bibicad.net/main/MySQL/my.cnf -O /etc/my.cnf

Các thay đổi PHP khá cơ bản, tăng thời gian chạy các file php, tăng giới hạn upload file, không giới hạn hàm nào

opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=100000
opcache.max_wasted_percentage=10
pm.max_children = 6
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 4

Về MariaDB, thông số cụ thể tại đây

  • Nếu dùng VPS nhiều vCore, nhiều RAM hơn thì có thể tăng opcache lên
opcache.memory_consumption=1024
opcache.interned_strings_buffer=128

FPM Configuration đổi sang dùng static

pm = static
pm.max_children = 8

Giá trị pm.max_children bằng vCore x2, 4 vCore thì pm.max_children = 8

MariaDB cứ dùng bản mặc định như cài đặt, sau đó cài thêm Releem để tự cấu hình là đủ

  • Tạo link rút gọn cho 2 thư mục /var/www và /etc/caddy (chuyển nó vào thư mục root)
# Create symbolic link
ln -s /var/www /root/
ln -s /etc/caddy /root/
  • Bật các dịch vụ và tự khởi động sau khi reboot
# start
systemctl enable mariadb
systemctl enable php-fpm
systemctl enable caddy
systemctl start mariadb
systemctl start php-fpm
systemctl start caddy
  • Tạo ssl và file cấu hình caddy mẫu trên domain bibica.net, api.bibica.net, i0.bibica.net, i.bibica.net (phần này không quan trọng)
# setup ssl
mkdir -p /etc/ssl/
sudo wget --no-check-certificate https://raw.githubusercontent.com/bibicadotnet/LCMP-bibicad.net/main/ssl/bibica.net.pem -O /etc/ssl/bibica.net.pem
sudo wget --no-check-certificate https://raw.githubusercontent.com/bibicadotnet/LCMP-bibicad.net/main/ssl/bibica.net.key -O /etc/ssl/bibica.net.key

# setup bibica.net, api.bibica.net, i0.bibica.net, i.bibica.net
mkdir -p /var/www/bibica.net/cache
chown -R caddy:caddy /var/www/bibica.net/cache
sudo wget --no-check-certificate https://raw.githubusercontent.com/bibicadotnet/LCMP-bibicad.net/main/bibica-net-caddy-config/bibica.net.conf -O /etc/caddy/conf.d/bibica.net.conf
sudo wget --no-check-certificate https://raw.githubusercontent.com/bibicadotnet/LCMP-bibicad.net/main/bibica-net-caddy-config/api.bibica.net.conf -O /etc/caddy/conf.d/api.bibica.net.conf
sudo wget --no-check-certificate https://raw.githubusercontent.com/bibicadotnet/LCMP-bibicad.net/main/bibica-net-caddy-config/i0.bibica.net.conf -O /etc/caddy/conf.d/i0.bibica.net.conf
sudo wget --no-check-certificate https://raw.githubusercontent.com/bibicadotnet/LCMP-bibicad.net/main/bibica-net-caddy-config/i.bibica.net.conf -O /etc/caddy/conf.d/i.bibica.net.conf
systemctl restart caddy
  • Cài đặt WP-CLI và Rclone
# setup wp-cli
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar
mv wp-cli.phar /usr/local/bin/wp

# setup rclone
sudo -v ; curl https://rclone.org/install.sh | sudo bash
  • Demo tạo crontab cho wp_cron and simply-static
# setup crontab cho wp_cron and simply-static
crontab -l > simply-static
echo "0 3 * * * /usr/local/bin/wp --path='/var/www/bibica.net/htdocs' simply-static run --allow-root" >> simply-static
echo "*/1 * * * * curl https://bibica.net/wp-cron.php?doing_wp_cron > /dev/null 2>&1" >> simply-static
crontab simply-static

Set 1 phút chạy 1 lần wp_cron, 3h sáng hàng ngày tự chạy simply-static

  • Tạo database
# setup database
db_pass_root="Thisisdbrootpassword"
db_name="wordpress_database_name_99999"
db_user="wordpress_user_99999"
db_pass="password_pass_99999"
mysql -uroot -p${db_pass_root} -e "CREATE DATABASE ${db_name} DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"
mysql -uroot -p${db_pass_root} -e "GRANT ALL ON ${db_name}.* TO '${db_user}'@'localhost' IDENTIFIED BY '${db_pass}'"

Bạn có thể dùng cấu trúc tượng tự như thế, nếu muốn tạo thêm database khác, đổi db_name, db_user, db_pass sang giá trị khác

  • Tạo thư mục cài đặt WordPress, phân quyền ….
# make foder bibica.net
mkdir -p /var/www/bibica.net/htdocs
cd /var/www/bibica.net/htdocs
# wp core download --allow-root
# wp core config --dbhost=localhost --dbname=$db_name --dbuser=$db_user --dbpass=$db_pass --allow-root
chown -R caddy:caddy /var/www/bibica.net/htdocs
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;

Quan trọng nhất là dòng chown -R caddy:caddy /var/www/bibica.net/htdocs, để Caddy có thể truy xuất các file và thư mục, phân quyền các thư mục, file bên trong thì thật ra WordPress cũng tự quản lý được cả 😀

  • Hiện thông tin database
# show info database
green() {
  echo -e '\e[32m'$1'\e[m';
}
green "Database Root Password: $db_pass_root\nDatabase Name: $db_name\nDatabase User: $db_user\nDatabase Pass: $db_pass"

Đoạn này tô xanh phần thông tin database vừa tạo ra cho dễ nhìn, tiện copy điền các thông tin vào WordPress thôi

Hiệu năng và các vấn đề

Hiện tại mình dùng Cache Rules Cloudflare để tạo cache cho toàn trang, nên không còn quan tâm tới chuyện cấu hình phía server lắm, đủ dùng cho khoảng 5-10 kết nối cùng lúc là quá thừa ở sử dụng thực tế, tại khó có chuyện thèng bibica.net trong 1s có 5-10 comment, mà chuyện này thì bạn cài đặt mặc định đã đáp ứng được 😀

Nếu không có bài này, sợ ít ai biết là thèng bibica.net bữa giờ đang chạy qua Caddy và thèng api.bibica.net, i0.bibica.net, i.bibica.net đang chạy qua Caddy Http Cache á 😀

Nếu thích, bạn cũng có thể thử hiệu năng của phiên bản LCMP, bằng cách cài vào 1 trang WordPress mặc định, trên cùng 1 cấu hình, sau đó so với các tool, script auto chạy Apache, Nginx, LiteSpeed (OpenLiteSpeed) … mình thử sơ bộ thì thấy khá tương đồng với Webinoly, 100 kết nối mỗi giây trên WordPress mặc định tốc độ trung bình ~ 3.4s

2023-09-27_19-25-10

Trên Caddy việc cấu hình siêu đơn giản, nhưng vấn đề là bạn phải …. biết, bạn không biết thì nó quá là phức tạp, vì phải tìm hiểu gần như mọi thứ, quan trọng nhất là số lượng người dùng Caddy không nhiều, chỉ rộ lên ở giai đoạn 2017-2021 …. khi mình search thì thấy các bài viết xuất bản ờ 2022-2023 rất ít

Các file cấu hình Caddy bên trên, liên quan tới reverse_proxy, rewrite, handle_path, http_cache … nhìn vào bạn sẽ thấy nó siêu ngắn, tầm 10-15 dòng code, trên Nginx chức năng tương tự thì đa phần ~100 dòng, thậm chí file cấu hình WordPress trên Caddy có thể rút gọn xuống 20-30 dòng, rất dễ để đọc

Vấn đề là trên Nginx, nó quá thông dụng, nên các code mẫu đầy ra 😀 google phát hướng dẫn tận răng, copy paste là xong 😛 thậm chí rất nhiều tool, script auto, tự động cấu hình cài đặt sẵn, bạn không phải chỉnh sửa dòng code nào luôn

Trên Caddy thực tế thì mình mất khá nhiều thời gian để nhét dòng nào vào …. vị trí nào 😀 tại nhét không đúng vị trí là văng lỗi ^_^ dựa vào thời gian chụp tấm ảnh trên, thì thời gian hoàn thành bài này, mất khoảng 4-6 ngày cho các đoạn code liên quan tới cache, vì mình cũng chịu, chẳng biết addon cache nào chạy đúng ý, cứ phải cài vào, xem doc, nhét từng dòng vào theo cách tác giả viết … sau đó chạy thử nghiệm hiệu năng …..

Sử dụng thì mình thấy mọi tính năng mà Caddy có, đều vận hành rất tốt, còn những thứ mà Cadddy không có, thì nó thực sự tệ

Khá nhiều thứ Caddy xử lý không nổi, cụ thể nhất về công nghệ nén BR mà hiện tại Cloudflare đang dùng, mình đọc lướt thì Caddy không xử lý được, thời gian nén file còn lâu hơn cả thời gian load trực tiếp file thì chịu rồi 😛

Hay như vấn đề cache, Nginx có FastCgi Cache, hiệu năng mạnh, tính năng phong phú, Caddy cũng làm không nổi, phiên bản cache-handler của họ, sửa lại từ bản gốc của Souin, hay như phiên bản Caddy Http Cache mình đang dùng ở bài này, so sánh với FastCgi Cache trên tình huống cụ thể là cache ảnh dạng tĩnh qua reverse proxy, sau đó load qua Cloudflare thì chậm hơn khoảng 0.2-0.4s khi load cùng lúc khoảng 100 tấm ảnh (do test trực tiếp bằng đường truyền mạng, nên sai số có thể có), ở điều kiện load cùng lúc 10-30 tấm ảnh thì khá tương đồng, đôi lúc cảm giác Caddy Http Cache nhanh hơn FastCgi Cache 1 tẹo không đáng kể

Đấy là mình chưa bàn chuyện cache cho 1 trang động như WordPress nhé, mình có thử search Caddy cache WordPress thì không ra 1 bài hướng dẫn nào để làm luôn, phần lớn các bài viết cũ, đều chỉ nói mài dùng Caddy cache file tĩnh thôi, đừng cache mí trang động, bọn teo chưa xử lý được :]]

Google thêm 1 chút thì mình thấy đa phần mọi người dùng Caddy để làm reverse proxy trên Docker là chính, vì nó tự tạo ssl nhàn 😀 thực tế trang file.bibica.net mình cũng setup kiểu này cho nhàn 😀

Còn dùng thuần Caddy như một webserver để chạy web thì cực ít luôn

Quan trọng nhất là vấn đề lòng tin, một webserver ra mắt từ 2015, sau 8 năm phát triển mà các tính năng cơ bản nhất vẫn chưa có (hoặc chưa đi vào ổn định), tính năng, sửa lỗi liên tục như thế thì gần như không trang thương mại, cơm gạo nào dám dùng

Tổng kết

Mình vẫn rất có thiện cảm với Caddy, vì với người không biết tí gì về webserver như mình, đọc cấu hình Nginx hay Caddy không khác gì cả, đều phải google đủ kiểu 😛 Caddy đọc ít và ngắn hơn, dễ quan sát hơn 😛 hiệu năng ở các phiên bản hiện tại rất tốt, thực sự mượt mà, dùng trên các trang cá nhân, nghịch phá thì mình hoan nghênh, vì khá là vui 😀 trên các trang cần ổn định thì cứ như trước giờ là được, không cần đú Caddy làm gì cho phiền

Do đây là lần đầu tiên mình cấu hình toàn bộ phần server, nên bài này hơi dài dòng, và mang tính nói nhảm khá nhiều 😀

Update

08/10/2023: sử dụng cài đặt mặc định MySQL từ CloudPanel (hiệu năng liên quan tới database tốt hơn)

Comment policy: We love comments and appreciate the time that readers spend to share ideas and give feedback.
Notes: However, those deemed to be spam or solely promotional will be deleted.

You can create a Gravatar account, add avatar, then use that email to comment here, your account will have a more beautiful Avatar, easier to recognize with other members.

Please use real emails, you can receive notifications when comments are replied