Cài WordPress trên VPS: hướng dẫn từ A đến Z (thủ công và bằng panel)

Hướng dẫn cài WordPress trên VPS Ubuntu 24.04 hoặc Debian 12 theo hai cách, thủ công với Nginx, PHP, MariaDB, SSL hoặc bằng control panel, kèm bảo mật sau cài.

Sơ đồ các bước cài WordPress trên VPS với Nginx, PHP, MariaDB và SSL

Ý chính

  • Cài WordPress trên VPS cần tên miền đã trỏ về server, web server, PHP 8.3 trở lên và MariaDB 10.11 trở lên.
  • Cài thủ công mất khoảng 30 đến 60 phút; dùng control panel chỉ mất vài phút.
  • Sau khi cài, hãy bật SSL, page cache, backup ra ngoài server và chuyển wp-cron sang cron của hệ thống.
  • Mọi website chạy chung một user www-data thì không cách ly nhau; nhiều website nên mỗi site một user.

Để cài WordPress trên VPS, bạn cần bốn thứ: một VPS chạy Ubuntu 24.04 hoặc Debian 12, một tên miền đã trỏ bản ghi A về IP của VPS, một bộ web server (Nginx, PHP, MariaDB) và chứng chỉ SSL. Có hai cách: cài thủ công bằng dòng lệnh (khoảng 30 đến 60 phút, hiểu rõ từng thành phần) hoặc dùng control panel để nó làm hết trong vài phút.

Bài này hướng dẫn cả hai cách, từng lệnh một, trên Ubuntu 24.04 (Debian 12 gần như giống hệt, khác biệt được ghi chú). Sau đó là những việc cần làm ngay sau khi cài để website nhanh và an toàn, cùng bảng lỗi thường gặp.

Cần chuẩn bị gì trước khi cài WordPress trên VPS?

VPS. Theo yêu cầu chính thức của WordPress, máy chủ nên có PHP 8.3 trở lên và MariaDB 10.11 trở lên (hoặc MySQL 8.0 trở lên), cùng hỗ trợ HTTPS. Ubuntu 24.04 có sẵn PHP 8.3 và MariaDB 10.11. Debian 12 có PHP 8.2: WordPress vẫn chạy, nhưng thấp hơn mức khuyến nghị.

Cấu hình. Một website WordPress nhỏ chạy được trên VPS 1 GB RAM; 2 GB trở lên cho bạn khoảng trống để cập nhật, backup và đón lúc đông khách. Nếu định chạy nhiều website, hãy xem số liệu đo thực tế trên VPS 4 GB: page cache quyết định phần lớn sức chứa.

Tên miền. Tạo bản ghi A cho example.com và www trỏ về IP của VPS, trước khi cài, vì Let's Encrypt chỉ cấp chứng chỉ khi tên miền đã phân giải đúng. Kiểm tra từ máy của bạn:

dig +short example.com
dig +short www.example.com

Cả hai lệnh phải trả về IP của VPS. DNS có thể mất từ vài phút tới vài giờ để cập nhật.

Quyền truy cập. SSH bằng root hoặc user có sudo. Tốt nhất là đăng nhập bằng SSH key thay vì mật khẩu.

Cách 1: Cài WordPress trên VPS bằng control panel

Nếu bạn quản lý nhiều website, hoặc không muốn tự duy trì cấu hình Nginx và PHP, control panel là cách nhanh nhất. Ví dụ với ZoPanel trên VPS Ubuntu hoặc Debian mới cài:

Bước 1: Cài panel

curl -fsSL https://get.zopanel.net | sudo bash

Trình cài cập nhật hệ thống, cài Nginx, PHP, MariaDB, wp-cli, bật tường lửa UFW, Fail2ban và cập nhật bảo mật tự động. Khi xong, nó in địa chỉ https://IP-SERVER:8888 cùng mật khẩu quản trị. Chi tiết tuỳ chọn ở hướng dẫn cài đặt.

Bước 2: Tạo website WordPress

  1. Vào Website và bấm Thêm website.
  2. Chọn Chủ sở hữu (tài khoản hosting) và nhập Tên miền, ví dụ example.com.
  3. Chọn Loại website: WordPress.
  4. Điền Tiêu đề website, Email quản trị, Tài khoản quản trị và Mật khẩu quản trị. Đừng để tài khoản quản trị là admin: đó là tên bot thử đầu tiên.
  5. Giữ SSL miễn phí (Let's Encrypt) bật, rồi bấm Tạo website.

ZoPanel tạo database, cài WordPress bản mới nhất bằng wp-cli và cấp chứng chỉ SSL trước (nếu tên miền đã trỏ về), nên WordPress khởi đầu bằng https://. Nếu DNS chưa sẵn sàng, panel tự kiểm tra mỗi giờ và cấp chứng chỉ ngay khi tên miền phân giải về server.

Bước 3: Ba công tắc nên bật ngay

  • Page cache trong tab PHP & cấu hình: Nginx phục vụ nguyên trang cho khách chưa đăng nhập, không cần chạy PHP. Người đã đăng nhập, giỏ hàng, thanh toán và trang quản trị luôn bỏ qua cache.
  • Server chạy tác vụ định kỳ trong thẻ Vận hành của tab WordPress: thay wp-cron chạy theo lượt khách bằng timer của hệ thống, 5 phút một lần.
  • Áp dụng tất cả trong thẻ Bảo mật của tab WordPress: tắt trình sửa file, kiểm tra quyền wp-config.php, chặn PHP trong thư mục uploads và đổi khoá bảo mật.

Mỗi website chạy dưới user Linux riêng của tài khoản, với PHP-FPM pool và giới hạn CPU, RAM riêng, nên một website bị hack không đọc được file của website khác. Gói Free chạy tối đa 10 website, đủ cho phần lớn cá nhân và agency nhỏ. Toàn bộ công cụ WordPress được mô tả ở WordPress Toolkit.

Cách 2: Cài WordPress thủ công trên Ubuntu 24.04 (LEMP)

Cách này giúp bạn hiểu từng lớp. Thay example.com bằng tên miền của bạn. Mọi lệnh chạy bằng user có sudo.

Bước 1: Cập nhật hệ thống và bật tường lửa

sudo apt update && sudo apt upgrade -y
sudo ufw allow OpenSSH
sudo ufw allow 80,443/tcp
sudo ufw enable

Nếu SSH của bạn chạy trên cổng khác 22, hãy mở đúng cổng đó trước khi ufw enable, nếu không bạn sẽ tự khoá mình ngoài server.

Bước 2: Cài Nginx, PHP-FPM và MariaDB

sudo apt install -y nginx mariadb-server \
  php-fpm php-mysql php-curl php-gd php-intl php-mbstring \
  php-xml php-zip php-imagick
php -v

Các gói php-* cài phiên bản PHP mặc định của hệ điều hành: 8.3 trên Ubuntu 24.04, 8.2 trên Debian 12. Ghi nhớ phiên bản, vì nó xuất hiện trong đường dẫn socket ở bước 5.

Tăng giới hạn upload (mặc định chỉ 2 MB, quá nhỏ để tải theme hay ảnh) trong /etc/php/8.3/fpm/php.ini:

upload_max_filesize = 64M
post_max_size = 64M
memory_limit = 256M
sudo systemctl restart php8.3-fpm

Bước 3: Bảo mật MariaDB và tạo database

sudo mariadb-secure-installation

Trên Ubuntu và Debian, root của MariaDB đăng nhập qua unix socket, nên bạn có thể giữ nguyên cách xác thực đó; hãy xoá user ẩn danh và database test. Sau đó tạo database riêng cho WordPress:

sudo mariadb
CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'đặt-mật-khẩu-dài-và-ngẫu-nhiên';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Mỗi website một database và một user riêng. Đừng bao giờ cho WordPress dùng tài khoản root của MariaDB.

Bước 4: Tải WordPress

cd /tmp
curl -LO https://wordpress.org/latest.tar.gz
tar xzf latest.tar.gz
sudo mkdir -p /var/www/example.com
sudo cp -a wordpress/. /var/www/example.com/
sudo chown -R www-data:www-data /var/www/example.com

Chỉ tải WordPress từ wordpress.org. Bản "nulled" hay gói cài từ nguồn lạ là con đường phổ biến nhất để mã độc vào website.

Bước 5: Cấu hình Nginx

Tạo file /etc/nginx/sites-available/example.com:

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    root /var/www/example.com;
    index index.php;
    client_max_body_size 64m;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    # Chặn chạy PHP trong thư mục uploads (đặt TRƯỚC khối PHP bên dưới)
    location ~* /wp-content/uploads/.*\.php$ {
        deny all;
    }

    location = /xmlrpc.php {
        deny all;
    }

    location ~ /\.(?!well-known) {
        deny all;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    }
}

Với Nginx, các khối location ~ được xét theo thứ tự xuất hiện, nên quy tắc chặn PHP trong uploads phải nằm trên khối \.php$. Chặn xmlrpc.php sẽ làm ngừng các plugin và ứng dụng dùng XML-RPC (ví dụ ứng dụng WordPress cũ trên điện thoại); bỏ dòng đó nếu bạn cần. Cấu hình tham khảo đầy đủ có trong tài liệu Nginx của WordPress.

Kích hoạt và kiểm tra:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

Trên Debian 12, đổi php8.3-fpm.sock thành php8.2-fpm.sock.

Bước 6: Cài SSL Let's Encrypt

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com

Certbot lấy chứng chỉ, sửa cấu hình Nginx để chạy HTTPS và chuyển hướng HTTP sang HTTPS. Gói certbot của Ubuntu và Debian cài sẵn một systemd timer để tự gia hạn; kiểm tra bằng systemctl list-timers | grep certbot và thử gia hạn bằng sudo certbot renew --dry-run.

Bước 7: Hoàn tất cài đặt trên trình duyệt

Mở https://example.com. Trình cài của WordPress hỏi tên database (wordpress), user (wpuser), mật khẩu và host (localhost), rồi tự tạo wp-config.php với khoá bảo mật ngẫu nhiên. Tiếp theo đặt tiêu đề website và tài khoản quản trị (đừng dùng admin). Cuối cùng khoá quyền file cấu hình:

sudo chmod 640 /var/www/example.com/wp-config.php

Việc cần làm ngay sau khi cài WordPress

Cài xong mới là một nửa. Dù dùng cách nào, hãy làm các việc sau:

  1. Chuyển wp-cron sang cron hệ thống. Mặc định WordPress chạy tác vụ định kỳ khi có khách truy cập: site vắng chạy trễ, site đông tốn thêm một request PHP mỗi lần. Thêm define('DISABLE_WP_CRON', true); vào wp-config.php, rồi chạy sudo crontab -u www-data -e và thêm dòng:

    */5 * * * * cd /var/www/example.com && php wp-cron.php >/dev/null 2>&1
    
  2. Bật cache. Page cache (Nginx FastCGI cache hoặc plugin cache) là yếu tố lớn nhất cho tốc độ và sức chứa.

  3. Thêm lớp bảo mật cơ bản. Thêm define('DISALLOW_FILE_EDIT', true); vào wp-config.php để kẻ lấy được tài khoản admin không sửa được file PHP; bật xác thực hai lớp cho tài khoản quản trị; cài Fail2ban cho SSH.

  4. Backup ra ngoài server. Sao lưu cả file (/var/www/example.com) và database (mariadb-dump) hằng ngày, lưu một bản ở nơi khác VPS. Backup chỉ có giá trị khi đã thử khôi phục.

  5. Cập nhật đều đặn. Bật cập nhật bảo mật tự động của hệ điều hành (unattended-upgrades) và cập nhật WordPress, plugin, theme hằng tuần.

Lưu ý khi chạy nhiều website: với cách thủ công ở trên, mọi website đều chạy bằng user www-data và chung một PHP-FPM pool. Nếu một website bị hack, mã độc đọc được file của mọi website khác. Khi có từ hai website trở lên, hãy tạo PHP-FPM pool riêng với user Linux riêng cho từng site, hoặc dùng panel có sẵn cách ly theo tài khoản.

Lỗi thường gặp khi cài WordPress trên VPS

Lỗi Nguyên nhân thường gặp Cách xử lý
502 Bad Gateway Sai đường dẫn socket PHP-FPM hoặc PHP-FPM chưa chạy Kiểm tra ls /run/php/ và systemctl status php8.3-fpm
"Error establishing a database connection" Sai tên database, user, mật khẩu Thử mariadb -u wpuser -p wordpress với đúng thông tin
Certbot báo lỗi xác thực Tên miền chưa trỏ về VPS, cổng 80 bị chặn dig +short example.com, mở cổng 80 ở UFW và tường lửa của nhà cung cấp
Tải file báo vượt dung lượng upload_max_filesize hoặc client_max_body_size quá nhỏ Tăng cả hai, khởi động lại PHP-FPM và reload Nginx
Permalink báo 404 Thiếu try_files ... /index.php?$args Kiểm tra khối location /
WordPress đòi thông tin FTP khi cài plugin PHP không ghi được vào thư mục website Kiểm tra chủ sở hữu file khớp với user chạy PHP-FPM

Kết luận

Cài WordPress trên VPS không khó: một tên miền đã trỏ đúng, Nginx, PHP, MariaDB và một chứng chỉ SSL. Cài thủ công một lần là cách tốt để hiểu server của mình. Khi số website tăng, phần tốn công không còn là cài đặt mà là vận hành: cách ly, cache, cập nhật an toàn, backup. Nếu muốn panel lo phần đó, hãy thử ZoPanel Free (10 website, 10 database) theo hướng dẫn website đầu tiên.

Câu hỏi thường gặp

Cài WordPress trên VPS cần cấu hình bao nhiêu?

Một website nhỏ chạy được trên VPS 1 GB RAM, nhưng 2 GB trở lên thoải mái hơn cho cập nhật, backup và lúc đông khách. Trong phép đo của chúng tôi, VPS 4 GB chạy khoảng 100 website WordPress không page cache và khoảng 250 khi có page cache.

Nên dùng Nginx hay Apache cho WordPress?

Cả hai đều chạy WordPress tốt. Nginx nhẹ hơn khi phục vụ file tĩnh và làm page cache, nhưng không đọc .htaccess, nên một số plugin cần quy tắc tương đương trong cấu hình Nginx. Apache tiện nếu website phụ thuộc nhiều vào .htaccess.

Cài WordPress thủ công mất bao lâu?

Với người đã quen dòng lệnh, khoảng 30 đến 60 phút cho một website, chưa tính thời gian chờ DNS cập nhật. Dùng control panel, phần cài đặt chỉ mất vài phút.

Có cần cài SSL cho WordPress không?

Có. HTTPS bảo vệ mật khẩu đăng nhập và dữ liệu của khách, trình duyệt cảnh báo các trang không có HTTPS, và WordPress khuyến nghị máy chủ hỗ trợ HTTPS. Chứng chỉ Let's Encrypt miễn phí và tự gia hạn.

Debian 12 có cài được WordPress không?

Được. Debian 12 đi kèm PHP 8.2, WordPress vẫn chạy bình thường, chỉ thấp hơn mức PHP 8.3 mà WordPress khuyến nghị. Các lệnh trong bài giống hệt, chỉ cần đổi đường dẫn socket thành php8.2-fpm.sock và file cấu hình thành /etc/php/8.2/fpm/php.ini.