Để chạy WordPress hoặc ứng dụng PHP trên VPS Ubuntu, bạn cần cấu hình Nginx, PHP-FPM và cơ sở dữ liệu hoạt động cùng nhau. Cài LEMP trên Ubuntu giúp bạn thiết lập môi trường này, từ tiếp nhận truy cập đến xử lý mã PHP và truy vấn dữ liệu. Bài viết dưới đây hướng dẫn từng bước cài đặt, chọn phiên bản PHP phù hợp, cấu hình kết nối giữa các dịch vụ và kiểm tra website trước khi đưa vào sử dụng.
Chuẩn bị môi trường
Bạn cần đăng nhập SSH bằng tài khoản root hoặc tài khoản có quyền sudo. Nếu mới nhận VPS, hãy xem trước bài hướng dẫn quản trị VPS Linux để chuẩn bị môi trường nền.
Mỗi bản Ubuntu LTS (20.04, 22.04, 24.04) có phiên bản PHP mặc định khác nhau. Trước khi cài đặt, hãy kiểm tra phiên bản Ubuntu và phiên bản PHP có sẵn trong kho APT.
lsb_release -a
sudo apt update
apt-cache policy php-fpm

Hãy đối chiếu phiên bản PHP với yêu cầu của mã nguồn. Nếu tương thích, nên dùng kho APT chính thức để dễ bảo trì. Chỉ khi ứng dụng bắt buộc dùng nhánh PHP khác, bạn mới cần thêm kho PPA ondrej/php.
Ở tầng database, bạn chọn MySQL hoặc MariaDB, và chỉ cài một trong hai trên cùng VPS vì chúng dùng chung cổng 3306. Nếu VPS đã qua sử dụng, hãy kiểm tra cổng và phần mềm đang có trước khi cài đặt.
sudo ss -tulpn | grep -E ':80|:443|:3306'
dpkg -l | grep -E 'apache2|nginx|mysql|mariadb|php'
Nếu máy đang có website hoặc database hoạt động, hãy sao lưu theo hướng dẫn backup dữ liệu VPS trước khi thay đổi.
Cài Nginx
Nginx là thành phần tiếp nhận yêu cầu HTTP/HTTPS từ trình duyệt và chuyển tiếp các yêu cầu xử lý PHP đến PHP-FPM. Để cài đặt, khởi động và thiết lập Nginx tự chạy cùng hệ thống, thực hiện các lệnh sau:
sudo apt install nginx -y
sudo systemctl enable --now nginx
sudo systemctl status nginx

Nếu bật UFW, hãy mở cổng 80 và 443 để cho phép truy cập website qua HTTP và HTTPS.
sudo ufw allow 'Nginx Full'
sudo ufw status
Kiểm tra bằng curl để xác nhận Nginx đang phản hồi. Nhận được HTTP/1.1 200 OK nghĩa là Nginx đã hoạt động. Để tìm hiểu sâu hơn về virtual host, bạn có thể xem bài cài Nginx trên Ubuntu.

Cài database và tạo tài khoản riêng
Chỉ chạy một trong hai nhánh dưới đây.
MariaDB:
sudo apt install mariadb-server mariadb-client -y
sudo systemctl enable --now mariadb

MySQL:
sudo apt install mysql-server mysql-client -y
sudo systemctl enable --now mysql
Trên Ubuntu hiện đại, database mặc định chỉ lắng nghe tại 127.0.0.1 và dùng xác thực unix_socket cho root, giúp hạn chế dò mật khẩu từ bên ngoài.
Mở giao diện quản trị database, sau đó tạo database và tài khoản riêng chỉ có quyền trên đúng database đó. Thay tên database, tên tài khoản và mật khẩu bằng thông tin thực tế của bạn.
CREATE DATABASE app_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'MatKhauManh_2026!';
GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Bộ mã utf8mb4 giúp lưu đầy đủ tiếng Việt có dấu và ký tự biểu tượng. Kiểm tra lại đăng nhập bằng tài khoản vừa tạo. Nếu đăng nhập được vào app_db, database đã sẵn sàng.
Cài PHP-FPM và extension
Với Nginx, bạn cần cài php-fpm thay vì gói php chung chung, vì APT có thể kéo theo Apache và gây xung đột cổng 80.
sudo apt install php-fpm php-mysql php-cli php-curl php-gd php-mbstring php-xml php-zip php-intl php-bcmath -y

Sau đó xác định chính xác phiên bản PHP và tệp socket, vì thông số này phải khớp khi cấu hình Nginx.
php -v
ls -l /run/php/
systemctl list-units --type=service | grep php

Socket thường là /run/php/php8.3-fpm.sock (Ubuntu 24.04) hoặc /run/php/php8.1-fpm.sock (Ubuntu 22.04).
Lưu ý về php.ini: Ubuntu tách riêng cấu hình cho CLI và FPM. Muốn thay đổi upload_max_filesize, post_max_size hay memory_limit có hiệu lực với website, bạn phải sửa /etc/php/X.Y/fpm/php.ini (hoặc pool tại /etc/php/X.Y/fpm/pool.d/www.conf), không phải tệp trong thư mục cli. Sau khi sửa, hãy reload dịch vụ PHP-FPM. Chỉ reload Nginx là không đủ.

Cấu hình Nginx kết nối PHP-FPM
Tạo thư mục website và cấp quyền cho www-data (thay example.com bằng tên miền của bạn).
sudo mkdir -p /var/www/example.com/public
sudo chown -R www-data:www-data /var/www/example.com
sudo chmod -R 755 /var/www/example.com
sudo nano /etc/nginx/sites-available/example.com

Nội dung server block (thay php8.3-fpm.sock bằng đúng socket bạn đã kiểm tra):
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com/public;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
Tệp snippets/fastcgi-php.conf của Ubuntu đã kiểm tra tệp .php có tồn tại trước khi chuyển sang PHP-FPM, giúp ngăn thực thi tệp giả mạo.
Kích hoạt website bằng cách tạo symbolic link từ sites-available sang sites-enabled, kiểm tra cấu hình và tải lại Nginx.
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Nếu thử bằng IP mà chưa có tên miền, hãy gỡ trang mặc định của Nginx trước khi reload.
Kiểm tra toàn bộ luồng Nginx → PHP → database
Thay vì dùng phpinfo() làm lộ thông tin hệ thống, hãy tạo tệp /var/www/example.com/public/db-test.php tối giản để kiểm tra PHP-FPM và khả năng kết nối database.
PDO::ERRMODE_EXCEPTION]
);
$row = $pdo->query('SELECT VERSION() AS db_version')->fetch(PDO::FETCH_ASSOC);
echo "Kết nối Database thành công! Phiên bản: " . $row['db_version'] . "\n";
} catch (PDOException $e) {
http_response_code(500);
echo "Lỗi kết nối Database: " . $e->getMessage() . "\n";
}
Chạy curl để truy cập tệp kiểm tra. Khi thấy dòng “Kết nối Database thành công!”, luồng đã thông suốt.
Xóa tệp này ngay, vì nó chứa mật khẩu dạng văn bản thuần.
sudo rm -f /var/www/example.com/public/db-test.php

Hãy giữ MySQL/MariaDB chỉ lắng nghe tại 127.0.0.1, không mở cổng 3306 ra ngoài trừ khi có máy chủ ứng dụng riêng và đã giới hạn theo IP tĩnh. Khi website chạy ổn và tên miền đã trỏ đúng, hãy làm tiếp bài cài SSL Let’s Encrypt cho Nginx để bật HTTPS trước khi đưa người dùng thật vào.

Xử lý lỗi thường gặp
Lỗi giữa Nginx và PHP-FPM
| Biểu hiện | Nguyên nhân | Cách khắc phục |
| 502 Bad Gateway | PHP-FPM đang dừng, hoặc fastcgi_pass trỏ sai socket (ví dụ ghi php8.1 nhưng máy cài php8.3) | Kiểm tra ls -l /run/php/ và sudo systemctl status php*-fpm, sửa lại socket rồi reload Nginx |
| Trình duyệt tải tệp .php về máy | Thiếu khối location ~ \.php$ hoặc Nginx khớp nhầm server block | Rà soát bằng sudo nginx -T, bổ sung khối PHP và index.php |
| 404 hoặc File not found dù tệp tồn tại | Sai root, hoặc www-data thiếu quyền thực thi trên thư mục cha | Xem /var/log/nginx/error.log, kiểm tra root và quyền thư mục |
Lỗi database, extension và quyền thư mục
- Access denied / SQLSTATE[HY000] [1045]: Sai tên người dùng, mật khẩu hoặc host. Với tài khoản ‘app_user’@’localhost’, hãy điền localhost trong cấu hình ứng dụng.
- Class “PDO” not found, mysqli_connect() undefined, thiếu thư viện ảnh/XML: Thiếu extension hoặc cài nhầm cho phiên bản PHP khác. Kiểm tra bằng php -m, cài gói php-<tên_extension> rồi chạy sudo systemctl restart php*-fpm.
- Không tải được ảnh hoặc không ghi được cache: Thư mục uploads, storage hoặc cache đang thuộc root do giải nén bằng sudo unzip. Hãy chạy sudo chown -R www-data:www-data /var/www/example.com.
Kết luận
Cài LEMP Ubuntu về bản chất là kết nối ba dịch vụ độc lập thành một chuỗi: Nginx tiếp nhận yêu cầu ở cổng 80/443, chuyển mã động qua Unix socket cho PHP-FPM, và PHP-FPM truy vấn dữ liệu từ MySQL hoặc MariaDB. Khi bạn kiểm tra kỹ socket trong /run/php/, tách riêng tài khoản database và nắm rõ vị trí php.ini của FPM, website PHP sẽ vận hành ổn định và dễ xử lý lỗi.
thuê VPS NVMe tốc độ cao để triển khai LEMP cho WordPress, WooCommerce hoặc ứng dụng web, có thể tham khảo các gói tại Thuê VPS Giá Rẻ để chọn cấu hình phù hợp với tải thực tế.

Tôi là Trần Thành Hồng Quân, nhân viên kỹ thuật tại THUEVPSGIARE.COM. Với hơn 5 năm kinh nghiệm trong lĩnh vực VPS, Hosting và quản trị hệ thống, tôi đã trực tiếp triển khai, vận hành và xử lý nhiều vấn đề kỹ thuật liên quan đến máy chủ và hạ tầng hosting. Thông qua các bài viết kỹ thuật trên THUEVPSGIARE.COM, tôi mong muốn chia sẻ những kiến thức thực tế, dễ hiểu và có thể áp dụng, giúp người dùng sử dụng VPS, Hosting và Server hiệu quả, ổn định và an toàn hơn.


