Cách Cài Đặt Linux, Nginx, MySQL, PHP (gói LEMP) trên Ubuntu
Giới thiệu
Ngăn xếp phần mềm LEMP phục vụ các trang web động và ứng dụng web được 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áy chủ web Nginx (đọc giống như “Engine-X”). Dữ liệu phía backend được lưu trữ trong cơ sở dữ liệu MySQL và xử lý động được thực hiện bởi PHP.
Hướng dẫn này trình bày cách cài đặt ngăn xếp LEMP trên một máy chủ Ubuntu. Hệ điều hành Ubuntu đảm nhiệm phần Linux của ngăn xếp. Chúng tôi sẽ mô tả cách để các thành phần còn lại hoạt động và sẵn sàng sử dụng.
Lưu ý: Hướng dẫn này chủ yếu hướng tới Ubuntu 22.04 LTS với PHP 8.1. Đối với người dùng Ubuntu 24.04 LTS, hãy điều chỉnh các tham chiếu phiên bản PHP từ
php8.1-fpmsangphp8.3-fpmtrong tất cả các lệnh. Ngoài ra, hãy chắc chắn cập nhật bất kỳ đường dẫn một ổ cắm PHP-FPM nào trong cấu hình Nginx của bạn (ví dụ, sử dụng/run/php/php8.3-fpm.sockcho Ubuntu 24.04).
Cách Cài Đặt Linux, Nginx, MySQL, PHP (gói LEMP) trên Ubuntu
- Cài đặt Máy chủ Web Nginx
- Cài đặt MySQL
- Cài đặt PHP
- Cấu hình Nginx để sử dụng bộ xử lý PHP
- Kiểm tra PHP với Nginx
- Kiểm tra kết nối cơ sở dữ liệu từ PHP
Điều kiện tiên quyết
Sử dụng một người dùng sudo không phải root trên Ubuntu với tường lửa UFW được bật. Làm theo hướng dẫn cài đặt máy chủ ban đầu cho Ubuntu của chúng tôi để cấu hình điều này.
Bước 1 – Cài đặt Máy chủ Web Nginx
Để hiển thị các trang web cho khách truy cập, bạn sẽ sử dụng Nginx, một máy chủ web có hiệu suất cao. Bạn sẽ sử dụng trình quản lý gói APT để cài đặt phần mềm này.
Cập nhật chỉ mục gói của server, sau đó cài đặt Nginx:
sudo apt updateTiếp theo, chạy apt install để cài đặt Nginx:
sudo apt install nginxKhi được nhắc, nhấn Y và ENTER để xác nhận rằng bạn muốn cài đặt Nginx. Khi việc cài đặt hoàn tất, máy chủ web Nginx sẽ hoạt động và chạy trên máy chủ Ubuntu của bạn.
Kiểm tra xem Nginx có đang chạy không:
sudo systemctl status nginxBạn nên thấy kết quả hiển thị rằng Nginx đang hoạt động:
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since...Trên Ubuntu, Nginx được cấu hình để bắt đầu chạy ngay sau khi cài đặt.
Cho phép lưu lượng HTTP đi qua tường lửa ufw. Nginx đăng ký một số hồ sơ ứng dụng UFW khi cài đặt. Kiểm tra các hồ sơ có sẵn:
sudo ufw app listAvailable applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSHBật hồ sơ hạn chế nhất cho phép lưu lượng cần thiết. Vì SSL chưa được cấu hình, chỉ cho phép lưu lượng HTTP trên cổng 80:
Bật tính năng này bằng cách chạy lệnh sau:
sudo ufw allow 'Nginx HTTP'
Xác minh thay đổi tường lửa:
sudo ufw statusĐầu ra này hiển thị rằng lưu lượng HTTP hiện đã được cho phép:
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 chức năng tên miền của máy chủ Nginx, hãy truy cập http://your_domain bằng trình duyệt web bạn ưa thích.
Nếu bạn không có tên miền trỏ tới máy chủ của mình và bạn không biết địa chỉ IP công khai của máy chủ, bạn có thể tìm thấy nó bằng cách chạy một trong các lệnh sau:
ip addr showhostname -IĐiều này sẽ in ra một vài địa chỉ IP. Bạn có thể thử từng địa chỉ trong số đó trên trình duyệt web của mình.
Ngoài ra, bạn có thể kiểm tra địa chỉ IP nào có thể truy cập được, khi nhìn từ các vị trí khác trên internet:
curl -4 icanhazip.comNhập địa chỉ mà bạn nhận được trong trình duyệt web của mình và nó sẽ đưa bạn đến trang mặc định của Nginx:
http://<server_domain_or_IP>Nếu bạn nhận được trang này, điều đó có nghĩa là bạn đã cài đặt thành công Nginx và cho phép lưu lượng HTTP cho máy chủ web của mình.
Bước 2 — Cài đặt MySQL
Cài đặt MySQL để lưu trữ và quản lý dữ liệu trang web. MySQL là hệ quản trị cơ sở dữ liệu tiêu chuẩn cho môi trường PHP.
Một lần nữa, sử dụng apt để lấy và cài đặt phần mềm này:
sudo apt install mysql-serverKhi được nhắc, xác nhận cài đặt bằng cách nhấn Y, sau đó nhấn ENTER.
Sau khi cài đặt, chạy tập lệnh bảo mật để loại bỏ các thiết lập mặc định không an toàn và khóa quyền truy cập cơ sở dữ liệu:
sudo mysql_secure_installationBạn sẽ được hỏi một câu hỏi về việc có muốn cấu hình VALIDATE PASSWORD PLUGIN hay không.
Lưu ý: Bật tính năng này phần nào là một quyết định mang tính đánh giá. Nếu được bật, các mật khẩu không đáp ứng các tiêu chí đã định sẽ bị MySQL từ chối kèm theo lỗi. Việc để xác thực tắt là an toàn, nhưng bạn nên luô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.
Nhập Y để đồng ý, hoặc nhập bất cứ gì khác để tiếp tục mà không kích hoạt:
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 “có”, bạn sẽ được yêu cầu chọn mức độ xác thực 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 bất kỳ mật khẩu nào không chứa số, chữ hoa và chữ thường, cũng như ký tự đặc biệt:
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: 1Bất kể bạn có chọn thiết lập VALIDATE PASSWORD PLUGIN hay không, server của bạn sẽ yêu cầu bạn chọn và xác nhận mật khẩu cho người dùng MySQL root. Điều này không nên nhầm lẫn với root hệ thống. Người dùng root của cơ sở dữ liệu là người dùng quản trị với đầy đủ quyền hạn trên hệ thống cơ sở dữ liệu. Mặc dù phương thức xác thực mặc định cho người dùng MySQL root không yêu cầu sử dụng mật khẩu, ngay cả khi đã đặt mật khẩu, bạn vẫn nên đặt mật khẩu mạnh ở đây như một biện pháp an toàn bổ sung. Chúng ta sẽ nói về điều này ngay sau đây.
Nếu bạn bật xác thực mật khẩu, bạn sẽ thấy độ mạnh của mật khẩu gốc mà bạn đã nhập và máy chủ của bạn sẽ hỏi liệu bạn có muốn tiếp tục với mật khẩu đó hay không. Nếu bạn hài lòng với mật khẩu hiện tại, hãy nhấn Y để “có” tại dấu nhắ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 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ẽ xóa một số người dùng ẩn danh và cơ sở dữ liệu kiểm tra, tắt đăng nhập root từ xa, và tải các quy tắc mới này để MySQL ngay lập tức áp dụng các thay đổi mà bạn đã thực hiện.
Khi bạn hoàn tất, hãy kiểm tra xem bạn có thể đăng nhập vào bảng điều khiển MySQL không:
sudo mysqlĐiều này sẽ kết nối với máy chủ MySQL với tư cách người dùng cơ sở dữ liệu quản trị root, điều này được suy ra khi sử dụng sudo khi chạy lệnh này. Bạn nên nhận được đầu ra như sau:
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, hãy nhập lệnh sau:
exitLưu ý rằng bạn không cần cung cấp mật khẩu để đăng nhập với tư cách là người dùng root, mặc dù bạn đã định nghĩa mật khẩu khi chạy script mysql_secure_installation. Nguyên nhân là khi cài đặt trên Ubuntu, phương thức xác thực mặc định cho người dùng quản trị MySQL là auth_socket, thay vì phương thức sử dụng mật khẩu. Điều này có thể ban đầu dường như là một vấn đề về bảo mật, nhưng thực tế nó làm cho máy chủ cơ sở dữ liệu an toàn hơn vì chỉ những người dùng hệ thống có quyền sudo kết nối từ console hoặc thông qua ứng dụng chạy với cùng quyền hạn mới được phép đăng nhập như người dùng MySQL root. Về mặt thực tiễn, điều này có nghĩa là bạn sẽ không thể sử dụng người dùng quản trị cơ sở dữ liệu root để kết nối từ ứng dụng PHP của mình.
Để tăng cường bảo mật, tốt nhất là nên tạo các tài khoản người dùng riêng với quyền hạn hạn chế cho mỗi cơ sở dữ liệu, đặc biệt nếu bạn dự định lưu trữ nhiều cơ sở dữ liệu trên máy chủ của mình.
Lưu ý: Một số phiên bản cũ của thư viện PHP MySQL gốc mysqlnd không hỗ trợ caching_sha2_authentication, phương thức xác thực mặc định cho người dùng được tạo trên MySQL 8. Vì lý do đó, khi tạo người dùng cơ sở dữ liệu cho các ứng dụng PHP trên MySQL 8, bạn có thể cần đảm bảo họ được cấu hình sử dụng mysql_native_password thay vào đó. Chúng tôi sẽ hướng dẫn cách làm việc này ở Bước 6.
Máy chủ MySQL của bạn hiện đã được cài đặt và bảo mật. Tiếp theo, bạn sẽ cài đặt PHP, thành phần cuối cùng trong bộ LEMP.
Bước 3 – Cài đặt PHP
Cài đặt PHP để xử lý mã và tạo nội dung động. Nginx yêu cầu một chương trình bên ngoài để xử lý PHP.
PHP-FPM ("trình quản lý tiến trình fastCGI") xử lý PHP một cách hiệu quả với các tính năng bảo mật bổ sung, mang lại hiệu suất tốt hơn cho các website dựa trên PHP. Cài đặt php-fpm để điều hướng các yêu cầu PHP từ Nginx, và php-mysql để cho phép PHP giao tiếp với MySQL. Các gói PHP cốt lõi sẽ được cài đặt tự động như các phụ thuộc.
Để cài đặt các gói php8.1-fpm và php-mysql, chạy:
sudo apt install php8.1-fpm php-mysqlKhi được nhắc, nhấn Y và ENTER để xác nhận cài đặt.
Kiểm tra xem PHP-FPM có đang chạy không:
sudo systemctl status php8.1-fpmBạn nên thấy đầu ra hiển thị PHP-FPM đang hoạt động:
● php8.1-fpm.service - The PHP 8.1 FastCGI Process Manager
Loaded: loaded
Active: active (running)Bạn cũng có thể kiểm tra phiên bản PHP:
php -vPHP 8.1.x (cli) (built: ...)
Copyright (c) The PHP Group
Zend Engine v4.1.xCấu hình Nginx để sử dụng các thành phần PHP này.
Bước 4 — Cấu hình Nginx để sử dụng bộ xử lý PHP
Tạo các server block của Nginx (tương tự như virtual host của Apache) để gom gọn cấu hình và lưu trữ nhiều tên miền trên một máy chủ. Hướng dẫn này sử dụng your_domain làm ví dụ về tên miền.
Thông tin: Để tìm hiểu thêm về cách thiết lập tên miền với Linux-Console.net, hãy đọc bài giới thiệu về DNS của Linux-Console.net.
Trên Ubuntu 22.04, Nginx bật một khối máy chủ mặc định phục vụ các tệp từ /var/www/html. Đối với nhiều trang web, hãy tạo một cấu trúc thư mục trong /var/www cho tên_miền_của_bạn, để lại /var/www/html làm thư mục dự phòng mặc định.
Tạo thư mục web gốc cho your_domain như sau:
sudo mkdir /var/www/your_domainTiếp theo, gán quyền sở hữu của thư mục cho biến môi trường $USER, biến này sẽ tham chiếu tới người dùng hệ thống hiện tại của bạn:
sudo chown -R $USER:$USER /var/www/your_domainSau đó, mở một tệp cấu hình mới trong thư mục sites-available của Nginx bằng trình soạn thảo dòng lệnh mà bạn ưa thích. Ở đây, chúng ta sẽ sử dụng nano:
sudo nano /etc/nginx/sites-available/your_domainĐiều này sẽ tạo một tệp trống mới. Chèn cấu hình cơ bản sau:
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:/run/php/php8.1-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}Đây là những gì mỗi chỉ thị và khối vị trí này thực hiện:
listen— Xác định cổng mà Nginx sẽ lắng nghe. Trong trường hợp này, nó sẽ lắng nghe trên cổng80, cổng mặc định cho HTTP.root— Xác định thư mục gốc của tài liệu nơi các tập tin được trang web này phục vụ đượ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, các tệpindex.htmlđược liệt kê ưu tiên cao hơn các tệpindex.phpđể dễ dàng thiết lập một trang bảo trì nhanh trong các ứng dụng PHP. Bạn có thể điều chỉnh các cài đặt này cho phù hợp hơn với nhu cầu của ứng dụng.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. Chỉ dẫn này nên được trỏ tới tên miền hoặc địa chỉ IP công khai của máy chủ của bạn.location /— Khối location đầu tiên bao gồm một chỉ thịtry_files, dùng để 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ề lỗi 404.location ~ \.php$— Khối location này xử lý việc thực thi PHP bằng cách trỏ Nginx tới file cấu hìnhfastcgi-php.confvà filephp8.1-fpm.sock, file này xác định socket nào được liên kết vớiphp8.1-fpm.location ~ /\.ht— Khối location 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 bất kỳ tệp.htaccessnào vô tình xuất hiện trong thư mục gốc của tài liệu, chúng sẽ không được phục vụ cho người truy cập.
Khi bạn hoàn tất việc chỉnh sửa, hãy lưu và đóng tập tin. Nếu bạn đang sử dụng nano, bạn có thể làm điều này bằng cách nhấn CTRL+X rồi Y và ENTER để xác nhận.
Kích hoạt cấu hình của bạn bằng cách liên kết tới tệp cấu hình từ thư mục sites-enabled của Nginx:
sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/Sau đó, hủy liên kết tệp cấu hình mặc định khỏi thư mục /sites-enabled/:
sudo unlink /etc/nginx/sites-enabled/defaultLưu ý: Nếu bạn cần khôi phục cấu hình mặc định, bạn có thể thực hiện bằng cách tạo lại liên kết tượng trưng, như sau:
sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/Điều này sẽ hướng dẫn Nginx sử dụng cấu hình vào lần tải lại tiếp theo. 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 -tNếu có bất kỳ lỗi nào được báo cáo, hãy quay lại tệp cấu hình của bạn để xem lại nội dung trước khi tiếp tục.
Khi bạn đã sẵn sàng, hãy tải lại Nginx để áp dụng các thay đổi:
sudo systemctl reload nginxTrang web mới của bạn hiện đã hoạt động, nhưng thư mục gốc web /var/www/your_domain vẫn còn trống. Hãy tạo một tệp index.html tại vị trí đó để bạn có thể kiểm tra xem khối máy chủ mới của bạn có hoạt động như mong đợi hay không:
nano /var/www/your_domain/index.htmlBao gồm nội dung sau trong tệp 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 tên miền hoặc địa chỉ IP của máy chủ của bạn, như đượ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_IPBạn sẽ nhận được một trang giống 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 tại chỗ như một trang đích tạm thời cho ứng dụng của mình cho đến khi bạn thiết lập một tệp index.php để thay thế nó.
Cảnh báo: Sau khi thêm tệp index.php của bạn, hãy chắc chắn xóa hoặc đổi tên tệp index.html khỏi thư mục gốc của bạn. Nếu cả hai tệp tồn tại, Nginx sẽ phục vụ index.html theo mặc định, và trang PHP của bạn sẽ không hiển thị—đây là nguyên nhân phổ biến gây nhầm lẫn cho người dùng mới.
Ngăn xếp LEMP của bạn giờ đã được cấu hình đầy đủ. Trong bước tiếp theo, bạn sẽ tạo một tập lệnh PHP để kiểm tra xem Nginx có thực sự xử lý được các tệp .php trên trang web mới được cấu hình của bạn hay không.
Bước 5 – Kiểm tra PHP với Nginx
Ngăn xếp LEMP của bạn bây giờ nên đã được thiết lập hoàn chỉnh. Bạn có thể kiểm tra để xác nhận rằng Nginx có thể xử lý các tập tin .php đúng cách thông qua bộ xử lý PHP của bạn.
Bạn có thể làm điều này bằng cách tạo một tệp PHP thử nghiệm trong thư mục gốc tài liệu của bạn. Mở một tệp mới có tên info.php trong thư mục gốc tài liệu của bạn bằng trình soạn thảo văn bản ưa thích:
nano /var/www/your_domain/info.phpThêm các dòng sau vào tệp mới. Đây là mã PHP hợp lệ sẽ trả về thông tin về máy chủ của bạn:
<?php
phpinfo();Khi bạn hoàn tất, hãy lưu và đóng tệp.
Bây giờ bạn có thể truy cập trang này trên trình duyệt web của mình bằng cách truy cập tên miền hoặc địa chỉ IP công cộng mà bạn đã thiết lập trong tệp cấu hình Nginx, sau đó thêm /info.php:
http://server_domain_or_IP/info.phpBạn sẽ nhận được một trang web chứa thông tin chi tiết về máy chủ của bạn:
Sau khi kiểm tra các thông tin liên quan về máy chủ PHP của bạn thông qua trang đó, tốt nhất là xóa tệp mà bạn đã tạo vì nó chứa thông tin nhạy cảm về môi trường PHP và máy chủ Ubuntu của bạn. Bạn có thể sử dụng rm để xóa tệp đó:
sudo rm /var/www/your_domain/info.phpBạn luôn có thể tạo lại tệp này nếu cần sau này.
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 PHP có thể kết nối với MySQL và thực hiện các truy vấn cơ sở dữ liệu hay không, bạn có thể tạo một bảng thử nghiệm với dữ liệu giả và truy vấn nội dung của nó từ một script PHP. Trước khi làm điều này, bạn cần tạo một cơ sở dữ liệu thử nghiệm và một người dùng MySQL mới được cấu hình đúng cách để truy cập vào cơ sở dữ liệu đó.
Lưu ý: Một số phiên bản cũ của thư viện PHP MySQL gốc mysqlnd không hỗ trợ caching_sha2_authentication, phương thức xác thực mặc định cho MySQL 8, bạn có thể cần đảm bảo rằng chúng được cấu hình sử dụng mysql_native_password thay thế.
Chúng tôi sẽ tạo một cơ sở dữ liệu có tên example_database và một người dùng có tên example_user, nhưng bạn có thể thay thế các tên này bằng các giá trị khác.
Đầu tiên, kết nối với bảng điều khiển MySQL bằng tài khoản root:
sudo mysqlĐể tạo một cơ sở dữ liệu mới, hãy chạy lệnh sau từ bảng điều khiển MySQL của bạn:
CREATE DATABASE example_database;Bây giờ bạn có thể tạo một người dùng mới và cấp cho họ đầy đủ quyền trên cơ sở dữ liệu tùy chỉnh mà bạn đã tạo.
Lệnh sau tạo một người dùng mới có tên example_user, sử dụng mysql_native_password làm phương thức xác thực mặc định. Chúng ta đang đặt mật khẩu cho người dùng này là password, nhưng bạn nên thay giá trị này bằng một mật khẩu an toàn theo lựa chọn của riêng bạn.
CREATE USER 'example_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';Bây giờ chúng ta cần cấp quyền cho người dùng này trên cơ sở dữ liệu example_database:
GRANT ALL ON example_database.* TO 'example_user'@'%';Điều này sẽ cấp cho người dùng example_user toàn quyền trên cơ sở dữ liệu example_database trong khi ngăn người dùng này tạo hoặc sửa đổi các cơ sở dữ liệu khác trên máy chủ của bạn.
Bây giờ thoát khỏi shell MySQL bằng lệnh sau:
exitBạn có thể kiểm tra xem người dùng mới có quyền thích hợp hay không bằng cách đăng nhập lại vào bảng điều khiển MySQL, lần này sử dụng thông tin đăng nhập của người dùng tùy chỉnh. Chú ý đến cờ -p trong lệnh này, điều này sẽ nhắc bạn nhập mật khẩu đã sử dụng khi tạo người dùng example_user:
mysql -u example_user -pSau khi đăng nhập vào bảng điều khiển MySQL, hãy xác nhận rằng bạn có quyền truy cập vào cơ sở dữ liệu example_database:
SHOW DATABASES;Điều này sẽ trả về kết quả sau:
+--------------------+
| Database |
+--------------------+
| example_database |
| information_schema |
+--------------------+
2 rows in set (0.000 sec)Tiếp theo, chúng ta sẽ tạo một bảng thử nghiệm có tên todo_list. Từ bảng điều khiển MySQL, chạy câu lệnh sau:
CREATE TABLE example_database.todo_list (
item_id INT AUTO_INCREMENT,
content VARCHAR(255),
PRIMARY KEY(item_id)
);Chèn một vài hàng nội dung vào bảng kiểm tra. Bạn có thể muốn lặp lại lệnh tiếp theo vài lần, sử dụng các giá trị khác nhau:
INSERT INTO example_database.todo_list (content) VALUES ("My first important item");Để xác nhận rằng dữ liệu đã được lưu thành công vào bảng của bạn, hãy chạy:
SELECT * FROM example_database.todo_list;Kết quả của bạn nên hiển thị 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)Sau khi xác nhận rằng bạn có dữ liệu hợp lệ trong bảng kiểm tra của mình, bạn có thể thoát khỏi bảng điều khiển MySQL:
exitBây giờ bạn có thể tạo tập lệnh PHP để kết nối với MySQL và truy vấn nội dung của bạn. Tạo một tập tin PHP mới trong thư mục gốc web tùy chỉnh của bạn bằng trình soạn thảo mà bạn ưa thích. Chúng ta sẽ sử dụng nano cho việc này:
nano /var/www/your_domain/todo_list.phpĐoạn script PHP sau kết nối với cơ sở dữ liệu MySQL và truy vấn nội dung của bảng todo_list, hiển thị kết quả dưới dạng danh sách. Nếu có vấn đề với kết nối cơ sở dữ liệu, nó sẽ ném ra một ngoại lệ.
Thêm nội dung sau vào script todo_list.php của bạn:
<?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 tệp khi bạn đã chỉnh sửa xong.
Bây giờ bạn có thể truy cập trang này trong trình duyệt web của mình bằng cách truy cập tên miền hoặc địa chỉ IP công cộng đã được cấu hình cho trang web của bạn, sau đó thêm /todo_list.php:
http://server_domain_or_IP/todo_list.phpBạn nên nhận được một trang như sau, hiển thị nội dung bạn đã chèn vào bảng thử nghiệm của mình:
Điều đó có nghĩa là môi trường PHP của bạn đã sẵn sàng để kết nối và tương tác với máy chủ MySQL của bạn.
Câu hỏi thường gặp
Stack LEMP được sử dụng để làm gì?
Stack LEMP lưu trữ các website và ứng dụng động dựa trên PHP bao gồm WordPress, Laravel, Magento, Drupal và các dự án PHP tùy chỉnh. Nó đặc biệt hiệu quả cho các website có lưu lượng truy cập cao, yêu cầu xử lý kết nối đồng thời một cách hiệu quả.
Sự khác nhau giữa các stack LEMP và LAMP là gì?
LEMP sử dụng Nginx, xử lý kết nối một cách bất đồng bộ với kiến trúc hướng sự kiện—hiệu quả cho người dùng đồng thời. LAMP sử dụng Apache, truyền thống tạo một luồng cho mỗi yêu cầu (mặc dù Apache hiện đại hỗ trợ các chế độ hướng sự kiện). LEMP thường mang lại hiệu suất tốt hơn cho nội dung tĩnh và các kịch bản có nhiều người dùng đồng thời, trong khi LAMP cung cấp cấu hình .htaccess dễ dàng hơn và hỗ trợ module rộng hơn.
Tôi nên dùng phiên bản Ubuntu nào cho LEMP?
Ubuntu 22.04 LTS là mục tiêu chính cho hướng dẫn này, với PHP 8.1, MySQL 8.0 và Nginx được hỗ trợ dài hạn. Ubuntu 24.04 LTS (phiên bản mới nhất) bao gồm PHP 8.3 theo mặc định và có thể áp dụng hướng dẫn này bằng cách điều chỉnh đường dẫn socket PHP-FPM và số phiên bản tương ứng.
Làm thế nào để cài đặt LEMP stack trên Ubuntu 24.04?
Thực hiện theo các bước cơ bản sau:
- Cài đặt Nginx:
sudo apt install nginx - Cài đặt MySQL:
sudo apt install mysql-server - Chạy script bảo mật MySQL:
sudo mysql_secure_installation - Cài đặt PHP-FPM:
sudo apt install php-fpm php-mysql - Cấu hình khối máy chủ Nginx với tích hợp PHP-FPM
- Kiểm tra với
info.phpvà kết nối cơ sở dữ liệu
Xem hướng dẫn đầy đủ trong các bước 1-6 ở trên.
Tôi nên cài phiên bản PHP nào với Nginx và MySQL?
Sử dụng PHP mặc định của phiên bản Ubuntu của bạn để có khả năng tương thích tốt nhất:
- Ubuntu 22.04: PHP 8.1 (cài đặt qua
php8.1-fpm) - Ubuntu 24.04: PHP 8.3 (điều chỉnh lệnh thành
php8.3-fpmcho phiên bản này)
Cả hai phiên bản hoạt động xuất sắc với Nginx và MySQL 8.0, hỗ trợ các framework hiện đại và nhận các bản cập nhật bảo mật thường xuyên.
Làm thế nào để tôi cấu hình Nginx để xử lý các tập tin PHP?
Thêm một khối location ~ \.php$ vào cấu hình máy chủ Nginx của bạn để định tuyến các yêu cầu PHP đến PHP-FPM thông qua socket Unix:
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}Điều chỉnh đường dẫn socket dựa trên phiên bản PHP của bạn, kiểm tra bằng sudo nginx -t, và tải lại bằng sudo systemctl reload nginx.
Tại sao tôi nhận được lỗi “502 Bad Gateway” sau khi cài đặt PHP-FPM?
Lỗi 502 cho thấy Nginx không thể giao tiếp với PHP-FPM. Nguyên nhân phổ biến:
- PHP-FPM không chạy: Kiểm tra với
sudo systemctl status php8.1-fpmvà khởi động nếu cần - Đường dẫn socket sai: Kiểm tra xem
/run/php/php8.1-fpm.sockcó tồn tại và khớp với cấu hình Nginx của bạn không - Sự cố quyền: Đảm bảo người dùng Nginx (www-data) có thể truy cập socket
- Lỗi cấu hình PHP-FPM: Kiểm tra nhật ký tại
/var/log/php8.1-fpm.log
Giải pháp: Khởi động lại cả hai dịch vụ:
sudo systemctl restart php8.1-fpm nginxLàm thế nào để bảo mật MySQL sau khi cài đặt?
Chạy script bảo mật tích hợp:
sudo mysql_secure_installationLàm theo hướng dẫn để:
- Bật plugin xác thực mật khẩu
- Đặt mật khẩu gốc mạnh
- Xóa người dùng ẩn danh
- Vô hiệu hóa đăng nhập root từ xa
- Xóa cơ sở dữ liệu thử nghiệm
- Tải lại quyền
Đối với cơ sở dữ liệu ứng dụng, hãy tạo người dùng riêng với quyền hạn hạn chế thay vì sử dụng tài khoản root.
Tôi có thể chạy nhiều trang web trên một server LEMP không?
Vâng, tạo các block server Nginx riêng cho từng tên miền:
- Tạo thư mục:
sudo mkdir -p /var/www/second_domain - Tạo khối máy chủ:
sudo nano /etc/nginx/sites-available/second_domain - Cấu hình với các chỉ thị
server_namevàrootriêng biệt - Bật:
sudo ln -s /etc/nginx/sites-available/second_domain /etc/nginx/sites-enabled/ - Kiểm tra và nạp lại:
sudo nginx -t && sudo systemctl reload nginx
Mỗi trang web có thể có các cài đặt PHP riêng và người dùng cơ sở dữ liệu riêng.
Làm thế nào để nâng cấp PHP lên phiên bản mới hơn?
Các bản nâng cấp gói của Ubuntu tự động xử lý các phiên bản nhỏ. Đối với các bản nâng cấp phiên bản lớn:
Thêm PHP PPA của Ondřej (kho lưu trữ của bên thứ ba đáng tin cậy):
sudo add-apt-repository ppa:ondrej/php sudo apt updateCài đặt phiên bản PHP-FPM mới:
sudo apt install php8.3-fpm php8.3-mysql -yCập nhật đường dẫn socket trong cấu hình Nginx thành
/run/php/php8.3-fpm.sockKiểm tra và tải lại Nginx
Tùy chọn gỡ phiên bản cũ:
sudo apt purge php8.1-fpm
Luôn thử nghiệm trên môi trường thử nghiệm trước khi nâng cấp hệ thống sản xuất.
Khắc phục sự cố thường gặp
Lỗi 502 Cổng Không Hợp Lệ
Vấn đề phổ biến nhất với ngăn xếp LEMP xảy ra khi Nginx không thể giao tiếp với PHP-FPM:
Kiểm tra trạng thái PHP-FPM:
sudo systemctl status php8.1-fpmXác minh Đường dẫn Socket:
ls -la /run/php/Đầu ra dự kiến nên hiển thị tệp php8.1-fpm.sock.
Sửa chữa phổ biến:
- Khởi động lại PHP-FPM:
sudo systemctl restart php8.1-fpm - Kiểm tra đường dẫn socket trong block server Nginx có khớp với socket thực tế của PHP-FPM không
- Xác minh quyền truy cập tệp:
sudo chown www-data:www-data /run/php/php8.1-fpm.sock
Lỗi Từ Chối Quyền
Sửa quyền thư mục web:
sudo chown -R www-data:www-data /var/www/your_domain
sudo chmod -R 755 /var/www/your_domainSự cố kết nối MySQL
Đặt lại mật khẩu root MySQL:
sudo mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_password';
FLUSH PRIVILEGES;
EXIT;Kiểm tra dịch vụ MySQL:
sudo systemctl status mysqlPHP không xử lý
Xác minh các mô-đun PHP:
php -m | grep -E 'mysql|fpm'Kiểm tra cấu hình PHP-FPM:
sudo nginx -t
sudo php-fpm8.1 -tGỡ lỗi lỗi 404:
- Xác nhận
index.phpđược liệt kê trong chỉ thịindexcủa Nginx - Kiểm tra file có tồn tại:
ls -la /var/www/your_domain/ - Xem lại nhật ký lỗi Nginx:
sudo tail -f /var/log/nginx/error.log
Kết luận
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 website và ứng dụng PHP cho khách truy cập, sử dụng Nginx làm máy chủ web và MySQL làm hệ quản trị cơ sở dữ liệu. Bạn cũng có thể làm điều này với máy chủ web Apache, hãy tham khảo hướng dẫn của chúng tôi về Cách Cài Đặt LAMP (Linux, Apache, MySQL, PHP) trên Ubuntu. Bạn cũng có thể bảo mật trang web của mình với Let’s Encrypt, cung cấp chứng chỉ miễn phí và đáng tin cậy. Tìm hiểu cách làm một cách chi tiết với hướng dẫn của chúng tôi về Let’s Encrypt cho Apache.
Cảm ơn bạn đã học cùng cộng đồng Linux-Console.net.



