Linux

Cài đặt LEMP stack nginx MariaDB PHP 8.3 trên Ubuntu 24.04

Vì sao cần LEMP stack trên Ubuntu 24.04?

Bạn vừa thuê một VPS Ubuntu 24.04 để chạy website, nhưng mới chỉ có hệ điều hành trần. Lúc này, việc đầu tiên là cài đặt web server, cơ sở dữ liệu và ngôn ngữ lập trình. LEMP stack (nginx, MariaDB, PHP 8.3) là lựa chọn tối ưu cho hiệu năng cao và ổn định.

Bài viết này hướng dẫn cài đặt chi tiết từng bước, bao gồm kiểm tra lỗi thường gặp. Mọi lệnh đều chạy được trên VPS Ubuntu 24.04 mới cài, user sudo có quyền root. Nếu bạn đang thuê VPS từ các nhà cung cấp như thueVPS, bạn đã có sẵn môi trường để thực hành ngay.

Yêu cầu trước khi bắt đầu

  • Một VPS chạy Ubuntu 24.04 LTS (mới cài hoặc đã cơ bản).
  • User sudo (không dùng root trực tiếp).
  • Cổng 80 (HTTP) và 443 (HTTPS) mở trên firewall nếu có (ufw hoặc nftables).
  • Thời gian: khoảng 15-20 phút.

Bước 1 - Cập nhật hệ thống và cài nginx

Trước tiên, cập nhật danh sách gói và nâng cấp hệ thống lên phiên bản mới nhất:

sudo apt update && sudo apt upgrade -y

Sau đó cài đặt nginx:

sudo apt install nginx -y

Lệnh trên sẽ cài nginx phiên bản mới nhất trong kho Ubuntu 24.04 (thường là 1.24.x hoặc 1.25.x). Sau khi cài xong, enable và khởi động nginx:

sudo systemctl enable nginx
sudo systemctl start nginx

Kiểm tra trạng thái:

sudo systemctl status nginx

Output mong đợi: ● nginx.service - A high performance web server and a reverse proxy server Loaded: loaded Active: active (running)

Mở trình duyệt và gõ địa chỉ IP của VPS (http://<IP>). Bạn sẽ thấy trang welcome của nginx. Nếu chưa mở cổng 80, hãy chạy:

sudo ufw allow 'Nginx HTTP'

Bước 2 - Cài đặt MariaDB (MySQL fork)

MariaDB là bản fork mạnh mẽ của MySQL, thường nhanh và ổn định hơn. Cài đặt:

sudo apt install mariadb-server mariadb-client -y

Khởi động và enable MariaDB:

sudo systemctl enable mariadb
sudo systemctl start mariadb

Kiểm tra trạng thái:

sudo systemctl status mariadb

Output: Active: active (running)

Chạy script bảo mật cơ bản cho MariaDB:

sudo mysql_secure_installation

Làm theo hướng dẫn: set password cho root (nếu chưa có), xóa anonymous user, tắt remote root login, xóa test database, reload privilege tables. Đây là bước quan trọng để bảo vệ database server trên VPS Ubuntu của bạn.

Kiểm tra kết nối:

sudo mysql -u root -p

Nhập password vừa tạo. Nếu vào được MariaDB shell, thành công. Gõ EXIT; để thoát.

Bước 3 - Cài đặt PHP 8.3 và php-fpm

Ubuntu 24.04 cung cấp PHP 8.3 trong kho chính thức. Cài đặt PHP 8.3 cùng php-fpm và các module phổ biến:

sudo apt install php8.3 php8.3-fpm php8.3-mysql php8.3-xml php8.3-mbstring php8.3-curl php8.3-gd php8.3-intl php8.3-bcmath php8.3-zip -y

Danh sách module tùy thuộc ứng dụng (WordPress, Laravel, Joomla...). Bạn có thể thêm bớt sau.

Kiểm tra phiên bản PHP:

php -v

Output: PHP 8.3.x (cli)

Kiểm tra php-fpm đã chạy chưa:

sudo systemctl status php8.3-fpm

Nếu chưa active, bật và khởi động:

sudo systemctl enable php8.3-fpm
sudo systemctl start php8.3-fpm

Bước 4 - Cấu hình nginx xử lý PHP qua php-fpm

Mặc định nginx chưa biết cách xử lý file PHP. Cần sửa file cấu hình server block. Tạo file cấu hình cho site chính (ví dụ: /etc/nginx/sites-available/default):

sudo nano /etc/nginx/sites-available/default

Thay toàn bộ nội dung bằng:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/html;
    index index.php index.html index.htm;

    server_name _;

    location / {
        try_files $uri $uri/ =404;
    }

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

    location ~ /\.ht {
        deny all;
    }
}

Giải thích: fastcgi_pass unix:/var/run/php/php8.3-fpm.sock là socket giao tiếp giữa nginx và PHP 8.3-fpm. Cấu hình này yêu cầu mọi file kết thúc bằng .php được xử lý qua php-fpm.

Sau khi sửa, kiểm tra cú pháp:

sudo nginx -t

Output mong đợi: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful

Reload nginx để áp dụng:

sudo systemctl reload nginx

Bước 5 - Kiểm tra LEMP stack hoạt động

Tạo file PHP test trong thư mục gốc của nginx:

echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php

Mở trình duyệt và gõ http://<IP>/info.php. Bạn sẽ thấy trang phpinfo hiển thị thông tin PHP 8.3, MariaDB, các module đã cài.

Kiểm tra kết nối PHP-MariaDB bằng file test nhỏ (tạo file /var/www/html/testdb.php):

<?php
$servername = "localhost";
$username = "root";
$password = "your_password";
$conn = new mysqli($servername, $username, $password);
if ($conn->connect_error) {
    die("Kết nối thất bại: " . $conn->connect_error);
}
echo "Kết nối MariaDB thành công";
$conn->close();
?>

Thay your_password bằng password root MariaDB bạn đã đặt. Truy cập http://<IP>/testdb.php → nếu hiện "Kết nối MariaDB thành công" là toàn bộ stack hoạt động.

Sau đó xóa file info.php và testdb.php để tránh lộ thông tin bảo mật:

sudo rm /var/www/html/info.php /var/www/html/testdb.php

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

Lỗi 502 Bad Gateway khi truy cập file .php

Nguyên nhân: php-fpm chưa chạy hoặc socket sai. Kiểm tra:

sudo systemctl restart php8.3-fpm
sudo tail -f /var/log/nginx/error.log

Nếu thấy lỗi connect() to unix:/var/run/php/php8.3-fpm.sock failed, kiểm tra socket tồn tại không: ls -la /var/run/php/php8.3-fpm.sock. Cài lại nếu thiếu.

Lỗi 404 khi truy cập index.php

Số lượng lỗi thường gặp: file index.php không nằm trong thư mục root. Đảm bảo cấu hình nginx có index index.php và thư mục /var/www/html có file index.php.

Lỗi "connection refused" cho MariaDB

MariaDB chưa start hoặc socket sai. Kiểm tra:

sudo systemctl restart mariadb
sudo mysql -u root -p
sudo ss -tlnp | grep 3306

Nếu port 3306 không listen, script mysql_secure_installation đã vô hiệu hóa remote? Kiểm tra bind-address trong /etc/mysql/mariadb.conf.d/50-server.cnf (phải là 127.0.0.1 cho local).

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

Có cần cài thêm php8.3 module nào nữa không?

Tùy ứng dụng: WordPress cần php8.3-mysql; Laravel cần php8.3-xml, php8.3-mbstring, php8.3-bcmath; Joomla cần php8.3-gd. Bạn có thể cài thêm sau bằng sudo apt install php8.3-<module>.

Làm sao để kích hoạt HTTPS cho LEMP stack?

Sử dụng Certbot để cài chứng chỉ SSL miễn phí Let's Encrypt. Cài sudo apt install certbot python3-certbot-nginx -y và chạy sudo certbot --nginx -d domain.com. Nếu bạn cần SSL cho subdomain, cân nhắc chứng chỉ SSL wildcard để quản lý dễ hơn.

Nginx chạy nhưng không load được CSS/JS?

Kiểm tra thư mục static file đúng trong root. Nếu dùng try_files như cấu hình trên, nginx sẽ trực tiếp phục vụ file tĩnh. Xóa cache trình duyệt và thử lại.

Cấu hình LEMP stack khác LAMP stack thế nào?

LEMP dùng nginx (thay Apache) và php-fpm (thay mod_php). nginx phù hợp traffic cao, xử lý tĩnh tốt hơn. LAMP dễ cấu hình .htaccess hơn. Nếu chạy WordPress trên VPS, LEMP thường nhanh hơn.

Bài viết liên quan

Lưu ý: Bài viết mang tính tham khảo, tổng hợp kiến thức chung. Mỗi hệ thống, hạ tầng và nhu cầu có đặc thù riêng, nên kiểm thử trong môi trường an toàn và tham vấn kỹ sư trước khi triển khai thực tế.