Kết quả cần đạt: sau khi hoàn tất, tên miền của bạn sẽ mở được website WordPress trên VPS Vultr chạy Ubuntu 24.04 LTS, Apache, MySQL, PHP, HTTPS và permalink. Bài này dùng phương pháp cài thủ công, không dùng ứng dụng One-Click WordPress trong Vultr Marketplace.
Với người mới, One-Click WordPress là cách dễ hơn vì Vultr cài sẵn image và một phần stack. Tuy nhiên, bạn vẫn phải kiểm tra phiên bản, tài khoản quản trị, firewall, cập nhật, sao lưu và cấu hình bảo mật. Phần chính dưới đây phù hợp khi bạn muốn biết từng thành phần nằm ở đâu và tự xử lý lỗi.
Quy trình thường mất khoảng 45–90 phút nếu bạn chưa quen Linux, chưa tính thời gian DNS cập nhật. Bạn cần tài khoản Vultr, một tên miền có quyền sửa DNS, máy tính có SSH và một chuỗi mật khẩu riêng cho database. Giá VPS thay đổi theo gói và khu vực; hãy kiểm tra giá thực tế trong tài khoản Vultr trước khi tạo máy chủ.
Quy trình sử dụng Apache với PHP module của Apache, không dùng Nginx hoặc PHP-FPM. WordPress nêu các yêu cầu máy chủ và phiên bản PHP, MySQL/MariaDB trên trang WordPress.org Requirements; hãy đối chiếu lại khi triển khai thực tế vì yêu cầu có thể thay đổi.
1. Chuẩn bị VPS, tên miền và quyền SSH
Tạo VPS Ubuntu trên Vultr
Đăng nhập Vultr, tạo máy chủ mới và chọn các thông số sau:
- Loại máy chủ: Cloud Compute; website mới hoặc lưu lượng thấp có thể bắt đầu bằng gói CPU chia sẻ phù hợp ngân sách.
- Khu vực: chọn nơi gần phần lớn người truy cập.
- Hệ điều hành: Ubuntu 24.04 LTS x64.
- Phương thức đăng nhập: ưu tiên SSH key. Nếu dùng mật khẩu root, hãy đổi sang mật khẩu riêng, dài và không dùng lại ở dịch vụ khác.
- Hostname: đặt tên dễ nhận biết, chẳng hạn
web-01.
Tài liệu Vultr mô tả quy trình tạo Cloud Compute tại Vultr Cloud Compute Provisioning. Sau khi máy chủ tạo xong, ghi lại:
- IPv4: thay ví dụ
203.0.113.10trong bài bằng IP thật của VPS. - Tên miền: ví dụ
example.com. - Tài khoản SSH: thường là
rootở lần đăng nhập đầu tiên, hoặc tài khoản có quyềnsudonếu image của bạn đã tạo sẵn tài khoản đó.
Không mở MySQL trực tiếp ra Internet. WordPress và MySQL trong bài chạy cùng VPS nên database chỉ cần lắng nghe cục bộ.
Trỏ DNS
Tại nơi quản lý tên miền, tạo hoặc sửa các bản ghi sau:
| Loại | Tên/Host | Giá trị | Mục đích |
|---|---|---|---|
| A | @ | IPv4 của VPS | Tên miền chính |
| A | www | IPv4 của VPS | Tên miền có tiền tố www |
Xóa hoặc sửa bản ghi A cũ trỏ sang máy chủ khác. Nếu VPS chưa cấu hình IPv6, hãy xóa bản ghi AAAA cũ; nếu không, một số trình duyệt có thể đi tới địa chỉ IPv6 sai. DNS có thể chưa cập nhật ngay, nhưng phải trỏ đúng trước khi xin chứng chỉ Let’s Encrypt.
Kiểm tra từ máy tính của bạn, không phải trong phiên SSH:
nslookup example.com
nslookup www.example.com
Kết quả phải chứa IPv4 của VPS. Thay example.com bằng tên miền thật của bạn.
Đăng nhập SSH và cập nhật máy chủ
Chạy trên Terminal của macOS/Linux hoặc PowerShell của Windows. Thay 203.0.113.10 bằng IP thật:
ssh root@203.0.113.10
Nếu đăng nhập bằng SSH key:
ssh -i ~/.ssh/ten-khoa root@203.0.113.10
Thay ~/.ssh/ten-khoa bằng đường dẫn khóa riêng trên máy bạn. Không gửi khóa riêng cho người khác và không dán khóa riêng vào bài hướng dẫn hoặc ticket hỗ trợ.
Sau khi thấy dấu nhắc lệnh của VPS, chạy trên VPS:
apt update && apt upgrade -y
apt install -y curl unzip ca-certificates software-properties-common ufw
hostnamectl set-hostname web-01
Kiểm tra hệ thống:
lsb_release -a
free -h
df -h
Nếu hệ thống yêu cầu khởi động lại sau cập nhật nhân, hãy thực hiện:
reboot
Chờ khoảng 30–60 giây rồi đăng nhập SSH lại. Giữ một phiên SSH đang hoạt động khi thay đổi firewall; không bật firewall trước khi cho phép SSH.
2. Cài Apache, MySQL, PHP và OPcache
Cài các gói LAMP
Chạy trên VPS:
apt install -y apache2 mysql-server php libapache2-mod-php php-mysql php-curl php-gd php-imagick php-mbstring php-xml php-zip php-intl php-bcmath php-cli php-opcache
Bật dịch vụ khi khởi động và kiểm tra trạng thái:
systemctl enable --now apache2 mysql
systemctl is-active apache2
systemctl is-active mysql
php -v
mysql --version
php -m | grep -E 'curl|dom|fileinfo|gd|imagick|mbstring|mysqli|mysqlnd|openssl|xml|zip|Zend OPcache'
Kết quả mong đợi: hai lệnh is-active trả về active; php -v và mysql --version trả về phiên bản; danh sách module có các phần mở rộng cần thiết và Zend OPcache.
Ubuntu cung cấp hướng dẫn cài và kiểm tra MySQL qua Ubuntu Server Documentation: Install and configure a MySQL server.
Kiểm tra Apache xử lý PHP
Tạm tạo tệp kiểm tra trên VPS:
printf '%sn' '<?php echo "PHP OK ".PHP_VERSION; ?>' > /var/www/html/check.php
curl http://127.0.0.1/check.php
Kết quả phải bắt đầu bằng PHP OK và có phiên bản PHP. Xóa tệp ngay sau khi kiểm tra vì không nên công khai thông tin môi trường:
rm -f /var/www/html/check.php
Nếu curl trả về mã nguồn PHP thay vì kết quả, Apache chưa có bộ xử lý PHP đúng. Kiểm tra gói libapache2-mod-php, nhật ký Apache và khởi động lại Apache sau khi sửa.
Điều chỉnh giới hạn PHP và OPcache
Trên VPS, lấy đúng phiên bản PHP đang được cài rồi mở php.ini dành cho Apache:
PHP_VERSION=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')
echo "$PHP_VERSION"
nano "/etc/php/$PHP_VERSION/apache2/php.ini"
Trong trình soạn thảo nano, tìm và đặt các giá trị sau. Nếu dòng bắt đầu bằng dấu chấm phẩy, xóa dấu đó:
memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 120
max_input_time = 120
post_max_size nên lớn hơn hoặc bằng upload_max_filesize. Lưu bằng Ctrl+O, nhấn Enter, thoát bằng Ctrl+X.
Kiểm tra tệp OPcache của PHP:
ls "/etc/php/$PHP_VERSION/mods-available/opcache.ini"
nano "/etc/php/$PHP_VERSION/mods-available/opcache.ini"
Đảm bảo có các dòng cơ bản sau; nếu đã có thì chỉ chỉnh giá trị:
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
Khởi động lại Apache để nhận cấu hình:
systemctl restart apache2
php -i | grep -E 'memory_limit|upload_max_filesize|post_max_size|opcache.enable'
Không tăng các giới hạn quá cao trên VPS ít RAM. Nếu tải theme, plugin hoặc ảnh lớn vẫn lỗi, kiểm tra RAM bằng free -h và nhật ký Apache trước khi tăng tiếp.
3. Tạo database và tài khoản MySQL riêng
Không dùng tài khoản MySQL root trong WordPress. Trên VPS, mở trình khách MySQL bằng quyền hệ thống:
mysql
Khi thấy dấu nhắc mysql>, dán toàn bộ đoạn sau. Thay mật khẩu mẫu bằng một chuỗi dài, ngẫu nhiên và chỉ dùng cho database này:
CREATE DATABASE wp_site CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wp_user'@'localhost' IDENTIFIED BY 'THAY_BANG_MAT_KHAU_DAI_NGAU_NHIEN';
GRANT ALL PRIVILEGES ON wp_site.* TO 'wp_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
Không dùng dấu ngoặc kép bao quanh toàn bộ mật khẩu trong lệnh SQL. Nếu mật khẩu có ký tự đặc biệt như dấu nháy đơn, hãy chọn một mật khẩu khác dễ dán an toàn hoặc xử lý việc tạo tài khoản bằng công cụ quản lý bí mật.
Kiểm tra từ shell của VPS:
mysql -u wp_user -p -e "SHOW DATABASES;"
Nhập mật khẩu database. Kết quả phải có wp_site. Hướng dẫn chính thức về database WordPress nằm tại Creating Database for WordPress.
4. Tải WordPress và cấu hình Apache
Tải mã nguồn WordPress chính thức
Chạy trên VPS. Các lệnh sau lưu trang Apache mặc định, tạo thư mục website và tải gói từ WordPress.org:
mv /var/www/html /var/www/html.apache-default
mkdir -p /var/www/html
cd /tmp
curl -fLO https://wordpress.org/latest.tar.gz
tar -xzf latest.tar.gz
cp -a wordpress/. /var/www/html/
latest.tar.gz là gói ổn định mà WordPress.org cung cấp tại thời điểm tải. Không dùng bản WordPress từ nguồn không rõ nguồn gốc.
Tạo Virtual Host
Đoạn dưới đây dùng tên miền mẫu example.com. Cách an toàn nhất là tạo tệp bằng heredoc trên VPS; hãy thay example.com ở cả tên tệp, ServerName và ServerAlias bằng tên miền thật trước khi chạy:
cp /etc/apache2/sites-available/000-default.conf /root/000-default.conf.backup
cat > /etc/apache2/sites-available/example.com.conf <<'APACHE'
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/html
<Directory /var/www/html>
AllowOverride All
Options FollowSymLinks
Require all granted
</Directory>
DirectoryIndex index.php index.html
ErrorLog ${APACHE_LOG_DIR}/example.com-error.log
CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined
</VirtualHost>
APACHE
a2enmod rewrite
a2dissite 000-default.conf
a2ensite example.com.conf
apache2ctl configtest
systemctl reload apache2
Để tránh lỗi do dấu cách đầu dòng, chạy ba lệnh kích hoạt site riêng nếu cần:
a2dissite 000-default.conf
a2ensite example.com.conf
apache2ctl configtest && systemctl reload apache2
Kết quả của apache2ctl configtest phải là Syntax OK. AllowOverride All cho phép WordPress dùng .htaccess để xử lý permalink. Không reload nếu kiểm tra cú pháp thất bại.
Tham khảo cấu hình máy chủ WordPress tại WordPress Server Configuration. Trang này có tiêu đề nói về Nginx, nhưng tài liệu WordPress cũng trình bày các yêu cầu cấu hình máy chủ nói chung; trong bài này web server thực tế là Apache.
Thiết lập quyền tệp
WordPress cần máy chủ web đọc mã nguồn và ghi được một số thư mục cần thiết. Chạy:
chown -R www-data:www-data /var/www/html
find /var/www/html -type d -exec chmod 755 {} ;
find /var/www/html -type f -exec chmod 644 {} ;
chmod 640 /var/www/html/wp-config.php 2>/dev/null || true
wp-config.php chưa tồn tại trước trình cài đặt nên lệnh cuối có thể không tạo thay đổi. Sau khi WordPress tạo tệp này, chạy lại:
chmod 640 /var/www/html/wp-config.php
chown www-data:www-data /var/www/html/wp-config.php
Không dùng chmod -R 777. Quyền ghi quá rộng làm tăng rủi ro khi một plugin hoặc tiến trình bị khai thác.
5. Cấu hình firewall và chạy trình cài đặt WordPress
Mở đúng cổng mạng
Trên VPS, cho phép SSH trước rồi mới bật UFW:
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
ufw status verbose
Kết quả phải cho phép TCP 22, 80 và 443. Nếu bạn dùng Vultr Firewall Group, cũng phải cho phép ba cổng này ở lớp firewall của Vultr. Quản lý quy tắc tại Vultr Firewall Rules. Không mở cổng 3306 ra Internet nếu MySQL chỉ phục vụ WordPress trên cùng VPS.
Nếu đang dùng một firewall khác ngoài UFW, không bật thêm UFW khi chưa hiểu quy tắc hiện có; hai lớp firewall có thể khiến việc chẩn đoán khó hơn.
Chạy trình cài đặt
Mở http://example.com trong trình duyệt, thay bằng tên miền thật. Chọn ngôn ngữ rồi nhập:
- Tên website: tên hiển thị của website.
- Tên người dùng: không dùng
admin; chọn tên không dễ đoán. - Mật khẩu: dùng mật khẩu do WordPress tạo hoặc một mật khẩu dài, duy nhất.
- Email: địa chỉ bạn còn truy cập được.
Nếu biểu mẫu hỏi database, nhập chính xác:
- Database Name:
wp_site - Username:
wp_user - Password: mật khẩu đã tạo trong MySQL
- Database Host:
localhost - Table Prefix: có thể dùng tiền tố khác
wp_, chẳng hạnsite7_, nếu bạn hiểu lý do cần thay đổi
Địa chỉ WordPress và địa chỉ website ban đầu có thể là HTTP ở bước này. Chưa sửa trực tiếp database để đổi sang HTTPS; hãy dùng Certbot ở bước kế tiếp rồi xác nhận URL trong Cài đặt > Tổng quan.
6. Cấp HTTPS bằng Let’s Encrypt
Chỉ thực hiện khi:
example.comvàwww.example.comđều trỏ đúng IPv4 VPS;- cổng 80 được mở ở cả UFW và Vultr Firewall nếu có;
- website mở được bằng HTTP từ mạng bên ngoài.
Trên VPS, cài Certbot và plugin Apache:
apt install -y certbot python3-certbot-apache
certbot --apache -d example.com -d www.example.com
Thay hai tên miền mẫu bằng tên miền thật. Khi được hỏi, nhập email, đồng ý điều khoản và chọn chuyển hướng HTTP sang HTTPS nếu bạn muốn mọi truy cập dùng HTTPS.
Kiểm tra chứng chỉ:
certbot certificates
systemctl status certbot.timer --no-pager
certbot renew --dry-run
Kết quả mong đợi của certbot renew --dry-run là quy trình mô phỏng hoàn tất không lỗi. Nếu cấp chứng chỉ thất bại, kiểm tra DNS, cổng 80, tên miền www và proxy/CDN đang dùng; không xóa dữ liệu WordPress để xử lý lỗi SSL.
Bạn có thể tham khảo hướng dẫn SSL Let’s Encrypt tự động gia hạn. WordPress có tài liệu về HTTPS tại WordPress HTTPS Documentation.
Sau khi Certbot chuyển hướng xong, mở https://example.com/wp-admin, vào Cài đặt > Tổng quan và xác nhận cả Địa chỉ WordPress lẫn Địa chỉ website đều bắt đầu bằng https://.
7. Xác minh website và xử lý lỗi thường gặp
Kiểm tra dịch vụ và HTTP
Chạy trên VPS:
apache2ctl configtest
systemctl is-active apache2
systemctl is-active mysql
curl -I https://example.com
curl -I https://example.com/wp-admin/
Hai lệnh dịch vụ phải trả về active. Các lệnh curl có thể trả 200, 301 hoặc 302 tùy chuyển hướng và trạng thái đăng nhập; mã 500 hoặc 503 cần xem nhật ký.
Kiểm tra permalink và tải tệp
Trong WordPress, vào Cài đặt > Đường dẫn tĩnh, chọn Tên bài viết, bấm Lưu thay đổi, rồi mở một bài viết trong cửa sổ riêng tư. Thử tải một ảnh và cài một plugin từ nguồn hợp pháp.
Nếu bài viết trả 404:
a2enmod rewrite
apache2ctl configtest
systemctl reload apache2
ls -la /var/www/html/.htaccess
Nếu tải tệp thất bại, đối chiếu upload_max_filesize, post_max_size, quyền thư mục và danh sách module:
PHP_VERSION=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')
php -m
php -i | grep -E 'memory_limit|upload_max_filesize|post_max_size|max_execution_time'
ls -ld /var/www/html /var/www/html/wp-content
Không cần để tệp kiểm tra PHP công khai sau khi xác minh. Với tối ưu hình ảnh, xem cách giảm tải máy chủ khi đăng ảnh AVIF và HEIC. Với kiểm tra giao diện, xem cách kiểm tra responsive breakpoints trong WordPress.
Chẩn đoán theo triệu chứng
| Triệu chứng | Chẩn đoán | Cách xử lý an toàn |
|---|---|---|
| Không SSH được | Kiểm tra IP, SSH key, cổng 22, trạng thái VPS và Vultr Firewall. | Giữ phiên SSH dự phòng; không đổi cổng hoặc bật chính sách mới khi chưa có đường truy cập thay thế. |
| 403 Forbidden | Kiểm tra DocumentRoot, quyền thư mục và Require all granted. | Chạy apache2ctl configtest rồi xem nhật ký lỗi; không cấp quyền 777. |
| 500, 502 hoặc trang trắng | Kiểm tra trạng thái Apache, PHP module và nhật ký Apache. | Hoàn tác thay đổi gần nhất trong php.ini hoặc Virtual Host, sau đó reload khi configtest báo hợp lệ. |
| Không kết nối database | Đối chiếu database, username, mật khẩu và host trong wp-config.php. | Thử mysql -u wp_user -p -e "SHOW DATABASES;"; không đưa mật khẩu vào URL hoặc nhật ký. |
| Không cấp được SSL | Kiểm tra A/AAAA, DNS, cổng 80, tên miền www và proxy. | Sửa DNS hoặc firewall rồi chạy lại Certbot; không xóa thư mục WordPress. |
| Permalink trả 404 | Kiểm tra module rewrite, AllowOverride All và file .htaccess. | Bật rewrite, kiểm tra cú pháp và reload Apache. |
| Tải plugin/theme thất bại | Kiểm tra PHP extensions, quyền www-data và giới hạn tải tệp. | Đọc nhật ký trước khi tăng giới hạn; chỉ dùng plugin/theme từ nguồn hợp pháp và đáng tin cậy. |
Xem nhật ký Virtual Host trên VPS:
tail -n 50 /var/log/apache2/example.com-error.log
tail -n 50 /var/log/apache2/example.com-access.log
Thay example.com bằng tên miền thật nếu bạn đã đặt tên log khác. Để quản lý plugin an toàn hơn, xem quy trình kiểm tra plugin trong 24 giờ trước khi cập nhật. Để tăng lớp phòng thủ trước bot và crawler lạ, xem cách bảo mật WordPress trước bot AI và crawler.
8. Sao lưu và rollback
Tạo bản sao lưu trước khi cập nhật
Sao lưu cả database và tệp. Chạy trên VPS; lệnh sẽ hỏi mật khẩu MySQL:
mkdir -p /root/backup-wordpress
mysqldump --single-transaction -u wp_user -p wp_site | gzip > "/root/backup-wordpress/wp_site-$(date +%F).sql.gz"
tar -czf "/root/backup-wordpress/wp-files-$(date +%F).tar.gz" /var/www/html
ls -lh /root/backup-wordpress
Bản sao lưu duy nhất trên cùng VPS không bảo vệ bạn khi VPS hỏng hoặc bị xóa. Tải tệp sao lưu về máy cá nhân hoặc lưu sang nơi khác, kiểm soát quyền truy cập và kiểm tra việc giải nén/khôi phục định kỳ.
Khôi phục khi cập nhật gây lỗi
Trước khi khôi phục, tạo thêm bản sao lưu hiện trạng. Với tệp, giải nén vào thư mục tạm để kiểm tra trước:
mkdir -p /root/restore-check
tar -xzf /root/backup-wordpress/wp-files-YYYY-MM-DD.tar.gz -C /root/restore-check
ls -la /root/restore-check/var/www/html
Thay YYYY-MM-DD bằng ngày thật của bản sao lưu. Chỉ thay thư mục website sau khi xác nhận đúng bản sao lưu và có bản lưu hiện trạng:
mv /var/www/html /var/www/html.failed-$(date +%F-%H%M)
mkdir -p /var/www/html
tar -xzf /root/backup-wordpress/wp-files-YYYY-MM-DD.tar.gz -C /
chown -R www-data:www-data /var/www/html
find /var/www/html -type d -exec chmod 755 {} ;
find /var/www/html -type f -exec chmod 644 {} ;
apache2ctl configtest && systemctl reload apache2
Thay tên tệp sao lưu cho đúng. Với database, không ghi đè ngay database đang chạy nếu chưa xác nhận chắc chắn; tạo database tạm để kiểm tra hoặc dừng website trong thời gian bảo trì, rồi khôi phục đúng bản sao lưu theo kế hoạch. Nếu lỗi chỉ xuất hiện sau khi sửa Virtual Host, khôi phục tệp cấu hình đã lưu tại /root/000-default.conf.backup, chạy apache2ctl configtest, rồi mới reload.
9. Checklist hoàn tất
- VPS Ubuntu 24.04 LTS đã tạo và IPv4 đã được ghi lại.
- DNS A của tên miền chính và
wwwtrỏ đúng VPS; không còn AAAA cũ trỏ sai. - SSH đăng nhập được; phiên quản trị vẫn còn sau khi cấu hình firewall.
- Apache và MySQL đều trả về
active. - PHP có các module cần thiết và OPcache đã bật.
memory_limit,upload_max_filesizevàpost_max_sizeđã được kiểm tra sau khi reload Apache.- Database WordPress dùng tài khoản riêng, không dùng MySQL root.
- Virtual Host trả về
Syntax OKvà website mở được. - Firewall chỉ mở các cổng cần thiết: 22, 80 và 443.
- Website mở bằng HTTPS, chứng chỉ đúng tên miền và
certbot renew --dry-runthành công. - Đăng nhập
wp-admin, mở permalink và tải thử tệp đều hoạt động. - Đã có bản sao lưu database và tệp ở ngoài VPS, đồng thời biết vị trí bản sao lưu để rollback.
Nếu mục tiêu của bạn chỉ là có website chạy nhanh và chưa muốn quản trị Apache, MySQL, PHP, firewall và Certbot, One-Click WordPress trong Vultr Marketplace là lựa chọn dễ hơn. Dù dùng image dựng sẵn, bạn vẫn nên kiểm tra phiên bản, tài khoản, cập nhật, HTTPS, firewall và sao lưu. Cài thủ công phù hợp hơn khi bạn muốn kiểm soát từng thành phần và có khả năng tự chẩn đoán sự cố.

