Fast Byte - Thuê VPS Giá Rẻ
VPS & Server

LEMP Stack Là Gì? Tất Tần Tật Về Linux, Nginx, MySQL, PHP [2026]

Lemp stack là gì luôn là thắc mắc cốt lõi của nhiều nhà phát triển ứng dụng web và quản trị viên hệ thống khi bước đầu tiếp cận môi trường máy chủ Linux. Đối với các dự án cần xử lý hàng nghìn kết nối đồng thời nhưng bị giới hạn về chi phí […]

Ảnh đại diện Thanh Lam NguyễnThanh Lam Nguyễn29 phút đọc

Lemp stack là gì luôn là thắc mắc cốt lõi của nhiều nhà phát triển ứng dụng web và quản trị viên hệ thống khi bước đầu tiếp cận môi trường máy chủ Linux. Đối với các dự án cần xử lý hàng nghìn kết nối đồng thời nhưng bị giới hạn về chi phí phần cứng, việc lựa chọn một nền tảng máy chủ web tối ưu tài nguyên đóng vai trò sống còn. Triển khai bộ công cụ này trên các hạ tầng ThueVPSGiaRe.vn sẽ giúp tối đa hóa tốc độ phản hồi của website, tiết kiệm dung lượng RAM và giữ cho hệ thống luôn hoạt động ổn định.

1. LEMP Stack Là Gì? 4 Thành Phần Cốt Lõi Tạo Nên Hệ Thống

LEMP stack là gì? LEMP stack là gói tập hợp phần mềm mã nguồn mở gồm Linux (Hệ điều hành), Nginx (Web Server đọc phát âm là Engine-X), MySQL hoặc MariaDB (Hệ quản trị cơ sở dữ liệu) và PHP (Ngôn ngữ lập trình kịch bản phía máy chủ), phối hợp đồng bộ để triển khai và vận hành các website tĩnh hoặc ứng dụng web động hiệu năng cao.

LEMP Stack là gì

Thuật ngữ “LEMP” là từ viết tắt ghép từ các chữ cái đầu tiên của bốn thành phần cấu thành. Điểm đặc biệt nằm ở chữ cái E: thay vì viết là LNMP, cộng đồng công nghệ quốc tế sử dụng chữ E nhằm đại diện cho cách phát âm danh từ riêng của Nginx (Engine-X). Dưới góc độ quản trị hệ thống và DevOps, mỗi thành phần đảm nhiệm một vai trò chuyên biệt và bổ trợ lẫn nhau:

  • L – Linux (Hệ điều hành nền tảng): Lớp hạ tầng gốc cung cấp môi trường vận hành máy chủ, quản lý tiến trình, hệ thống tập tin và giao tiếp phần cứng. Các bản phân phối Linux họ Debian/RHEL được tin dùng bởi tính ổn định cao, tiêu thụ ít tài nguyên nhàn rỗi. Trong đó, việc lựa chọn hệ điều hành Ubuntu cho máy chủ là tiêu chuẩn phổ biến nhất vì kho ứng dụng phong phú và vòng đời hỗ trợ dài hạn (LTS).
  • E – Nginx (Web Server & Reverse Proxy): Đóng vai trò là “cửa ngõ” tiếp nhận toàn bộ các yêu cầu HTTP/HTTPS từ phía trình duyệt client. Khác với kiến trúc truyền thống, nếu bạn tìm hiểu chi tiết web server Nginx, bạn sẽ thấy phần mềm này vận hành dựa trên cơ chế hướng sự kiện bất đồng bộ (Asynchronous Event-Driven), cho phép xử lý hàng chục nghìn kết nối đồng thời với lượng RAM tiêu thụ cực kỳ khiêm tốn.
  • M – MySQL / MariaDB (Hệ quản trị cơ sở dữ liệu quan hệ): Nơi tổ chức, lưu trữ và truy xuất các dữ liệu có cấu trúc của ứng dụng (bài viết, thông tin người dùng, đơn hàng, cấu hình web). Nắm vững hệ quản trị cơ sở dữ liệu MySQL giúp quản trị viên tối ưu hóa các bảng ghi (tables), tạo chỉ mục (indexing) và phân bổ bộ nhớ đệm InnoDB Buffer Pool hợp lý.
  • P – PHP / PHP-FPM (Bộ xử lý mã nguồn động): Nginx vốn dĩ chỉ phục vụ các file tĩnh (HTML, CSS, JS, ảnh) trực tiếp. Khi gặp file mã nguồn động (.php), Nginx sẽ không tự phân tích mà chuyển giao yêu cầu sang cho PHP-FPM (PHP FastCGI Process Manager). PHP-FPM biên dịch mã, thực thi logic nghiệp vụ, giao tiếp với MySQL để lấy dữ liệu rồi trả kết quả HTML sạch về lại cho Nginx. Ngoài PHP, chữ P trong LEMP đôi khi cũng có thể đại diện cho Python hoặc Perl tùy theo mục đích thiết kế kiến trúc của dự án.

Thuê VPS Giá Rẻ

CPU Intel Gold, SSD NVMe U.2, Chỉ Từ 50K/tháng

Môi Trường Hoàn Hảo Cho LEMP Stack & DevOps

Một cấu hình LEMP stack mượt mà đòi hỏi máy chủ có tốc độ đọc ghi I/O cao để đáp ứng các truy vấn cơ sở dữ liệu MySQL và xử lý file tĩnh. Fast Byte cung cấp giải pháp VPS giá rẻ chạy chip Intel Gold đời mới, lưu trữ SSD NVMe U.2 cao cấp, mở toàn quyền root cho phép bạn thoải mái tự tay biên dịch, tinh chỉnh Nginx và PHP theo tiêu chuẩn DevOps chuẩn xác.

Khởi Tạo VPS Ngay

2. Cơ Chế Hoạt Động Của Mô Hình LEMP Stack Trong Thực Tế

Khác với các web server nguyên khối tích hợp sẵn trình thông dịch bên trong, LEMP stack phân tách rõ ràng trách nhiệm giữa việc phân phối mạng và xử lý ứng dụng. Quy trình xử lý một vòng đời request (Request-Response Lifecycle) trong LEMP diễn ra chặt chẽ qua 5 bước logic sau:

  1. Gửi yêu cầu: Người dùng truy cập tên miền hoặc địa chỉ IP qua giao thức HTTP/HTTPS. Request đi qua mạng Internet chạm tới cổng mở 80 hoặc 443 trên hệ điều hành Linux của máy chủ.
  2. Bộ lọc Nginx tiếp nhận: Nginx phân tích URL request. Nếu yêu cầu là tài nguyên tĩnh (Static Content) như CSS, Javascript, hình ảnh (.png, .jpg), Nginx tự động đọc thẳng từ ổ đĩa và phản hồi ngay lập tức cho client mà không thông qua bất kỳ bộ tiền xử lý nào.
  3. Chuyển tiếp FastCGI: Nếu request yêu cầu tệp tin động (.php), Nginx dựa vào khối cấu hình location ~ \.php$ để chuyển tiếp request này qua giao thức FastCGI tới tiến trình PHP-FPM, thông qua một UNIX Socket cục bộ (ví dụ: /run/php/php8.2-fpm.sock) hoặc TCP Port (127.0.0.1:9000).
  4. Xử lý PHP & Truy vấn MySQL: Một worker process của PHP-FPM nhận request, nạp các biến môi trường, thực thi mã nguồn. Nếu ứng dụng cần dữ liệu, PHP tạo kết nối cục bộ tới dịch vụ MySQL Server, thực hiện truy vấn SQL (SELECT, INSERT, UPDATE) và nhận dữ liệu trả về.
  5. Hoàn tất phản hồi: Sau khi PHP hoàn thành mã hóa, nó gửi luồng HTML thuần về cho Nginx. Nginx đóng gói payload này thành chuẩn HTTP Response (kèm mã trạng thái 200 OK, header gzip nếu có) và chuyển về trình duyệt của khách hàng.

Nhờ việc Nginx không phải “ôm đồm” việc thông dịch mã nguồn nặng nề mà chỉ làm nhiệm vụ điều hướng thông minh (Reverse Proxy & Static Cache), tiến trình Nginx luôn ở trạng thái giải phóng nhanh, duy trì được độ trễ thấp ngay cả khi lượng truy cập tăng vọt.

3. So Sánh LEMP Stack Và LAMP Stack: Đâu Là Giải Pháp Vượt Trội?

Trước khi Nginx trở nên phổ biến, LAMP stack (với Apache làm web server) từng là chuẩn mực thống trị toàn cầu. Tuy nhiên, sự phát triển của công nghệ web đòi hỏi giải pháp chịu tải cao với mức chi phí máy chủ thấp nhất có thể. Khi đặt LEMP cạnh máy chủ web Apache truyền thống, chúng ta nhận thấy rõ sự khác biệt mang tính kiến trúc.

So Sánh LEMP Stack Và LAMP Stack

Dưới đây là bảng so sánh LEMP Stack Và LAMP Stack:

Tiêu Chí Đánh Giá LEMP Stack (Nginx) LAMP Stack (Apache)
Mô hình xử lý (Architecture) Event-driven, Asynchronous Non-blocking (Một tiến trình quản lý hàng ngàn kết nối song song). Process/Thread-driven (Mỗi kết nối tạo một tiến trình mới hoặc luồng riêng biệt – MPM prefork/event).
Hiệu năng phân phối file tĩnh Tốc độ vượt trội, tận dụng kernel I/O trực tiếp, tốn cực ít chu kỳ CPU. Trung bình; tốn chi phí đọc qua các module nạp sẵn và kiểm tra file phân cấp.
Tiêu hao bộ nhớ RAM Cực thấp và ổn định. Tài nguyên RAM không tăng đột biến theo số lượng truy cập. Cao hơn đáng kể. Dễ xảy ra hiện tượng Out-Of-Memory (OOM) nếu bị ddos hoặc nghẽn thread.
Cấu hình phân quyền thư mục Tập trung toàn bộ trong file cấu hình Server Block (không hỗ trợ .htaccess, an toàn và nhanh hơn). Cho phép dùng file .htaccess theo từng thư mục (tiện lợi cho người mới nhưng giảm hiệu năng hệ thống).
Mức độ phù hợp với VPS nhỏ Lý tưởng hàng đầu cho các gói VPS cấu hình từ 1GB – 2GB RAM. Cần cấu hình tài nguyên RAM lớn hơn để chịu được cùng một lượng tải đồng thời.

Từ bảng so sánh trên, bạn có thể nhận thấy LEMP Stack chính là sự lựa chọn chân ái nếu bạn muốn tiết kiệm ngân sách thuê máy chủ nhưng vẫn mong muốn website chịu tải tốt, tải trang nhanh và vận hành ổn định trong thời gian dài.

4. Yêu Cầu Chuẩn Bị Trước Khi Triển Khai LEMP Stack Trên VPS

Để quá trình cài đặt LEMP stack trên môi trường Linux diễn ra liền mạch, không gặp lỗi xung đột phần mềm hoặc quyền truy cập, bạn cần chuẩn bị đầy đủ các điều kiện tiên quyết sau:

  • Một máy chủ ảo VPS Linux trắng (Clean OS): Nên sử dụng phiên bản Ubuntu 22.04 LTS hoặc Ubuntu 24.04 LTS 64-bit mới xuất xưởng, chưa cài sẵn các bảng điều khiển (như cPanel, aaPanel, DirectAdmin) để tránh xung đột cổng dịch vụ.
  • Quyền quản trị Root hoặc Sudoer: Bạn cần có thông tin tài khoản root hoặc người dùng thường có quyền sudo để thực thi các lệnh cài đặt cấp hệ thống.
  • Địa chỉ IP tĩnh Public: Một địa chỉ IPv4 công khai để trỏ tên miền và truy cập các dịch vụ web.
  • Phần mềm SSH Client: Sử dụng Terminal (trên Linux/macOS), PowerShell hoặc các công cụ như PuTTY, Termius để bắt đầu giao thức kết nối SSH vào địa chỉ IP của VPS:
# Cú pháp kết nối SSH vào máy chủ VPS
ssh root@your_server_ip

5. Hướng Dẫn Cài Đặt LEMP Stack Trên VPS Ubuntu 22.04 Từ A-Z

Các bước thực hành dưới đây được chuẩn hóa theo tài liệu DevOps thực tế, áp dụng hoàn hảo cho cả phiên bản Ubuntu 22.04 LTS và Ubuntu 24.04 LTS. Hãy lần lượt thực hiện tuần tự từng bước để đảm bảo hệ thống đồng bộ.

1. Yêu cầu tiên quyết

Trước khi bắt đầu quy trình cài đặt, bạn cần chuẩn bị:

  • Một máy chủ cài sẵn hệ điều hành Ubuntu 22.04.
  • Một tài khoản người dùng thông thường có gắn quyền sudo (khuyến nghị không thao tác trực tiếp bằng tài khoản root để đảm bảo an toàn).
  • Tường lửa cơ bản (UFW) đã được bật trên máy chủ của bạn.

2. Bước 1 – Cài đặt Nginx Web Server

Để có thể tiếp nhận các yêu cầu truy cập từ trình duyệt và trả về nội dung website, bạn cần cài đặt web server Nginx thông qua trình quản lý gói apt.

Đầu tiên, hãy làm mới cơ sở dữ liệu các gói phần mềm trên hệ thống:

sudo apt update

Tiếp theo, tiến hành tải và cài đặt Nginx:

sudo apt install nginx

Khi xuất hiện lời nhắc xác nhận, bạn nhấn phím Y rồi gõ ENTER. Sau khi tiến trình kết thúc, Nginx sẽ tự động được khởi chạy trên nền hệ điều hành Ubuntu.

Cấu hình tường lửa UFW cho phép lưu lượng Nginx

Nếu bạn đã kích hoạt tường lửa UFW, các kết nối từ bên ngoài tới web server sẽ bị chặn lại trừ khi bạn mở cổng dịch vụ. Trong quá trình cài đặt, Nginx tự động đăng ký danh sách các profile ứng dụng với UFW. Bạn có thể kiểm tra danh sách này bằng lệnh:

sudo ufw app list

Hệ thống sẽ trả về danh sách tương tự như sau:

Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH

Theo nguyên tắc bảo mật tối thiểu, bạn chỉ nên mở những cổng thực sự cần dùng. Vì bước này chúng ta chưa cài đặt chứng chỉ SSL/TLS, nên bạn chỉ cần cho phép lưu lượng truy cập HTTP qua cổng tiêu chuẩn 80:

sudo ufw allow 'Nginx HTTP'

Xác nhận lại trạng thái của tường lửa xem quy tắc mới đã có hiệu lực hay chưa:

sudo ufw status

Kết quả hiển thị cho thấy cổng Nginx HTTP đã được mở cho mọi kết nối:

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
Nginx HTTP                 ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

Kiểm tra Nginx trên trình duyệt

Sau khi mở cổng tường lửa, bạn hãy kiểm tra xem web server đã phục vụ nội dung ra ngoài được chưa bằng cách truy cập vào địa chỉ IP công cộng (Public IP) hoặc tên miền của máy chủ trên trình duyệt web.

Nếu bạn chưa rõ địa chỉ IP công cộng của server, bạn có thể kiểm tra trực tiếp từ terminal bằng một trong hai lệnh sau:

ip addr show

hoặc:

hostname -I

Hoặc dùng lệnh gọi đến dịch vụ ngoài qua tiện ích curl:

curl -4 icanhazip.com

Sau khi có địa chỉ IP, nhập địa chỉ đó vào thanh địa chỉ của trình duyệt theo cú pháp:

http://server_domain_or_IP

Nếu bạn nhìn thấy trang giao diện mặc định có dòng chữ “Welcome to nginx!”, điều đó đồng nghĩa Nginx đã được thiết lập thành công và tường lửa đã cho phép tiếp nhận lưu lượng HTTP.

3. Bước 2 – Cài đặt và Bảo mật MySQL Server

Sau khi máy chủ web đã sẵn sàng phục vụ, thành phần tiếp theo cần có là một hệ quản trị cơ sở dữ liệu (DBMS) để lưu trữ và tổ chức dữ liệu cho website. MySQL là lựa chọn kinh điển và tối ưu cho môi trường ứng dụng PHP.

Cài đặt gói MySQL Server thông qua apt:

sudo apt install mysql-server

Nhấn YENTER khi hệ thống yêu cầu xác nhận.

Thiết lập cấu hình an toàn với mysql_secure_installation

Khi hoàn tất cài đặt, MySQL khuyến nghị người dùng chạy một script bảo mật có sẵn. Tiện ích này sẽ loại bỏ các thiết lập mặc định có nguy cơ gây mất an toàn (chẳng hạn như tài khoản vô danh, cơ sở dữ liệu mẫu) và khóa bớt các quyền truy cập không cần thiết:

sudo mysql_secure_installation

Hệ thống sẽ hỏi bạn có muốn kích hoạt thành phần VALIDATE PASSWORD PLUGIN (kiểm tra độ mạnh của mật khẩu) hay không.

Lưu ý: Việc bật tính năng kiểm tra mật khẩu hoàn toàn là tùy chọn cá nhân. Nếu bạn bật, MySQL sẽ từ chối thiết lập các mật khẩu không đủ độ phức tạp theo tiêu chí. Nếu tắt, bạn vẫn nên tự tạo các mật khẩu mạnh và an toàn cho tài khoản cơ sở dữ liệu.

Nhấn Y nếu bạn muốn bật, hoặc ấn bất kỳ phím nào khác để bỏ qua:

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No:

Nếu chọn bật (Y), bạn sẽ cần chọn một trong ba mức độ kiểm tra:

  • 0 (LOW): Chiều dài mật khẩu tối thiểu từ 8 ký tự trở lên.
  • 1 (MEDIUM): Từ 8 ký tự trở lên, bắt buộc chứa chữ số, chữ hoa, chữ thường và ký tự đặc biệt.
  • 2 (STRONG): Giống Medium kèm theo việc kiểm tra so khớp với tệp từ điển chống đoán mò.

Kế tiếp, hệ thống sẽ yêu cầu bạn nhập mật khẩu cho tài khoản quản trị cao nhất của MySQL là root.

Phân biệt: Tài khoản root của cơ sở dữ liệu chỉ có toàn quyền trong hệ thống MySQL, tách biệt hoàn toàn với tài khoản root của hệ điều hành Linux.

Nếu bạn bật xác thực mật khẩu, hệ thống sẽ đánh giá độ mạnh của mật khẩu bạn vừa nhập và hỏi bạn có muốn sử dụng mật khẩu này không. Nhấn Y để tiếp tục:

Estimated strength of the password: 100 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y

Đối với chuỗi câu hỏi tiếp theo, bạn chỉ cần nhấn Y và ấn ENTER cho tất cả:

  • Xóa các tài khoản người dùng ẩn danh (anonymous users).
  • Vô hiệu hóa quyền đăng nhập tài khoản root từ xa (Disallow root login remotely).
  • Xóa bỏ cơ sở dữ liệu thử nghiệm test và các quyền truy cập vào nó.
  • Nạp lại các bảng phân quyền (privilege tables) để áp dụng ngay các thay đổi.

Kiểm tra quyền truy cập MySQL Console

Sau khi script chạy xong, bạn có thể kiểm tra quyền đăng nhập vào giao diện console của MySQL bằng lệnh:

sudo mysql

Lệnh này sẽ kết nối trực tiếp vào MySQL với quyền quản trị root. Bạn sẽ thấy dấu nhắc lệnh mysql> xuất hiện:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.28-0ubuntu4 (Ubuntu)

mysql>

Để thoát khỏi giao diện MySQL, nhập:

exit

Giải thích về cơ chế auth_socket: Bạn sẽ nhận thấy rằng hệ thống không hỏi mật khẩu khi bạn gõ sudo mysql, dù trước đó bạn đã đặt mật khẩu cho root. Lý do là trên Ubuntu, tài khoản quản trị root của MySQL mặc định dùng plugin xác thực auth_socket thay vì mật khẩu. Điều này có nghĩa là chỉ những user hệ thống có quyền sudo mới có thể truy cập tài khoản root MySQL.

Hệ quả là: Ứng dụng PHP của bạn sẽ không thể dùng user root này để kết nối cơ sở dữ liệu. Vì vậy, giải pháp tối ưu là tạo một tài khoản MySQL riêng biệt với quyền hạn giới hạn theo từng database cụ thể (chúng ta sẽ thực hành điều này ở Bước 6).

4. Bước 3 – Cài đặt PHP và Module PHP-FPM

Đến thời điểm này, Nginx đã sẵn sàng tiếp nhận request và MySQL đã sẵn sàng lưu dữ liệu. Bước tiếp theo là cấu hình môi trường thực thi PHP để tạo nội dung động.

Khác với Apache (vốn có thể tích hợp trực tiếp bộ thông dịch PHP qua module mod_php trong từng process), Nginx không xử lý PHP trực tiếp. Thay vào đó, Nginx chuyển giao các yêu cầu file .php sang một chương trình chuyên biệt thông qua giao thức FastCGI.

Chương trình này chính là PHP-FPM (PHP FastCGI Process Manager). Để thiết lập, bạn cần cài đặt gói php8.1-fpm cùng với module php-mysql (cho phép PHP truy vấn đến cơ sở dữ liệu MySQL):

sudo apt install php8.1-fpm php-mysql

Nhấn Y rồi ENTER khi được nhắc để cài đặt.

Khi gói cài đặt hoàn tất, tiến trình PHP-FPM phiên bản 8.1 sẽ tự động kích hoạt và lắng nghe yêu cầu tại một UNIX socket cục bộ trên máy chủ.

5. Bước 4 – Cấu hình Nginx Server Block để hỗ trợ PHP

Để tổ chức các website một cách khoa học, Nginx sử dụng khái niệm Server Block (tương tự như Virtual Host bên Apache). Mỗi Server Block cho phép cấu hình phục vụ các tên miền riêng biệt trên cùng một máy chủ vật lý. Trong hướng dẫn này, chúng ta sẽ sử dụng giá trị mẫu là your_domain làm tên miền đại diện.

Trên Ubuntu, Nginx mặc định có sẵn một server block kích hoạt tại đường dẫn /var/www/html. Thay vì sửa đổi trực tiếp thư mục mặc định đó, chúng ta sẽ tạo riêng một thư mục mới cho website của bạn trong /var/www:

sudo mkdir /var/www/your_domain

Gán quyền sở hữu thư mục vừa tạo cho người dùng hiện tại thông qua biến môi trường $USER để bạn có thể chỉnh sửa tập tin mà không cần dùng sudo:

sudo chown -R $USER:$USER /var/www/your_domain

Tạo file cấu hình Server Block

Mở một tệp cấu hình mới trong thư mục chứa các site khả dụng (sites-available) của Nginx bằng trình soạn thảo nano:

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

Dán toàn bộ nội dung cấu hình dưới đây vào tập tin:

server {
    listen 80;
    server_name your_domain www.your_domain;
    root /var/www/your_domain;

    index index.html index.htm index.php;

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

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

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

Ý nghĩa chi tiết của các chỉ thị trong file cấu hình trên:

  • listen 80;: Khai báo Nginx sẽ lắng nghe các kết nối trên cổng 80 (cổng HTTP chuẩn).
  • server_name: Chỉ định các tên miền hoặc địa chỉ IP mà server block này sẽ phản hồi. Bạn hãy thay your_domain bằng domain hoặc IP thực tế của bạn.
  • root: Thư mục gốc chứa mã nguồn của website (ở đây là /var/www/your_domain).
  • index: Thiết lập thứ tự ưu tiên các tệp tin chỉ mục. File index.html được đặt trước index.php nhằm cho phép hiển thị trang thông báo bảo trì dạng HTML nhanh chóng khi cần.
  • location /: Sử dụng chỉ thị try_files để kiểm tra xem file hoặc thư mục mà client yêu cầu có tồn tại hay không; nếu không thấy, Nginx sẽ trả về mã lỗi 404.
  • location ~ \.php$: Bắt các request có đuôi mở rộng .php, sử dụng mẫu cấu hình FastCGI có sẵn (snippets/fastcgi-php.conf) và chuyển tiếp nội dung đến socket của PHP-FPM tại unix:/var/run/php/php8.1-fpm.sock để xử lý.
  • location ~ /\.ht: Ngăn chặn hoàn toàn việc người ngoài truy cập vào các tệp ẩn như .htaccess (Nginx không sử dụng các file này, và việc chặn sẽ gia tăng tính bảo mật).

Sau khi nhập xong nội dung, nhấn tổ hợp phím CTRL + X, gõ Y rồi ấn ENTER để lưu lại file.

Kích hoạt Server Block và kiểm tra cú pháp

Để kích hoạt cấu hình vừa tạo, bạn cần tạo một liên kết tượng trưng (symlink) trỏ từ file cấu hình sang thư mục sites-enabled:

sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/

Hủy kích hoạt file cấu hình mặc định (default) để tránh xung đột cấu hình:

sudo unlink /etc/nginx/sites-enabled/default
Ghi chú: Trong trường hợp muốn khôi phục lại cấu hình default ban đầu của Nginx, bạn chỉ việc chạy lệnh tạo lại symlink:
sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/

Trước khi áp dụng, hãy luôn kiểm tra tính hợp lệ về mặt cú pháp của các file cấu hình Nginx:

sudo nginx -t

Nếu kết quả báo syntax is oktest is successful, bạn có thể yên tâm tải lại tiến trình Nginx:

sudo systemctl reload nginx

Tạo trang HTML thử nghiệm

Hiện thư mục /var/www/your_domain vẫn đang trống. Hãy tạo một file index.html đơn giản để xác nhận Server Block mới đã hoạt động:

nano /var/www/your_domain/index.html

Thêm đoạn mã HTML dưới đây:

<html>
  <head>
    <title>your_domain website</title>
  </head>
  <body>
    <h1>Hello World!</h1>
    <p>This is the landing page of <strong>your_domain</strong>.</p>
  </body>
</html>

Lưu tệp tin lại, sau đó dùng trình duyệt truy cập vào IP hoặc domain máy chủ:

http://server_domain_or_IP

Nếu trang web xuất hiện dòng chữ “Hello World!”, cấu hình server block của bạn đã chính xác.

Chú ý: File index.html này chỉ mang tính chất thử nghiệm. Khi bạn đưa ứng dụng PHP thực tế vào hoạt động với file index.php, bạn cần xóa hoặc đổi tên file index.html đi vì Nginx đang được ưu tiên nạp file .html trước file .php.

6. Bước 5 – Kiểm tra khả năng xử lý PHP trên Nginx

Để đảm bảo Nginx có thể chuyển giao chuẩn xác các tệp tin .php sang bộ tiền xử lý PHP-FPM, bạn hãy tạo một tệp script PHP thử nghiệm trong thư mục gốc của website.

Tạo file có tên info.php:

nano /var/www/your_domain/info.php

Thêm đoạn mã gọi hàm phpinfo() sau:

<?php
phpinfo();

Lưu và đóng tập tin.

Bây giờ, mở trình duyệt và truy cập theo đường dẫn:

http://server_domain_or_IP/info.php

Nếu màn hình xuất hiện một trang bảng biểu chi tiết liệt kê toàn bộ thông số, phiên bản PHP 8.1 cùng các biến môi trường của server, nghĩa là Nginx đã kết nối hoàn hảo với PHP-FPM.

Cảnh báo bảo mật: File info.php chứa rất nhiều thông tin nhạy cảm về cấu hình máy chủ, phiên bản phần mềm và cấu trúc hệ điều hành. Sau khi kiểm tra thành công, bạn bắt buộc nên xóa tệp này ngay để tránh nguy cơ bị khai thác thông tin:

sudo rm /var/www/your_domain/info.php

7. Bước 6 – Kiểm tra kết nối cơ sở dữ liệu từ PHP (Tùy chọn)

Nếu bạn muốn kiểm tra xem môi trường PHP đã có thể kết nối và truy vấn dữ liệu từ MySQL hay chưa, bạn có thể tạo một cơ sở dữ liệu thử nghiệm, một bảng chứa dữ liệu mẫu và viết một đoạn mã PHP sử dụng PDO để lấy dữ liệu ra trình duyệt.

Lưu ý về phương thức xác thực trên MySQL 8: MySQL 8 mặc định sử dụng phương thức xác thực caching_sha2_authentication. Tuy nhiên, một số phiên bản thư viện PHP Native Driver (mysqlnd) có thể gặp trục trặc với cơ chế này. Do đó, khi tạo user cơ sở dữ liệu phục vụ ứng dụng PHP, bạn nên chủ động thiết lập phương thức xác thực truyền thống mysql_native_password cho tài khoản đó.

Tạo cơ sở dữ liệu và người dùng MySQL

Đăng nhập vào console của MySQL bằng quyền root hệ thống:

sudo mysql

Khởi tạo một cơ sở dữ liệu mới có tên example_database:

CREATE DATABASE example_database;

Tạo một người dùng mới có tên example_user, cấu hình phương thức xác thực mysql_native_password và gán mật khẩu (trong ví dụ là password, bạn nên thay bằng mật khẩu riêng an toàn):

CREATE USER 'example_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

Cấp toàn quyền cho người dùng vừa tạo trên cơ sở dữ liệu example_database:

GRANT ALL ON example_database.* TO 'example_user'@'%';

Thoát khỏi giao diện MySQL:

exit

Kiểm tra quyền và nạp dữ liệu mẫu

Đăng nhập lại vào MySQL bằng tài khoản example_user vừa tạo (sử dụng cờ -p để nhập mật khẩu):

mysql -u example_user -p

Kiểm tra danh sách cơ sở dữ liệu mà người dùng này có quyền truy cập:

SHOW DATABASES;

Kết quả hiển thị cho thấy người dùng đã nhìn thấy example_database:

+--------------------+
| Database           |
+--------------------+
| example_database   |
| information_schema |
+--------------------+
2 rows in set (0.000 sec)

Tiến hành tạo một bảng dữ liệu đơn giản có tên todo_list:

CREATE TABLE example_database.todo_list (
    item_id INT AUTO_INCREMENT,
    content VARCHAR(255),
    PRIMARY KEY(item_id)
);

Chèn một vài bản ghi mẫu vào bảng:

INSERT INTO example_database.todo_list (content) VALUES ("My first important item");
INSERT INTO example_database.todo_list (content) VALUES ("My second important item");
INSERT INTO example_database.todo_list (content) VALUES ("My third important item");
INSERT INTO example_database.todo_list (content) VALUES ("and this one more thing");

Truy vấn kiểm tra các bản ghi trong bảng:

SELECT * FROM example_database.todo_list;

Bảng dữ liệu trả về như sau:

+---------+--------------------------+
| item_id | content                  |
+---------+--------------------------+
|       1 | My first important item  |
|       2 | My second important item |
|       3 | My third important item  |
|       4 | and this one more thing  |
+---------+--------------------------+
4 rows in set (0.000 sec)

Thoát khỏi MySQL:

exit

Tạo script PHP để kết nối và truy vấn bảng dữ liệu

Tạo một tệp PHP mới có tên todo_list.php trong thư mục gốc của website:

nano /var/www/your_domain/todo_list.php

Thêm đoạn mã script PHP kết nối thông qua PDO sau:

<?php
$user = "example_user";
$password = "password";
$database = "example_database";
$table = "todo_list";

try {
    $db = new PDO("mysql:host=localhost;dbname=$database", $user, $password);
    echo "<h2>TODO</h2><ol>";
    foreach($db->query("SELECT content FROM $table") as $row) {
        echo "<li>" . $row['content'] . "</li>";
    }
    echo "</ol>";
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

Lưu và đóng file.

Bây giờ, mở trình duyệt và truy cập vào đường dẫn:

http://server_domain_or_IP/todo_list.php

Nếu trên màn hình hiển thị danh sách dạng đánh số gồm các mục nội dung bạn đã thêm (ví dụ: “My first i

6. Các Lỗi Thường Gặp Khi Cấu Hình LEMP & Hướng Xử Lý

Trong quá trình vận hành LEMP trên thực tế, người quản trị thường sẽ đối mặt với 3 lỗi kỹ thuật cơ bản sau:

  • Lỗi 502 Bad Gateway: Đây là lỗi thường gặp nhất trong LEMP stack. Nguyên nhân xuất phát từ việc Nginx không thể kết nối tới backend PHP-FPM. Hãy kiểm tra xem dịch vụ PHP-FPM có đang dừng hoạt động hay không (sudo systemctl status phpX.X-fpm), hoặc kiểm tra đường dẫn socket khai báo trong Nginx (fastcgi_pass unix:/run/php/phpX.X-fpm.sock;) có trùng khớp chính xác với phiên bản PHP thực tế trên hệ thống hay chưa.
  • Lỗi 403 Forbidden: Xảy ra khi Nginx bị từ chối quyền truy cập vào thư mục web hoặc trong thư mục gốc không có file index nào phù hợp với danh sách định nghĩa ở dòng index index.php index.html;. Khắc phục bằng cách kiểm tra quyền sở hữu với lệnh sudo chown -R www-data:www-data /var/www/example.com/html và kiểm tra quyền đọc chmod 755.
  • Trình duyệt tự động tải về file .php thay vì hiển thị giao diện: Hiện tượng này xảy ra khi Nginx không biết file .php phải được biên dịch như thế nào, dẫn đến việc coi file .php là tệp tin nhị phân và gửi cho trình duyệt tải về. Nguyên nhân do thiếu khối location ~ \.php$ trong file Server Block, hoặc chưa có dòng nạp tham số include snippets/fastcgi-php.conf;.

Sau khi khắc phục các lỗi cấu hình và đưa website vào vận hành, việc chủ động thực hiện các bước bảo mật VPS hiệu quả (đổi cổng SSH, cài đặt fail2ban, tắt tài khoản root trực tiếp) là điều cần thiết để bảo vệ hệ thống trước các đợt quét tấn công mạng. Đồng thời, bạn nên cấu hình thêm chứng chỉ bảo mật SSL miễn phí từ Let’s Encrypt thông qua công cụ Certbot để mã hóa toàn bộ dữ liệu người dùng trên đường truyền.

7. Câu Hỏi Thường Gặp Về LEMP Stack (FAQ)

LEMP stack khác gì LAMP stack?

Điểm khác biệt cốt lõi nằm ở máy chủ web: LEMP sử dụng Nginx còn LAMP sử dụng Apache. Nginx dùng kiến trúc event-driven bất đồng bộ, giúp xử lý đồng thời hàng chục ngàn kết nối với dung lượng RAM rất thấp, trong khi Apache tạo tiến trình/luồng riêng cho từng kết nối nên tiêu tốn nhiều tài nguyên hơn khi chịu tải lớn.

Tại sao lại gọi là LEMP mà không phải là LNMP?

Nginx có phát âm chính thức theo chuẩn tiếng Anh là “Engine-X” (/ˈɛndʒɪn-ɛks/). Do đó, cộng đồng lập trình viên quốc tế đã lấy chữ cái âm đọc đầu tiên là “E” để ghép thành từ viết tắt LEMP, giúp từ này dễ đọc và xuôi tai hơn so với LNMP.

LEMP stack có hỗ trợ file .htaccess như Apache không?

Không. Nginx không hỗ trợ tệp tin .htaccess để tránh việc máy chủ phải liên tục quét đọc ổ đĩa ở mỗi thư mục. Thay vào đó, toàn bộ quy tắc viết lại đường dẫn (Rewrite Rules), chặn truy cập và cấu hình bảo mật đều được khai báo tập trung trong file Nginx Server Block chính.

Cần cấu hình tối thiểu VPS bao nhiêu để chạy tốt LEMP stack?

Một cấu hình VPS tối thiểu gồm 1 Core CPU, 1GB RAM và 20GB SSD là đã đủ để chạy mượt mà một trang web LEMP stack phục vụ blog cá nhân hoặc ứng dụng nhỏ. Nhờ sự tối ưu của Nginx và PHP-FPM, hệ thống ngốn rất ít RAM khi ở trạng thái nghỉ.

Có thể cài đặt WordPress trên môi trường LEMP stack không?

Hoàn toàn được và thậm chí còn chạy rất nhanh. WordPress hoạt động cực kỳ mượt mà trên LEMP stack. Bạn chỉ cần thêm quy tắc định tuyến try_files $uri $uri/ /index.php?$args; vào file cấu hình Nginx Server Block để hỗ trợ đường dẫn tĩnh (Pretty Permalinks) của WordPress.

8. Tổng Kết & Lời Khuyên Triển Khai Môi Trường Thực Tế

Hiểu rõ lemp stack là gì cùng bản chất phối hợp giữa Linux, Nginx, MySQL và PHP-FPM giúp bạn làm chủ hoàn toàn hạ tầng máy chủ web của mình. Bằng cách loại bỏ sự cồng kềnh của các bảng điều khiển tự động và chuyển sang tự tay tối ưu LEMP stack, bạn sẽ tối ưu hóa được từng megabyte bộ nhớ RAM, tăng tốc thời gian tải trang và đem lại trải nghiệm mượt mà cho khách hàng. Nếu bạn đang tìm kiếm một nền tảng máy chủ tin cậy với mức giá hợp lý để thực hành hoặc chạy dự án chính thức, dịch vụ VPS tại Fast Byte luôn sẵn sàng đồng hành cùng bạn.

Sẵn Sàng Triển Khai LEMP Stack Với Chi Phí Tiết Kiệm?

Trải nghiệm hạ tầng VPS Linux tốc độ cao, trang bị CPU Intel Gold và ổ cứng NVMe U.2 để tối ưu hóa sức mạnh của Nginx và MySQL ngay hôm nay.

Đăng Ký Thuê VPS Giá Rẻ

Tuyên bố miễn trừ trách nhiệm kỹ thuật: Các hướng dẫn và câu lệnh trong bài viết được kiểm nghiệm trên nền tảng Ubuntu Server tiêu chuẩn. Tùy thuộc vào phiên bản hệ điều hành, cấu hình mạng và các dịch vụ chạy kèm, một số cú pháp có thể cần điều chỉnh tương ứng. Quản trị viên nên thử nghiệm trước trên môi trường máy chủ staging hoặc thực hiện sao lưu (backup) dữ liệu hệ thống trước khi áp dụng trên môi trường production.

Chia sẻ: Facebook LinkedIn
Quay lại trang blog

Bài viết liên quan