Cài đặt Linux Apache MySQL PHP (LAMP) trên Ubuntu 20 04
LAMP là một bộ phần mềm nguồn mở cài đặt cùng nhau cho phép server chứa các trang web động và ứng dụng web. Thuật ngữ này viết tắt cho hệ điều hành Linux, với web server Apache. Dữ liệu trang web được chứa trong database MySQL và nội dung web xử lý bởi PHP. Trong hướng dẫn này, ta sẽ cài đặt LAMP trên server Ubuntu 20.04.Yêu cầu
Để hoàn thành hướng dẫn này, bạn sẽ cần có server Ubuntu 20.04 với tài khoản user kích hoạt sudo
không root và firewall cơ bản. Điều này có thể được cấu hình bằng cách sử dụng hướng dẫn thiết lập server ban đầu cho Ubuntu 20.04 .
Bước 1 - Cài đặt Apache và cập nhật firewall
Web server Apache là một trong những web server phổ biến nhất trên thế giới, trở thành lựa chọn mặc định tốt để chứa một trang web.
Ta có thể cài đặt Apache dễ dàng bằng trình quản lý gói của Ubuntu, apt
. Một trình quản lý gói cho phép ta cài đặt hầu hết các phần mềm một cách dễ dàng từ một repository (kho chứa) được duy trì bởi Ubuntu. Ta cài đặt Apache bằng trình quản lý gói apt.
Nhập các lệnh sau:
- sudo apt-get update
- sudo apt-get install apache2
Vì ta đang sử dụng sudo
, các thao tác này được thực thi với quyền root, sẽ yêu cầu bạn nhập password của user thường (không phải root) để xác minh. Sau đó Nhập Y để cài đặt apache
Sau khi cài đặt xong, bạn cần điều chỉnh cài đặt firewall để cho phép lưu lượng HTTP. Để liệt kê các cấu hình ứng dụng UFW hiện có, bạn có thể chạy:
- sudo ufw app list
Bạn sẽ thấy đầu ra như thế này:
Available applications: Apache Apache Full Apache Secure OpenSSH
Đây là ý nghĩa:
- Apache : Cấu hình này chỉ mở cổng
80
(lưu lượng web bình thường, không được mã hóa). - Apache Full : Cấu hình này mở cả cổng 80 (lưu lượng web bình thường, không được mã hóa) và cổng 443 (lưu lượng được mã hóa TLS / SSL).
- Apache Secure : Cấu hình này chỉ mở cổng
443
(lưu lượng được mã hóa TLS / SSL).
Hiện tại, tốt nhất là chỉ cho phép các kết nối trên cổng 80
, vì đây là bản cài đặt Apache mới và bạn vẫn chưa có chứng chỉ TLS / SSL được cấu hình để cho phép lưu lượng HTTPS trên server .
Để cho phép lưu lượng trên cổng 80
, hãy sử dụng cấu hình :
- sudo ufw allow in "Apache"
Xác minh thay đổi bằng:
- sudo ufw status
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Apache ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Apache (v6) ALLOW Anywhere (v6)
Lưu lượng truy cập trên cổng 80
hiện đã được phép thông qua firewall.
Bạn có thể kiểm tra để xác minh rằng mọi thứ đã diễn ra theo kế hoạch bằng cách truy cập địa chỉ IP công cộng của server trong trình duyệt web (xem ghi chú dưới để tìm IP công cộng nếu chưa biết):
http://your_server_ip
Bạn sẽ thấy trang web Ubuntu 20.04 Apache mặc định, trang này cho mục đích thông tin thử nghiệm, trông giống như sau:
Nếu bạn thấy trang này, thì webserver hiện đã được cài đặt chính xác và có thể truy cập thông qua firewall.
Cách Tìm Địa chỉ IP Công cộng server
Nếu không biết IP công cộng của server là gì, có một số cách bạn có thể tìm thấy nó. Thông thường, đây là địa chỉ bạn sử dụng để kết nối với server thông qua SSH.
Có một số cách, cách đầu tiên, bạn có thể sử dụng các công cụ iproute2
để lấy địa chỉ IP:
- ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'
Kết quả là hai hoặc ba dòng. Tất cả đều là địa chỉ chính xác, nhưng máy tính có thể chỉ sử dụng được một IP, vì vậy hãy thử từng địa chỉ.
Cách khác là dùng curl
để liên hệ với bên ngoài để cho bạn biết IP , với lệnh:
- curl http://icanhazip.com
Sẽ cho kết quả IP .
Bước 2 - Cài đặt MySQL
Bây giờ ta đã thiết lập và chạy web server, đã đến lúc cài đặt MySQL. MySQL là một hệ quản trị database. Về cơ bản, nó sẽ tổ chức và cung cấp quyền truy cập vào database nơi trang web chứa thông tin.
Ta dùng apt
để cài:
- sudo apt-get install mysql-server
Khi được nhắc, hãy xác nhận cài đặt bằng lệnh Y
, sau đó ENTER
.
Khi quá trình cài đặt hoàn tất, bạn nên chạy một file bảo mật được cài đặt sẵn với MySQL. file này sẽ xóa 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 database:
- sudo mysql_secure_installation
Bạn có thể cần nhập password đã đặt cho account root MySQL. Tiếp theo, bạn sẽ được hỏi xem bạn có muốn cấu hình VALIDATE PASSWORD PLUGIN
.
Cảnh báo: Kích hoạt tính năng này cần cân nhắc. Nếu được bật, password không phù hợp với tiêu chí đã chỉ định sẽ bị MySQL từ chối, báo lỗi. Điều này gây ra sự cố nếu bạn sử dụng password yếu kết hợp với phần mềm tự động cấu hình đăng nhập user MySQL, chẳng hạn như gói Ubuntu cho phpMyAdmin. Có thể tắt tính năng bảo mật này, nhưng bạn cần luôn sử dụng password mạnh, duy nhất cho thông tin đăng nhập database.
Trả lời y.
VALIDATE PASSWORD PLUGIN 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 plugin? 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ức độ xác thực password. Nếu bạn nhập 2 , đối với cấp độ mạnh nhất, bạn sẽ nhận được lỗi khi password không chứa số, chữ hoa và chữ thường và các ký tự đặc biệt, hoặc dựa trên các từ thông dụng trong từ điển.
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
Server sẽ yêu cầu bạn chọn và xác nhận password cho user root MySQL, không nhầm lẫn với tài khoản root hệ thống . user root database là user quản trị có đầy đủ các quyền đối với hệ thống database. Mặc dù phương pháp xác thực mặc định cho user root MySQL không cho phép sử dụng password, ngay cả khi một password được đặt , bạn nên xác định một password mạnh ở đây như một biện pháp an toàn bổ sung. ta sẽ nói về điều này lát nữa.
Nếu đã bật xác thực password, bạn sẽ được hiển thị độ mạnh password cho password root mà bạn vừa nhập và server sẽ hỏi bạn có muốn tiếp tục với password đó hay không. Nếu bạn hài lòng với password hiện tại , hãy nhập Y
cho “có” tại lời 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, bạn nên nhấn Y và nhấn phím Enter . Thao tác này sẽ xóa một số user ẩn danh và database thử nghiệm, vô hiệu hóa đăng nhập root từ xa và áp dụng các quy tắc mới này để MySQL ngay lập tức tuân thủ những thay đổi ta đã 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 console MySQL hay không bằng lệnh:
- sudo mysql
Thao tác này sẽ kết nối với server MySQL dưới dạng root của user database quản trị. Bạn sẽ thấy kết quả:
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 22 Server version: 8.0.19-0ubuntu5 (Ubuntu) Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. 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 console MySQL, nhập:
- exit
Lưu ý rằng bạn không cần cung cấp password để kết nối với tư cách là user root , mặc dù bạn đã xác định password khi chạy file mysql_secure_installation
. Là do phương pháp xác thực mặc định cho user MySQL quản trị là unix_socket
thay vì password
. Điều này có vẻ làm lo ngại về bảo mật, nhưng thực ra nó làm cho server database an toàn hơn vì những user duy nhất được phép đăng nhập với tư cách user MySQL root là user hệ thống có quyền sudo kết nối từ console hoặc thông qua một ứng dụng chạy với quyền tương tự. Về mặt thực tế, điều đó có nghĩa là bạn sẽ không thể sử dụng user root database quản trị để kết nối từ ứng dụng PHP (như PhpMyAdmin chẳng hạn). Đặt password cho tài khoản MySQL root như một biện pháp dự phòng, trong trường hợp phương thức xác thực được thay đổi từ unix_socket
thành password
.
Để tăng cường bảo mật, tốt nhất bạn nên thiết lập các tài khoản user chuyên dụng với ít quyền hơn cho các database, đặc biệt nếu bạn có kế hoạch lưu trữ nhiều database trên server .
Lưu ý: Tại thời điểm viết bài này, thư viện MySQL PHP mysqlnd
không hỗ trợ caching_sha2_authentication
, phương thức xác thực mặc định cho MySQL 8. Vì lý do đó, khi tạo user database cho các ứng dụng PHP trên MySQL 8, bạn cần chắc chắn rằng chúng được cấu hình để sử dụng mysql_native_password
thay thế. ta sẽ trình bày cách thực hiện điều đó trong Bước 6 .
Server MySQL hiện đã được cài đặt và bảo mật. Tiếp theo, ta sẽ cài đặt PHP, thành phần cuối cùng trong LAMP.
Bước 3 - Cài đặt PHP
Bạn đã cài Apache để cho web và MySQL để quản lý database. PHP là thành phần xử lý mã để hiển thị nội dung cho user. Ngoài gói php
, ta cần php-mysql
, một module PHP cho giao tiếp với database MySQL. Bạn cũng cần libapache2-mod-php
để cho phép Apache xử lý các file PHP. Các gói PHP cơ bản khác sẽ tự được cài đặt dưới dạng các gói kèm theo.
Để cài đặt các gói này, hãy chạy:
- sudo apt install php libapache2-mod-php php-mysql
Sau khi cài đặt xong, ta có thể chạy lệnh sau để xác nhận phiên bản PHP :
- php -v
PHP 7.4.3 (cli) (built: Mar 26 2020 20:24:23) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies
Tại thời điểm này, LAMP đã hoạt động, nhưng trước khi có thể kiểm tra thiết lập bằng file PHP, tốt nhất bạn nên thiết lập VirtualHost Apache phù hợp để chứa các file và thư mục trên trang web ở bước tiếp theo đây.
Bước 4 - Tạo VirtualHost cho trang web
Khi sử dụng webserver Apache, bạn có thể tạo VirtualHost (tương tự như server block trong Nginx) để đóng gói chi tiết cấu hình và chứa hơn một domain từ server. Trong hướng dẫn này, ta sẽ thiết lập một domain có tên your_domain, bạn nên thay thế bằng tên domain của bạn .
Apache trên Ubuntu 20.04 có một server block mặc định được cấu hình để cung cấp nội dung từ thư mục /var/www/html
. Mặc dù điều này hoạt động tốt cho một trang web nhưng sẽ khó dùng nếu ta lưu trữ nhiều trang web. Thay vì sửa đổi /var/www/html
, ta sẽ tạo cấu trúc thư mục bên trong /var/www
cho trang your_domain , giữ nguyên /var/www/html
làm thư mục mặc định.
Tạo thư mục cho your_domain như sau:
- sudo mkdir /var/www/your_domain
Tiếp theo, chỉ định quyền sở hữu thư mục với biến môi trường $USER
, biến này sẽ tham chiếu đến user hệ thống hiện tại:
- sudo chown -R $USER:$USER /var/www/your_domain
Sau đó, mở một file cấu hình mới trong thư mục sites-available
của Apache:
- sudo nano /etc/apache2/sites-available/your_domain.conf
Thao tác này sẽ tạo một file mới. Paste nội dung sau vào:
<VirtualHost *:80> ServerName your_domain ServerAlias www.your_domain ServerAdmin webmaster@localhost DocumentRoot /var/www/your_domain ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
Lưu và đóng file. Nếu bạn đang sử dụng nano
, bạn có thể làm điều đó bằng cách nhấn CTRL+X
, sau đó nhấn Y
và ENTER
.
Với cấu hình VirtualHost
này, ta yêu cầu Apache dùng your_domain
bằng cách sử dụng /var/www/your_domain
làm thư mục root của web. Nếu bạn muốn kiểm tra Apache mà không có tên domain, bạn có thể xóa hoặc comment các tùy chọn ServerName
và ServerAlias
bằng cách thêm ký tự #
vào đầu mỗi dòng.
Bây giờ ta có thể sử dụng a2ensite
để kích hoạt VirtualHost mới:
- sudo a2ensite your_domain
Bạn có thể muốn vô hiệu hóa trang web mặc định được cài đặt với Apache. Điều này là bắt buộc nếu bạn không sử dụng tên domain , vì trong trường hợp này, cấu hình mặc định của Apache sẽ ghi đè VirtualHost . Để tắt trang web mặc định của Apache, hãy nhập:
- sudo a2dissite 000-default
Để đảm bảo rằng file cấu hình không có lỗi cú pháp, hãy chạy:
- sudo apache2ctl configtest
Cuối cùng, tải lại Apache để những thay đổi này có hiệu lực:
- sudo systemctl reload apache2
Trang web mới hiện đã hoạt động, nhưng root web /var/www/your_domain
vẫn trống. Tạo index.html
ở vị trí đó để ta có thể kiểm tra xem VirtualHost có hoạt động như mong đợi hay không:
- nano /var/www/your_domain/index.html
Bao gồm các nội dung sau trong file 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 truy cập trình duyệt và truy cập tên domain hoặc địa chỉ IP của server :
http://server_domain_or_IP
Bạn sẽ thấy một trang như thế này:
Nếu bạn thấy trang này, nghĩa là VirtualHost Apache đang hoạt động như mong đợi.
Bạn có thể để file này như trang tạm thời cho đến khi bạn thiết lập index.php
để thay thế. Khi bạn làm điều đó, hãy nhớ xóa hoặc đổi tên index.html
, vì nó sẽ được ưu tiên hơn index.php
mặc định.
Lưu ý về DirectoryIndex
trên Apache
Với cài đặt DirectoryIndex
mặc định trên Apache, file có tên index.html
sẽ luôn được ưu tiên hơn index.php
. Điều này có thể cần cho việc thiết lập các trang bảo trì, như một mẹo, bằng cách tạo một index.html
tạm thời chứa thông báo cung cấp thông tin cho khách truy cập. Vì trang này sẽ được ưu tiên hơn trang index.php
, sau đó nó sẽ trở thành trang đích. Khi quá trình bảo trì kết thúc, index.html
được đổi tên hoặc bị xóa khỏi root tài liệu, đưa trở lại trang ứng dụng bình thường.
Trong trường hợp bạn muốn thay đổi index.php ưu tiên nhất, bạn sẽ cần chỉnh sửa file /etc/apache2/mods-enabled/dir.conf
và sửa đổi thứ tự trong đó index.php
đặt đầu tiên tại đây:
- sudo nano /etc/apache2/mods-enabled/dir.conf
<IfModule mod_dir.c> DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm </IfModule>
Sau khi lưu, bạn cần tải lại Apache để các thay đổi có hiệu lực:
- sudo systemctl reload apache2
Trong bước tiếp theo, ta sẽ tạo một file PHP để kiểm tra xem PHP có được cài đặt và cấu hình chính xác trên server hay không.
Bước 5 - Kiểm tra Xử lý PHP trên webserver
Bây giờ ta đã có một vị trí riêng để lưu trữ các file và thư mục trên trang web, ta sẽ tạo một file kiểm tra PHP để xác nhận rằng Apache có thể xử lý các yêu cầu đối với file PHP.
Tạo một file mới có tên info.php
bên trong thư mục root web :
- nano /var/www/your_domain/info.php
Thao tác này sẽ mở một file trống, paste text sau vào:
<?php phpinfo();
Lưu tệp.
Để kiểm tra lệnh này, hãy truy cập trình duyệt web và truy cập vào tên domain hoặc địa chỉ IP của server, theo sau là tên file, trong trường hợp này là info.php
:
http://server_domain_or_IP/info.php
Bạn sẽ thấy một trang tương tự như sau:
Trang này cung cấp một số thông tin về server. Nó rất hữu ích để gỡ lỗi và đảm bảo rằng cài đặt đang được áp dụng đúng.
Nếu bạn có thể thấy trang này trong trình duyệt , thì quá trình cài đặt PHP đang hoạt động như mong đợi.
Sau khi kiểm tra thông tin liên quan về server PHP thông qua trang đó, tốt nhất là xóa file bạn đã tạo vì nó chứa thông tin nhạy cảm về môi trường PHP - và server Ubuntu . Bạn có thể sử dụng rm
để làm như vậy:
- sudo rm /var/www/your_domain/info.php
Bạn luôn có thể tạo lại trang này nếu sau này cần truy cập lại thông tin.
Bước 6 - Kiểm tra kết nối database 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 thi các truy vấn database hay không, bạn có thể tạo một bảng test với dữ liệu giả và truy vấn nội dung của nó từ một file PHP. Trước khi có thể làm điều đó, ta cần tạo một database thử nghiệm và một user MySQL mới được cấu hình đúng cách để truy cập nó.
Tại thời điểm viết bài này, thư viện MySQL PHP mysqlnd
không hỗ trợ caching_sha2_authentication
, phương thức xác thực mặc định cho MySQL 8. Ta sẽ cần tạo một user mới với phương thức xác thực mysql_native_password
để có thể kết nối với database MySQL từ PHP.
Ta sẽ tạo database có tên example_database và user có tên example_user, bạn có thể thay thế các tên này bằng các giá trị khác nhau.
Đầu tiên, kết nối với console MySQL bằng tài khoản root:
- sudo mysql
Để tạo database mới, hãy chạy lệnh sau từ console MySQL:
- CREATE DATABASE example_database;
Bây giờ bạn có thể tạo một user mới và cấp cho họ các quyền đầy đủ trên database vừa tạo.
Lệnh sau tạo một user 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. Ta đang đặt password của user này là password
, bạn nên thay thế giá trị này bằng một password an toàn do chính bạn chọn.
- CREATE USER 'example_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
Bây giờ ta cần cấp quyền cho user này trên database example_database
:
- GRANT ALL ON example_database.* TO 'example_user'@'%';
Điều này sẽ cung cấp cho user example_user toàn quyền đối với database example_database , đồng thời ngăn user này tạo hoặc sửa đổi database khác trên server .
Bây giờ thoát khỏi shell MySQL với:
- exit
Bạn có thể kiểm tra xem user mới có quyền thích hợp hay không bằng cách đăng nhập lại vào console MySQL, bằng cách sử dụng thông tin đăng nhập user :
- mysql -u example_user -p
Lưu ý cờ -p
trong lệnh này, nó sẽ nhắc bạn nhập password được sử dụng khi tạo user example_user . Sau khi đăng nhập vào console MySQL, hãy xác nhận rằng bạn có quyền truy cập vào database example_database:
- SHOW DATABASES;
Kết quả như sau:
+--------------------+ | Database | +--------------------+ | example_database | | information_schema | +--------------------+ 2 rows in set (0.000 sec)
Tiếp theo, ta sẽ tạo một bảng test có tên là todo_list . Từ console MySQL, hãy 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 trong bảng test. Bạn có thể lặp lại lệnh insert một vài lần, sử dụng các giá trị khác nhau cho đa dạng:
- INSERT INTO example_database.todo_list (content) VALUES ("My first important item");
Để xác nhận dữ liệu đã được lưu thành công vào bảng , hãy chạy:
- SELECT * FROM example_database.todo_list;
Bạn sẽ thấy kết quả 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 test , có thể thoát khỏi console MySQL:
- exit
Bây giờ bạn có thể tạo file PHP kết nối với MySQL và truy vấn nội dung. Tạo một file PHP mới trong thư mục root web:
- nano /var/www/your_domain/todo_list.php
File PHP sau kết nối với database MySQL và truy vấn nội dung của bảng todo_list , hiển thị kết quả trong danh sách. Nếu có vấn đề với kết nối database, nó sẽ đưa ra một báo lỗi.
Sao chép nội dung này vào file todo_list.php
:
<?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 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 bằng cách truy cập vào tên domain hoặc địa chỉ IP công cộng của server, theo sau là /todo_list.php
:
http://your_domain_or_IP/todo_list.php
Bạn sẽ thấy một trang, hiển thị nội dung bạn đã chèn vào bảng test :
Điều đó có nghĩa là môi trường PHP đã sẵn sàng kết nối và tương tác với server MySQL .
Kết luận
Trong hướng dẫn này, ta đã xây dựng một nền tảng linh hoạt để cung cấp các trang web và ứng dụng web PHP, sử dụng Apache làm webserver và MySQL database.
Tiếp theo, bạn nên đảm bảo các kết nối đến webserver được bảo mật bằng cách cung cấp chúng qua HTTPS. Để đạt được điều đó, bạn có thể sử dụng Let's Encrypt bảo mật trang web bằng chứng chỉ TLS/SSL miễn phí.
Các tin trước
Cài đặt LEMP Linux Nginx MySQL PHP (LEMP ) trên Ubuntu 20 04 2020-04-29
Bảo mật apache với let-s-encrypt trên Ubuntu 20.04 2020-04-29
Cài đặt Apache Web Server trên Ubuntu 20.04 2020-04-27
Cài đặt Nginx trên Ubuntu 20.04 2020-04-24
Khởi tạo bảo mật Server Ubuntu 20.04 2020-04-23
Cài đặt SSH Key trên Ubuntu 20.04 2020-04-23
Cài đặt MySQL trên Ubuntu 18.04 2020-04-21
Cài đặt và bảo mật phpMyAdmin trên Ubuntu 18.04 2020-04-21
Cài đặt Webserver Apache trên CentOS 7 2019-05-29
So sánh SQLite , MySQL , PostgreSQL 2019-03-19