Bộ công cụ phần mềm LEMP là một nhóm phần mềm được sử dụng để phục vụ các trang web động và ứng dụng web viết bằng PHP. Đây là một từ viết tắt mô tả một hệ điều hành Linux, với một máy chủ web Nginx (đọc là “Engine-X”). Dữ liệu backend được lưu trữ trong cơ sở dữ liệu MySQL và xử lý động được xử lý bởi PHP.
Nó bao gồm các thành phần sau:
- L – Linux: Đây là hệ điều hành sử dụng trong bộ công nghệ LEMP. Thông thường, các phiên bản phổ biến của Linux như Ubuntu, CentOS hoặc Debian được sử dụng.
- E – Nginx (Engine-X): Đây là một máy chủ web mã nguồn mở phổ biến được sử dụng để xử lý yêu cầu HTTP và phục vụ các tệp tĩnh và động. Nginx có hiệu suất cao, ít tài nguyên và khả năng mở rộng tốt.
- M – MySQL: Đây là hệ quản trị cơ sở dữ liệu quan hệ mã nguồn mở phổ biến. MySQL được sử dụng để lưu trữ dữ liệu cho ứng dụng web và cung cấp các tính năng mạnh mẽ cho việc truy vấn và quản lý cơ sở dữ liệu.
- P – PHP: Đây là một ngôn ngữ lập trình phổ biến được sử dụng để phát triển các ứng dụng web động. PHP cho phép xử lý động trên máy chủ và tạo nội dung động để gửi đến trình duyệt của người dùng.
Đảm bảo rằng bạn có quyền truy cập sudo vào máy chủ Linux vì các lệnh được sử dụng trong hướng dẫn này yêu cầu đặc quyền root.
Bước 1: Cài đặt máy chủ Web Nginx
Cập nhật kho lưu trữ gói:
sudo apt update -y
Sau đó, chạy lệnh apt install để cài đặt Nginx:
sudo apt install nginx -y
sudo systemctl enable nginx
Nếu bạn đã kích hoạt tường lửa ufw, bạn sẽ cần cho phép kết nối tới Nginx. Để kiểm tra xem có các profile UFW nào có sẵn, hãy chạy lệnh:
sudo ufw app list
Output
Available applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH
Vì bạn chưa cấu hình SSL cho máy chủ của mình trong hướng dẫn này, bạn chỉ cần cho phép lưu lượng HTTP thông thường trên cổng 80.
sudo ufw allow 'Nginx HTTP'
Bạn có thể xác minh thay đổi bằng cách kiểm tra trạng thái:
sudo ufw status
Output
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)
Mở trình duyệt và truy cập bằng địa chỉ sau nó sẽ đưa bạn đến trang mặc định của Nginx:
http://server_domain_or_IP

Bây giờ bạn đã có một máy chủ web đang hoạt động, bạn cần cài đặt hệ thống cơ sở dữ liệu để lưu trữ và quản lý dữ liệu cho trang web của bạn. MySQL là một hệ quản trị cơ sở dữ liệu phổ biến được sử dụng trong môi trường PHP
sudo apt install mysql-server -y
sudo systemctl enable mysql
Khi quá trình cài đặt hoàn tất, khuyến nghị bạn chạy một srcipt bảo mật đi kèm với MySQL. Kịch bản này sẽ loại bỏ một số cài đặt mặc định không an toàn và khóa quyền truy cập vào hệ thống cơ sở dữ liệu của bạn. Bằng cách chạy lệnh sau:
sudo mysql_secure_installation
Bạn sẽ được yêu cầu câu hỏi xem bạn có muốn cấu hình VALIDATE PASSWORD PLUGIN hay không.
Lưu ý: Nếu được kích hoạt, các mật khẩu không khớp với tiêu chí được chỉ định sẽ bị từ chối bởi MySQL với một lỗi. Bạn nên sử dụng mật khẩu mạnh và duy nhất cho thông tin đăng nhập cơ sở dữ liệu.
Trả lời Y để kích hoạt, hoặc bất cứ điều gì khác để tiếp tục mà không kích hoạt:
Output
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 bạn trả lời “yes”, bạn sẽ được yêu cầu chọn một mức độ kiểm tra mật khẩu. Hãy nhớ rằng nếu bạn nhập “2” cho mức độ mạnh nhất, bạn sẽ nhận được lỗi khi cố gắng đặt mật khẩu mà không chứa chữ số, chữ cái in hoa và thường, và ký tự đặc biệt:
Output
There are three levels of password validation policy:
LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1
Đối với các câu hỏi còn lại, nhấn Y và nhấn phím ENTER tại mỗi lời nhắc. Điều này sẽ loại bỏ một số người dùng ẩn danh và cơ sở dữ liệu test, vô hiệu hóa đăng nhập root từ xa và tải các quy tắc mới này để MySQL ngay lập tức thực hiện các thay đổi bạn đã thực hiện.
Khi bạn hoàn thành, hãy thử đăng nhập vào bảng điều khiển MySQL:
sudo mysql
Output
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.28-0ubuntu4 (Ubuntu)
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
Để thoát khỏi bảng điều khiển MySQL, nhập vào dòng lệnh sau:
mysql> exit
Bạn đã cài đặt Nginx để phục vụ nội dung và MySQL để lưu trữ và quản lý dữ liệu. Bây giờ bạn có thể cài đặt PHP để xử lý mã và tạo nội dung động cho máy chủ web.
Trong khi Apache nhúng trình thông dịch PHP trong mỗi yêu cầu, Nginx yêu cầu một chương trình bên ngoài để xử lý PHP và làm cầu nối giữa trình thông dịch PHP và máy chủ web. Điều này cho phép đạt được hiệu suất tổng thể tốt hơn đối với hầu hết các trang web dựa trên PHP, nhưng nó yêu cầu cấu hình bổ sung. Bạn sẽ cần cài đặt php8.1-fpm, viết tắt của “PHP fastCGI process manager” và sử dụng phiên bản PHP hiện tại (tại thời điểm viết), để thông báo cho Nginx chuyển các yêu cầu PHP cho phần mềm này để xử lý. Ngoài ra, bạn cũng cần php-mysql, một mô-đun PHP cho phép PHP giao tiếp với cơ sở dữ liệu dựa trên MySQL. Các gói PHP cốt lõi sẽ tự động được cài đặt như các phụ thuộc.
Để cài đặt các gói php8.1-fpm và php-mysql, chạy lệnh sau:
sudo apt install php8.1-fpm php-mysql -y
sudo systemctl enable php8.1-fpm
Bước 4: Cấu hình Nginx để sử dụng trình xử lý PHP
Khi sử dụng máy chủ web Nginx, chúng ta có thể tạo các server blocks (tương tự như virtual host trong Apache) để đóng gói các chi tiết cấu hình và lưu trữ nhiều tên miền trên một máy chủ duy nhất. Trong hướng dẫn này, chúng ta sẽ sử dụng toantranvan.com như một tên miền mẫu.
Trên Ubuntu 22.04, Nginx có một server blocks được kích hoạt mặc định và được cấu hình để phục vụ nội dung từ một thư mục tại /var/www/html. Mặc dù điều này hoạt động tốt cho một trang web duy nhất, nhưng nếu bạn đang lưu trữ nhiều trang web, việc quản lý có thể trở nên khó khăn. Thay vì sửa đổi /var/www/html, chúng ta sẽ tạo một cấu trúc thư mục trong /var/www cho trang web toantranvan.com, và vẫn giữ /var/www/html như thư mục mặc định khi bạn có nhu cầu trở về ban đầu.
Tạo thư mục gốc cho trang web toantranvan.com như sau:
sudo mkdir /var/www/toantranvan.com
Tiếp theo, gán quyền sở hữu cho thư mục bằng biến môi trường $USER, sẽ tham chiếu đến người dùng hệ thống hiện tại của bạn:
sudo chown -R $USER:$USER /var/www/toantranvan.com
Tiếp theo, mở một tệp cấu hình mới trong thư mục sites-available của Nginx bằng trình chỉnh sửa dòng lệnh mà bạn thích. Ở đây, chúng ta sẽ sử dụng vi:
sudo vi /etc/nginx/sites-available/toantranvan.com
Chèn cấu hình cơ bản sau đây:
server {
listen 80;
server_name toantranvan.com www.toantranvan.com;
root /var/www/toantranvan.com;
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;
}
}
Dưới đây là ý nghĩa của từng chỉ thị và khối vị trí trong cấu hình:
listen
— Cổng mà Nginx sẽ lắng nghe. Trong trường hợp này, nó sẽ lắng nghe trên cổng 80, cổng mặc định cho HTTP.root
— Xác định thư mục gốc nơi các tệp được phục vụ bởi trang web này được lưu trữ.index
— Xác định thứ tự mà Nginx sẽ ưu tiên các tệp index cho trang web này. Thông thường, việc liệt kê các tệp index.html có độ ưu tiên cao hơn các tệp index.php cho phép nhanh chóng thiết lập một trang đích bảo trì trong ứng dụng PHP. Bạn có thể điều chỉnh các thiết lập này để phù hợp với nhu cầu của ứng dụng của bạn.server_name
— Xác định tên miền và/hoặc địa chỉ IP mà khối máy chủ này sẽ phản hồi. Hãy chỉ định chỉ thị này với tên miền máy chủ hoặc địa chỉ IP công khai của máy chủ của bạn.location /
— Khối vị trí đầu tiên bao gồm chỉ thị try_files, kiểm tra sự tồn tại của các tệp hoặc thư mục phù hợp với yêu cầu URL. Nếu Nginx không tìm thấy tài nguyên thích hợp, nó sẽ trả về mã lỗi 404.location ~ \.php$
— Khối vị trí này xử lý xử lý PHP thực tế bằng cách chỉ định cho Nginx tệp cấu hình fastcgi-php.conf và tệp php8.1-fpm.sock, xác định socket liên quan đến php8.1-fpm.location ~ /\.ht
— Khối vị trí cuối cùng xử lý các tệp .htaccess, mà Nginx không xử lý. Bằng cách thêm chỉ thị deny all, nếu có bất kỳ tệp .htaccess nào xuất hiện trong thư mục gốc tài liệu, chúng sẽ không được phục vụ cho khách truy cập.
Kích hoạt cấu hình của bạn bằng cách liên kết tệp cấu hình từ thư mục sites-enabled của Nginx:
sudo ln -s /etc/nginx/sites-available/toantranvan.com /etc/nginx/sites-enabled/
Tiếp theo, hủy liên kết tệp cấu hình mặc định từ thư mục /sites-enabled/:
sudo unlink /etc/nginx/sites-enabled/default
Lưu ý: Nếu bạn cần khôi phục cấu hình mặc định, bạn có thể làm như sau bằng cách tạo lại liên kết mặc định, như sau:
sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/
Bạn có thể kiểm tra cấu hình của mình để tìm lỗi cú pháp bằng cách chạy lệnh sau:
sudo nginx -t
Tải lại Nginx để áp dụng các thay đổi:
sudo systemctl reload nginx
Trang web mới của bạn hiện đã hoạt động, nhưng thư mục gốc của trang web /var/www/toantranvan.com vẫn trống rỗng. Hãy tạo tệp index.html trong vị trí đó để bạn có thể kiểm tra xem khối máy chủ mới của bạn hoạt động như mong đợi:
sudo vi /var/www/toantranvan.com/index.html
Thêm nội dung sau vào tệp index.html nà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>
Bây giờ hãy mở trình duyệt và truy cập vào tên miền hoặc địa chỉ IP của máy chủ của bạn, được liệt kê trong chỉ thị server_name trong tệp cấu hình khối máy chủ của bạn:
http://server_domain_or_IP
Bạn sẽ nhận được một trang như sau:

Nếu bạn nhận được trang này, điều đó có nghĩa là khối máy chủ Nginx của bạn đang hoạt động như mong đợi.
Bạn có thể để tệp này ở đây như một trang đích tạm thời cho ứng dụng của bạn cho đến khi bạn thiết lập một tệp index.php để thay thế nó. Khi bạn làm điều đó, hãy nhớ loại bỏ hoặc đổi tên tệp index.html từ thư mục gốc tài liệu của bạn, vì theo mặc định, nó sẽ có độ ưu tiên hơn tệp index.php.
Bộ LEMP của bạn đã được cấu hình hoàn chỉnh.
Tổng Kết
Trong hướng dẫn này, bạn đã xây dựng một nền tảng linh hoạt để phục vụ các trang web và ứng dụng PHP cho khách truy cập của bạn, sử dụng Nginx làm máy chủ web và MySQL là hệ thống cơ sở dữ liệu. Bạn cũng có thể thực hiện điều này với máy chủ web Apache, hãy xem hướng dẫn của chúng tôi về cách cài đặt Linux, Apache, MySQL, PHP (bộ LAMP) trên Ubuntu 22.04. Bạn cũng có thể bảo mật trang web của mình với Let’s Encrypt, một dịch vụ cung cấp chứng chỉ miễn phí và đáng tin cậy. Tìm hiểu cách thực hiện điều này với hướng dẫn của chúng tôi về Let’s Encrypt cho Apache.