Lưu ý: để phòng tránh lỗi, chỉ áp dụng hướng dẫn này trên các website thử nghiệm của bạn. Sau khi thành thạo, và hiểu rõ hơn, bạn có thể áp dụng lên các website chính thức. Caddy web server dù dễ học, dễ làm theo, nhưng nó vẫn cần thời gian để bạn làm quen.
–
Caddy web server cũng là máy chủ web như Nginx hay Apache, LiteSpeed. Tuy nhiên nó có đặc điểm là dễ cài đặt hơn hẳn, trong đó có việc cấp phát https (SSL) diễn ra rất trơn tru, file cấu hình có cấu trúc đơn giản, dễ hiểu. Hôm nay chúng ta sẽ thực hành cài Caddy, rồi cài WordPress trên đó. Nếu ai từng có kinh nghiệm khổ sở khi cài Nginx thế nào, thì sẽ cảm thấy sung sướng ra sao với Caddy!
Caddy có thể cài trên rất nhiều OS khác nhau, bài demo này chúng ta cài trên Ubuntu 24.04 LTS.
Yêu cầu kiến thức nền: Có hiểu biết cơ bản về cách dùng terminal console (giao diện dòng lệnh) với VPS, có thể là các terminal sẵn có luôn qua giao diện web của VPS (noVNC), hoặc các terminal console được kết nối thông qua phần mềm như PuTTY.
A. Cài Caddy
Hướng dẫn cho phần A này, cài Caddy trên Ubuntu/Debian, được tham khảo từ hướng dẫn chính thức.
1. Cập nhật hệ thống
sudo apt update && sudo apt upgrade -y
2. Cài đặt các gói phụ thuộc
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
3. Thêm Repository
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg && curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
Cấp thêm quyền cho các tiến trình khác (dưới quyền root) có quyền đọc tệp chứa khóa công khai GPG & tệp định nghĩa của kho Caddy.
chmod o+r /usr/share/keyrings/caddy-stable-archive-keyring.gpg && chmod o+r /etc/apt/sources.list.d/caddy-stable.list
4. Cài Caddy
Lặp lại lệnh sudo apt update vì có thêm các gói mới từ Repository của Caddy.
sudo apt update && sudo apt install caddy -y
5. Mở cổng 80 và 443
Các cổng này phục vụ cho mục đích truy cập web.
sudo ufw allow 80 && sudo ufw allow 443 && sudo ufw reload
B. Cài PHP & Database (MariaDB)
1. Cài PHP & MariaDB
1a. Cài PHP
Sử dụng kho PHP từ Ondřej Surý, dùng kho lưu trữ chất lượng này có ưu điểm là chúng ta chỉ định được phiên bản PHP muốn cài thay vì phụ thuộc vào phiên bản mặc định hiện tại của bản Ubuntu đang dùng:
sudo apt update && sudo apt install -y lsb-release ca-certificates apt-transport-https software-properties-common && sudo add-apt-repository ppa:ondrej/php -y && sudo apt update
Cài PHP v8.3:
sudo apt install -y php8.3-fpm php8.3-mysql php8.3-curl php8.3-gd php8.3-mbstring php8.3-xml php8.3-zip php8.3-imagick php8.3-intl php8.3-bcmath
1b. Cài MariaDB
sudo apt install mariadb-server
Nhập Y nếu nó hỏi.
2. Dọn dẹp database mặc định
2.1 Đi vào các thiết lập an toàn hơn cho database
sudo mysql_secure_installation
–
2.2 Enter current password for root (enter for none):
Mật khẩu đăng nhập để thao tác với database, vì đây là lần đầu vào & cũng chưa tạo nên bạn Không điền gì và Enter.
–
2.3 Switch to unix_socket authentication [Y/n]
Cho phép đăng nhập database bằng quyền sudo mysql, tức là bằng tài khoản root đang dùng để không cần phải tạo thêm mật khẩu vào database nữa.
Chọn Y (bấm phím Y rồi Enter).
–
Nó sẽ hỏi tiếp: ‘Chang the root password’ (nghĩa là thay đổi, tạo mật khẩu cho root vào database).
Chọn n.
Vì chúng ta đã có quyền sudo mysql.
–
2.4 Remove anonymous users? [Y/n]
Xóa người dùng ẩn danh cho database.
Chọn Y.
–
2.5 Disallow root login remotely? [Y/n]
Cấm root đăng nhập từ xa.
Chọn Y.
–
2.6 Remove test database and access to it? [Y/n]
Xóa database test.
Chọn Y.
–
2.7 Reload privilege tables now? [Y/n]
Tải lại bảng phân quyền để áp dụng ngay các thay đổi.
Chọn Y.
—
3. Đăng nhập vào database
sudo mariadb
Bạn sẽ thấy dấu nhắc MariaDB [(none)] >, giờ hãy nhập lệnh tiếp theo.
4. Tạo database
CREATE DATABASE wordpress_caddy DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wpuser_caddy'@'localhost' IDENTIFIED BY 'pass_db_caddy';
GRANT ALL PRIVILEGES ON wordpress_caddy.* TO 'wpuser_caddy'@'localhost';
FLUSH PRIVILEGES;
EXIT;
Đến bước cuối EXIT; thì nhấn Enter để thoát khỏi database.
Giải thích:
wordpress_caddy: tên cơ sở dữ liệu, đặt tên tùy ý.wpuser_caddy: tên người dùng cho cơ sở dữ liệu, đặt tên tùy ý.pass_db_caddy: mật khẩu cho người dùng, tùy ý.utf8mb4: sử dụng bảng mã hiện đại để lưu được đa dạng các loại ký tự khác nhau.GRANT ALL PRIVILEGES: cấp tất cả các quyền cho người dùngwpuser_caddythao tác với bảngwordpress_caddy.
Chú ý đến các thông tin wordpress_caddy, wpuser_caddy & pass_db_caddy, vì chúng ta sẽ cần dùng lại nó sau này ở phần cài đặt WordPress.
Lưu ý: Trong môi trường thử nghiệm có thể đặt tên như mẫu (ý là bạn copy mà không cần sửa), nhưng trong môi trường chính thức, nên sửa lại để nó khó đoán hơn… Mặc dù đặt tên tùy ý nhưng tránh có dấu & có khoảng trắng.
C. Tải và cài đặt WordPress
1. Tạo thư mục /var/www/example.com
Thư mục này dùng để chứa website của bạn, và thư mục thực tế sẽ theo tên domain của bạn (điều này giúp việc cài thêm các website khác & quản lý dễ dàng hơn), do vậy trước hết là khai báo tên miền (thay example.com thành tên miền của bạn, bạn nhớ là không có ‘http://’ hay ‘https://’ đằng trước, không có dấu ‘/’ ở cuối, không có khoảng trắng trước và sau dấu ‘=’):
DOMAIN="example.com"
Tạo thư mục chứa mã nguồn của web.
sudo mkdir -p /var/www/$DOMAIN/public_html
Tạo thư mục chứa file log ghi lỗi có thể có sau này khi dùng website:
sudo mkdir -p /var/www/$DOMAIN/logs && sudo chown -R caddy:caddy /var/www/$DOMAIN/logs
2. Tải và giải nén WordPress
Di chuyển vào thư mục /var/www/example.com
cd /var/www/$DOMAIN
Tải về phiên bản mới nhất của WordPress, giải nén nó và xóa file nén sau khi đã giải nén xong:
sudo curl -LO https://wordpress.org/latest.tar.gz && sudo tar xzvf latest.tar.gz -C /var/www/$DOMAIN/public_html --strip-components=1 && sudo rm latest.tar.gz
3. Phân quyền
WP_ROOT="/var/www/$DOMAIN/public_html"
PARENT_DIR="/var/www/$DOMAIN"
WP_OWNER="www-data"
WP_GROUP="www-data"
sudo chown -R $WP_OWNER:$WP_GROUP $WP_ROOT && sudo chown $WP_OWNER:$WP_GROUP $PARENT_DIR && sudo find $WP_ROOT -type d -exec chmod 755 {} \; && sudo find $WP_ROOT -type f -exec chmod 644 {} \; && sudo chmod +x /var/www
Giải thích:
WP_ROOT="/var/www/$DOMAIN/public_html: thư mục gốc đặt dữ liệu website.PARENT_DIR="/var/www/$DOMAIN: thư mục cha dùng để phân quyền.WP_OWNER="www-data"&WP_GROUP="www-data": khai báo biến cho owner và group chạy php-fpm (trên Ubuntu/Debian làwww-data).sudo chown -R $WP_OWNER:$WP_GROUP $PARENT_DIR: trao quyền sở hữu thư mục web chowww-data.sudo chown $WP_OWNER:$WP_GROUP $PARENT_DIR:www-datacó quyền đi vàoPARENT_DIRnhưng không có quyền vàologsnằm trong này vốn đã thuộc quyền của caddy.sudo find $WP_ROOT -type d -exec chmod 755 {} \;: phân quyền thư mục gốc 755.sudo find $WP_ROOT -type f -exec chmod 644 {} \;: phân quyền tệp tin 644.sudo chmod +x /var/www: đảm bảo Caddy có quyền truy cập thư mục cha.
D. Cấu hình Caddy
1. Xác định phiên bản của PHP
[Chỉ cần thiết nếu bạn cài PHP mặc định theo kho của phiên bản Ubuntu, còn như theo hướng dẫn này thì chúng ta đã chủ động chọn PHP 8.3]
ls /run/php/php*-fpm.sock
Nó sẽ cho ra một đường dẫn quan trọng, ví dụ của tôi là: /run/php/php8.3-fpm.sock, bạn cần để ý đến đường dẫn này, đặc biệt là phiên bản php (php8.x) để điều chỉnh trong file trong bước sau này.
2. Trỏ domain về IP của DNS
Trỏ 2 bản ghi A cho cả dạng không-www, và có-www về IP của VPS. Cách tiện là thông qua Cloudflare.
3. Sửa file Caddyfile
sudo nano /etc/caddy/Caddyfile
Xóa hết nội dung cũ, rồi nhập nội dung dưới đây vào. Chú ý thay example.com thành tên miền của bạn & thay phiên bản PHP tương ứng vào:
# chuyen huong co-www ve khong-www
# thay ten mien cua ban vao
www.example.com {
redir https://example.com{uri} permanent
}
# 1. Thay ten mien cua ban vao day
example.com {
# duong dan vao trang web
root * /var/www/example.com/public_html
# nen zstd hoac gzip de tai trang nhanh hon
encode zstd gzip
# thay php8.x bang phien ban thuc te cua ban
php_fastcgi unix//run/php/php8.3-fpm.sock
# phuc vu file tinh
file_server
# tang gioi han upload
request_body {
max_size 50MB
}
# chan truy cap trang nhay cam
@hidden {
path /wp-content/uploads/*.php
path /wp-includes/*.php
path /wp-config.php
}
respond @hidden 404
}
Nhấn Ctrl + O rồi Enter để lưu, nhấn Ctrl + X để thoát.
Bạn có thể sang luôn mục 4, hoặc sử dụng bản cải tiến của Caddyfile trong mục 3.1 (ưu tiên bản này hơn nếu bạn triển khai trên website thực sự, vì nó có nhiều cải tiến quan trọng về hiệu suất & bảo mật).
–
3.1 Phiên bản cải tiến hơn của Caddyfile (nếu bạn muốn thử cấu hình phức tạp hơn).
Sửa file Caddyfile:
sudo nano /etc/caddy/Caddyfile
Thay thế nội dung cũ bằng nội dung mới này (nhớ thay example.com bằng tên miền của bạn):
# 1. Chuyen huong www ve non-www
www.example.com {
redir https://example.com{uri} permanent
}
# 2. Cau hinh chinh
example.com {
root * /var/www/example.com/public_html
encode zstd gzip
# --- Cai tien 1: Log: De sua loi khi can ---
log {
output file /var/www/example.com/logs/access.log {
roll_size 10mb
roll_keep 10
}
}
# PHP FastCGI
php_fastcgi unix//run/php/php8.3-fpm.sock
# File Server
file_server
# Tang gioi han upload
request_body {
max_size 50MB
}
# --- Cai tien 2: SECURITY HEADERS (bao mat trinh duyet) ---
header {
# 1. Chong MIME sniffing (Giu nguyen)
X-Content-Type-Options "nosniff"
# 2. Chong Clickjacking (Ket hop cu va moi)
# Trinh duyet cu dung X-Frame, trinh duyet moi se uu tien CSP frame-ancestors
X-Frame-Options "SAMEORIGIN"
# 3. Thay the X-XSS-Protection bang CSP hoac tat no di
# OWASP khuyen nghi set = 0 neu ban co CSP, hoac bo qua no.
X-XSS-Protection "0"
# 4. Bao ve quyen rieng tu (Referrer)
# Chi gui referrer khi cung ten mien hoac chuyen sang HTTPS an toan
Referrer-Policy "strict-origin-when-cross-origin"
# 5. Quan ly quyen truy cap phan cung/API (Permissions-Policy)
# Tu choi quyen truy cap Camera, Micro, Dinh vi ngay tu dau (an toan)
Permissions-Policy "camera=(), microphone=(), geolocation=(), interest-cohort=()"
# 6. HSTS (Bat len neu ban da san sang)
# Chi bat khi cert HTTPS da hoat dong tot.
Strict-Transport-Security "max-age=31536000; includeSubDomains"
# 7. Xoa header Server de giau thong tin ban dang dung Caddy (Security by Obscurity)
-Server
}
# --- Cai tien 3: Cache nang cao ---
# Nhom 1: CSS va JS (Cache 1 tuan - 604800s)
# Danh cho truong hop hay sua giao dien, code
@code_assets {
file
path *.css *.js
}
header @code_assets Cache-Control "public, max-age=604800"
# Nhom 2: Image, Font, Icon (Cache 1 nam - 31536000s)
# Nhung file nay rat it khi thay doi noi dung, nen de lau toi da
@media_assets {
file
path *.ico *.gif *.jpg *.jpeg *.png *.svg *.woff *.woff2 *.webp
}
header @media_assets Cache-Control "public, max-age=31536000"
# --- Cai tien 4: chan file mo rong (bao mat file nhay cam) ---
@forbidden {
# chan thuc thi PHP o noi khong can thiet
path /wp-content/uploads/*.php
path /wp-includes/*.php
# chan file cau hinh & file ma nguon he thong
path /wp-config.php
path /.htaccess
path /.git
path /.env
path *.sql
path *.bak
}
respond @forbidden 404
}
Nhấn Ctrl + O rồi Enter để lưu, nhấn Ctrl + X để thoát.
4. Khởi động lại Caddy để áp dụng mọi thay đổi
sudo systemctl reload caddy
E. Thiết lập WordPress trên domain của bạn
Truy cập https://ten-mien-cua-ban.com sau đó nó sẽ hiện ra phần cài đặt WordPress.
1. Chọn ngôn ngữ cho giao diện, có thể để tiếng Anh hoặc tiếng Việt.
2. Các thông tin cần có để cài đặt database
Chính là các thông tin mà ta đặt khi tạo database cho WordPress.
3. Nhập chính xác thông tin vào các trường tương ứng
Nhấn Submit rồi chạy cài đặt (Run the installation) là nó sẽ chuyển qua phần nhập thông tin cho website:
–
Thành công:

F. Bảo vệ file wp-config.php
Sau khi cài đặt xong WordPress thì chạy lệnh sau để bảo vệ file wp-config.php (nơi chứa các thông tin quan trọng của WordPress, ví dụ như user & pass database). Lý do chạy lệnh này cuối cùng, vì WordPress phải cài xong thì mới có file wp-config.php
Lưu ý: Thay example.com bằng tên miền của bạn.
WP_CONFIG="/var/www/example.com/public_html/wp-config.php"
if [ -f "$WP_CONFIG" ]; then
sudo chmod 640 $WP_CONFIG
fi



