Cài LEMP trên Ubuntu để chạy website PHP

Để 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
				
			
Kiểm tra Ubuntu 24.04 LTS, cập nhật danh sách gói APT và xác định phiên bản PHP-FPM 8.3 trên VPS
Kiểm tra Ubuntu 24.04 LTS, cập nhật danh sách gói APT và xác định phiên bản PHP-FPM 8.3 trên VPS

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
				
			
Kiểm tra trạng thái dịch vụ Nginx đang hoạt động trên VPS Ubuntu 24.04 bằng lệnh systemctl status nginx
Kiểm tra trạng thái dịch vụ Nginx đang hoạt động trên VPS Ubuntu 24.04 bằng lệnh 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.

Kiểm tra phản hồi HTTP 200 OK từ máy chủ Nginx trên VPS Ubuntu bằng lệnh curl
Kiểm tra phản hồi HTTP 200 OK từ máy chủ Nginx trên VPS Ubuntu bằng lệnh curl

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
				
			
Kiểm tra trạng thái dịch vụ MariaDB đang hoạt động trên Ubuntu 24.04 bằng systemctl
Kiểm tra trạng thái dịch vụ MariaDB đang hoạt động trên Ubuntu 24.04 bằng systemctl

MySQL:

				
					sudo apt install mysql-server mysql-client -y
				
			
				
					sudo systemctl enable --now mysql
				
			
				
					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;

				
			
Tạo database app_db và tài khoản app_user với quyền truy cập riêng trên MariaDB Ubuntu 24.04
Tạo database app_db và tài khoản app_user với quyền truy cập riêng trên MariaDB Ubuntu 24.04

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
				
			
Cài đặt PHP-FPM 8.3 và các extension PHP cần thiết trên VPS Ubuntu 24.04 bằng APT
Cài đặt PHP-FPM 8.3 và các extension PHP cần thiết trên VPS Ubuntu 24.04 bằng APT

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
				
			
Kiểm tra phiên bản PHP 8.3, Unix socket php8.3-fpm.sock và dịch vụ PHP-FPM trên Ubuntu 24.04
Kiểm tra phiên bản PHP 8.3, Unix socket php8.3-fpm.sock và dịch vụ PHP-FPM trên Ubuntu 24.04

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 đủ.

Sơ đồ phân biệt cấu hình PHP CLI dòng lệnh và PHP-FPM chạy website qua Nginx
Sơ đồ phân biệt cấu hình PHP CLI dòng lệnh và PHP-FPM chạy website qua Nginx

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
				
			
Tạo thư mục website lemp-test và phân quyền www-data trên VPS Ubuntu để Nginx phục vụ nội dung web
Tạo thư mục website lemp-test và phân quyền www-data trên VPS Ubuntu để Nginx phục vụ nội dung web

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";
}

				
			
				
					sudo rm -f /var/www/example.com/public/db-test.php
				
			
Xóa tệp db-test.php sau khi kiểm tra kết nối PHP-FPM và MariaDB trên VPS Ubuntu
Xóa tệp db-test.php sau khi kiểm tra kết nối PHP-FPM và MariaDB trên VPS Ubuntu

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.

Quy trình Nginx chuyển yêu cầu PHP qua FastCGI socket tới PHP-FPM và MySQL MariaDB
Quy trình Nginx chuyển yêu cầu PHP qua FastCGI socket tới PHP-FPM và MySQL MariaDB

Xử lý lỗi thường gặp

Lỗi giữa Nginx và PHP-FPM

Biểu hiệnNguyên nhânCách khắc phục
502 Bad GatewayPHP-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áyThiếu khối location ~ \.php$ hoặc Nginx khớp nhầm server blockRà 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ạiSai root, hoặc www-data thiếu quyền thực thi trên thư mục chaXem /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ế.

Có Thể Bạn Thích
Bài viết mới
Zalozalo
Telegram
Lên đầu trang