LAMP stack là một bộ phần mềm mã nguồn mở phổ biến, được triển khai cùng nhau để xây dựng và vận hành các trang web động cũng như ứng dụng web. Cụm từ LAMP đại diện cho bốn thành phần chính: hệ điều hành Linux, máy chủ web Apache, hệ quản trị cơ sở dữ liệu MariaDB và ngôn ngữ lập trình PHP để xử lý nội dung động.
Mặc dù MySQL thường là lựa chọn mặc định trong các cấu hình LAMP truyền thống, nhưng nhiều bản phân phối Linux hiện nay-bao gồm Debian-đã chuyển sang sử dụng MariaDB như một giải pháp thay thế hoàn toàn tương thích, giúp tối ưu hóa hiệu suất và bảo mật cho hệ thống.
Yêu cầu
Để làm được điều này, bạn cần một máy chủ Debian 11 với một tài khoản người dùng có quyền sudo (không phải root) và một tường lửa cơ bản. Điều này có thể được cấu hình theo hướng dẫn thiết lập máy chủ ban đầu cho Debian 11.
Bước 1 – Cài đặt Apache và cập nhật tường lửa
Máy chủ web Apache là một trong những máy chủ phổ biến nhất trên thế giới. Nó có tài liệu hướng dẫn chi tiết, cộng đồng người dùng năng động và đã được sử dụng rộng rãi trong suốt lịch sử của web, khiến nó trở thành lựa chọn tuyệt vời để lưu trữ website.
Bắt đầu bằng cách cập nhật bộ nhớ đệm của trình quản lý gói. Nếu đây là lần đầu tiên bạn sử dụng sudo trong phiên làm việc này, bạn sẽ được yêu cầu nhập mật khẩu của người dùng để xác nhận bạn có đủ quyền quản lý các gói hệ thống với apt:
sudo apt update
Sau đó, cài đặt Apache bằng lệnh sau:
sudo apt install apache2
Lệnh trên sẽ yêu cầu bạn xác nhận việc cài đặt Apache. Nhấn Y, sau đó nhấn ENTER để xác nhận. Khi việc cài đặt hoàn tất, bạn cần điều chỉnh cài đặt tường lửa. Giả sử rằng bạn đã thực hiện theo hướng dẫn thiết lập máy chủ ban đầu để cài đặt và kích hoạt tường lửa UFW, hãy đảm bảo rằng tường lửa của bạn cho phép lưu lượng HTTP và HTTPS.
Trên Debian 11, UFW đã được tải sẵn với các cấu hình ứng dụng mà bạn có thể sử dụng để điều chỉnh tường lửa. Xem danh sách đầy đủ các cấu hình ứng dụng bằng cách chạy:
sudo ufw app list
Các cấu hình WWW
được liệt kê được dùng để quản lý các cổng được sử dụng bởi máy chủ web:
Output Available applications: . . . WWW WWW Cache WWW Full WWW Secure . . .
Nếu bạn kiểm tra cấu hình WWW Ful
l với lệnh ufw app info
, đầu ra của bạn sẽ hiển thị rằng nó cho phép lưu lượng đến các cổng 80
và 443
:
sudo ufw app info "WWW Full"
Output Profile: WWW Full Title: Web Server (HTTP,HTTPS) Description: Web Server (HTTP,HTTPS) Ports: 80,443/tcp
Tiếp theo, hãy cho phép lưu lượng HTTP và HTTPS cho cấu hình này:
sudo ufw allow in "WWW Full"
Bạn có thể 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 máy chủ trên trình duyệt web:
http://your_server_ip
Nếu trình duyệt của bạn hiển thị trang web mặc định của Apache trên Debian 11, điều đó có nghĩa là máy chủ web của bạn đã được cài đặt đúng cách và có thể truy cập qua tường lửa.
Cách tìm địa chỉ ip công cộng của máy chủ
Nếu bạn không biết địa chỉ IP công cộng của máy chủ, có một số cách để tìm ra. Thông thường, đây là địa chỉ bạn sử dụng để kết nối SSH với máy chủ.
Có một vài cách để thực hiện việc này từ dòng lệnh. Đầu tiên, bạn có thể sử dụng công cụ của iproute2
để lấy địa chỉ IP của bạn bằng lệnh:
ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'
Lệnh trên sẽ trả về hai hoặc ba dòng. Tất cả đều là địa chỉ chính xác, nhưng máy tính của bạn có thể chỉ sử dụng được một trong số chúng, vì vậy bạn có thể thử từng cách.
Một phương pháp khác là sử dụng tiện ích cur
l để liên hệ với một bên ngoài nhằm cho bạn biết máy chủ của bạn nhìn nhận địa chỉ IP của bạn như thế nào. Bạn có thể chạy lệnh sau để yêu cầu một máy chủ cụ thể cho biết địa chỉ IP của bạn:
curl http://icanhazip.com
Dù bạn chọn phương pháp nào, hãy nhập địa chỉ IP đó vào trình duyệt để xác minh rằng máy chủ của bạn đang chạy trang mặc định của Apache.
Bước 2 – Cài đặt MariaDB
Sau khi đã cài đặt máy chủ web, bạn cần cài đặt hệ thống cơ sở dữ liệu để có thể lưu trữ và quản lý dữ liệu cho website của bạn.
Trên Debian 11, metapackage mysql-server
mà truyền thống được dùng để cài đặt máy chủ MySQL đã được thay thế bởi default-mysql-server
. Metapackage này tham chiếu đến MariaDB, một nhánh cộng đồng của máy chủ MySQL ban đầu do Oracle phát triển, và hiện là máy chủ cơ sở dữ liệu tương thích với MySQL mặc định có sẵn trong kho phần mềm của các hệ thống dựa trên Debian.
Tuy nhiên, để đảm bảo tính tương thích lâu dài, thay vì sử dụng metapackage, bạn nên cài đặt MariaDB bằng cách sử dụng gói thực sự của chương trình, đó là mariadb-server
.
Để cài đặt phần mềm MariaDB, chạy lệnh sau:
sudo apt install mariadb-server
Khi việc cài đặt hoàn tất, bạn nên chạy một tập lệnh bảo mật đã được cài đặt sẵn với MariaDB. Tập lệnh này sẽ loại bỏ một số cài đặt mặc định không an toàn và khóa truy cập vào hệ thống cơ sở dữ liệu của bạn. Bắt đầu tập lệnh tương tác bằng lệnh:
sudo mysql_secure_installation
Tập lệnh này sẽ hướng dẫn bạn qua một loạt các bước, cho phép bạn thay đổi một số cài đặt của MariaDB. Ở bước đầu tiên, nó sẽ yêu cầu bạn nhập mật khẩu hiện tại của người dùng root trong cơ sở dữ liệu. Điều này không nhầm lẫn với tài khoản root của hệ thống. Vì bạn vừa cài đặt MariaDB và chưa thay đổi cấu hình, mật khẩu này sẽ để trống, vậy nên bạn chỉ cần nhấn ENTER
.
Tiếp theo, tập lệnh hỏi bạn có muốn thiết lập mật khẩu cho người dùng root của cơ sở dữ liệu hay không. Vì MariaDB sử dụng một phương thức xác thực đặc biệt cho người dùng root mà thường an toàn hơn so với việc sử dụng mật khẩu, bạn không cần thiết lập mật khẩu ngay lúc này. Nhấn N
rồi ENTER
.
Sau đó, bạn nhấn Y
và ENTER
để chấp nhận các cài đặt mặc định cho các bước tiếp theo. Điều này sẽ xóa bỏ các người dùng ẩn danh và cơ sở dữ liệu test, vô hiệu hóa đăng nhập từ xa cho root, và tải các quy tắc mới để MariaDB áp dụng ngay lập tức các thay đổi bạn đã thực hiện.
Khi hoàn tất, đăng nhập vào giao diện MariaDB bằng lệnh:
sudo mariadb
Lệnh này sẽ kết nối đến máy chủ MariaDB dưới tư cách người dùng quản trị root (được suy ra từ việc sử dụng sudo). Bạn sẽ nhận được đầu ra tương tự như sau:
Output Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 41 Server version: 10.5.15-MariaDB-0+deb11u1 Debian 11 Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]>
Lưu ý rằng bạn không cần cung cấp mật khẩu để kết nối với người dùng root vì phương thức xác thực mặc định của MariaDB là unix_socket
thay vì dùng mật khẩu. Dù ban đầu điều này có vẻ như là một lỗ hổng bảo mật, nhưng nó thực tế làm cho máy chủ cơ sở dữ liệu của bạn an toàn hơn vì chỉ có người dùng hệ thống có quyền sudo mới có thể đăng nhập vào tài khoản root của MariaDB từ console hoặc thông qua ứng dụng chạy với quyền tương tự. Theo nghĩa thực tế, điều này có nghĩa là bạn sẽ không thể sử dụng người dùng quản trị 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 bạn 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 từng 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.
Để thoát khỏi giao diện MariaDB, sử dụng lệnh:
exit
Máy chủ MariaDB của bạn bây giờ đã đượ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 LAMP stack.
Bước 3 – Cài đặt PHP
Bạn đã cài đặt Apache để phục vụ nội dung và MariaDB để lưu trữ, quản lý dữ liệu. PHP là thành phần xử lý code nhằm hiển thị nội dung động đến người dùng cuối. Nó có thể chạy các script, kết nối với cơ sở dữ liệu MariaDB để lấy thông tin và chuyển nội dung đã xử lý cho máy chủ web hiển thị.
Ngoài gói php
, bạn sẽ cần cài đặt php-mysql
– một module PHP cho phép PHP giao tiếp với các cơ sở dữ liệu dựa trên MySQL, chẳng hạn như MariaDB. Bạn cũng cần cài đặt libapache2-mod-php
để kích hoạt Apache xử lý các file PHP. 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 này, chạy lệnh sau:
sudo apt install php libapache2-mod-php php-mysql
Sau khi cài đặt hoàn tất, bạn có thể kiểm tra phiên bản PHP bằng lệnh:
php -v
Output PHP 7.4.30 (cli) (built: Jul 7 2022 15:51:43) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Zend OPcache v7.4.30, Copyright (c), by Zend Technologies
Ở thời điểm này, LAMP stack của bạn đã hoạt động hoàn toàn, nhưng trước khi kiểm tra cấu hình PHP bằng một script, tốt nhất là bạn nên thiết lập một Apache Virtual Host phù hợp để chứa các file và thư mục của website.
Bước 4 – Tạo Virtual Host cho Website của bạn
Khi sử dụng máy chủ web Apache, bạn có thể tạo các virtual host (tương tự như server blocks trong Nginx) để đó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ẽ thiết lập một tên miền gọi là your_domain
, tuy nhiên bạn nên thay thế bằng tên miền của riêng bạn.
Lưu ý: Nếu bạn đang sử dụng DataOnline làm nhà cung cấp DNS, hãy xem tài liệu hướng dẫn của chúng tôi về cách thiết lập tên miền mới và trỏ nó về máy chủ của bạn.
Mặc định, Apache phục vụ nội dung từ thư mục nằm tại /var/www/html
, sử dụng cấu hình có trong /etc/apache2/sites-available/000-default.conf
. Thay vì chỉnh sửa file cấu hình website mặc định tại /var/www/html
, bạn sẽ tạo một virtual host mới để kiểm tra môi trường PHP của bạn. Virtual host cho phép bạn lưu trữ nhiều website trên cùng một máy chủ Apache. Bạn cũng sẽ tạo một cấu trúc thư mục trong /var/www
cho trang your_domain
, giữ nguyên /var/www/html
làm thư mục mặc định được phục vụ nếu yêu cầu của client không khớp với website nào khác.
Bắt đầu bằng cách tạo thư mục gốc cho website your_domain
như sau:
sudo mkdir /var/www/your_domain
Tiếp theo, gán quyền sở hữu cho thư mục bằng biến môi trường $USER
, biến này sẽ tham chiếu đến người dùng hiện tại của hệ thống:
sudo chown -R $USER:$USER /var/www/your_domain
Sau đó, mở một file cấu hình mới trong thư mục /etc/apache2/sites-available
bằng trình chỉnh sửa dòng lệnh ưa thích của bạn. Ở đây, chúng ta sẽ dùng nano:
sudo nano /etc/apache2/sites-available/your_domain.conf
File này sẽ mở ra dưới dạng một file trắng. Thêm vào nội dung cấu hình cơ bản sau đây, thay thế tên miền bằng tên miền thực của bạn:
/etc/apache2/sites-available/your_domain <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 khi bạn đã xong. Nếu bạn sử dụng nano, bạn có thể làm điều này bằng cách nhấn CTRL + X, sau đó nhấn Y và ENTER.
Với cấu hình Virtual Host này, bạn đang chỉ định cho Apache phục vụ your_domain
sử dụng thư mục gốc là /var/www/your_domain
. Nếu bạn muốn thử nghiệm Apache mà không cần tên miền, bạn có thể xóa hoặc chú thích các tùy chọn ServerName
và ServerAlias
bằng cách thêm dấu thăng (#) vào đầu mỗi dòng.
Bây giờ, hãy sử dụng lệnh a2ensite
để kích hoạt virtual host này:
sudo a2ensite your_domain
Bạn có thể muốn vô hiệu hóa website mặc định đi kèm với Apache. Điều này cần thiết nếu bạn không sử dụng tên miền tùy chỉnh, vì trong trường hợp này cấu hình mặc định của Apache sẽ ghi đè lên virtual host của bạn. Để vô hiệu hóa website mặc định của Apache, chạy lệnh:
sudo a2dissite 000-default
Để đảm bảo file cấu hình của bạn không có lỗi cú pháp, chạy lệnh sau:
sudo apache2ctl configtest
Cuối cùng, tải lại Apache để các thay đổi có hiệu lực:
sudo systemctl reload apache2
Tiếp theo, bạn sẽ tạo một script PHP để kiểm tra xem PHP có được cài đặt và cấu hình đúng trên máy chủ của bạn hay không.
Bước 5 – Kiểm tra xử lý PHP trên máy chủ Web của bạn
Giờ bạn đã có một vị trí tùy chỉnh để lưu trữ các file và thư mục của website, hãy tạo một file test PHP để xác nhận rằng Apache có thể xử lý và thực thi các file PHP.
Bắt đầu bằng cách tạo một file mới có tên info.php
bên trong thư mục gốc website của bạn:
nano /var/www/your_domain/info.php
File sẽ mở ra dưới dạng một file trắng. Thêm đoạn mã PHP hợp lệ sau vào file:
/var/www/your_domain/info.php <?php phpinfo();
Khi bạn hoàn thành, lưu và đóng file.
Để kiểm tra script, mở trình duyệt và truy cập tên miền hoặc địa chỉ IP công cộng của máy chủ, kèm theo tên file script, trong trường hợp này là info.php
:
http://your_domain/info.php
Đây là ví dụ của trang PHP mặc định:
Trang này cung cấp thông tin về máy chủ của bạn từ góc nhìn của PHP. Nó hữu ích cho việc gỡ lỗi và đảm bảo rằng các cài đặt của bạn đang được áp dụng đúng cách.
Nếu bạn có thể thấy trang này trên trình duyệt, điều đó có nghĩa là cài đặt PHP của bạn hoạt động như mong đợi.
Sau khi kiểm tra thông tin liên quan đến máy chủ PHP qua trang này, tốt nhất là bạn nên xóa file vừa tạo vì nó chứa các thông tin nhạy cảm về môi trường PHP và máy chủ Debian của bạn. Sử dụng lệnh rm
để xóa file:
sudo rm /var/www/your_domain/info.php
Bạn luôn có thể tạo lại trang này nếu cần truy cập thông tin vào thời điểm sau.
Bước 6 – Kiểm tra kết nối cơ sở dữ liệu từ PHP
Nếu bạn muốn kiểm tra xem PHP có thể kết nối với MariaDB 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 test với dữ liệu mẫu và thực hiện truy vấn để hiển thị nội dung từ một script PHP. Trước hết, bạn cần tạo một cơ sở dữ liệu test và một người dùng MariaDB mới được cấu hình đúng để truy cập vào cơ sở dữ liệu đó.
Tạo một cơ sở dữ liệu tên là example_database
và một người dùng tên là example_user
. Bạn có thể thay đổi tên theo ý muốn.
Đầu tiên, đăng nhập vào giao diện MariaDB bằng tài khoản root:
sudo mariadb
Để tạo một cơ sở dữ liệu mới, chạy lệnh sau từ giao diện MariaDB:
CREATE DATABASE example_database;
Tiếp theo, tạo một người dùng mới và cấp cho họ quyền đầy đủ trên cơ sở dữ liệu bạn vừa tạo. Lệnh sau tạo một người dùng mới tên là example_user
với xác thực bằng mật khẩu. Ở đây, mật khẩu được định nghĩa là password
, tuy nhiên bạn nên thay thế giá trị này bằng một mật khẩu an toàn của riêng bạn:
CREATE USER 'example_user'@'%' IDENTIFIED BY 'password';
Sau đó, 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'@'%';
Lệnh trên sẽ cấp cho người dùng example_user
quyền đầy đủ trên cơ sở dữ liệu example_database
, đồng thời ngăn người dùng này tạo hoặc thay đổi các cơ sở dữ liệu khác trên máy chủ.
Tiếp theo, làm mới các quyền để đảm bảo rằng các thay đổi đã được lưu và có hiệu lực ngay lập tức:
FLUSH PRIVILEGES;
Sau đó, thoát khỏi giao diện MariaDB:
exit
Để kiểm tra xem người dùng mới có quyền thích hợp không, đăng nhập lại vào giao diện MariaDB bằng thông tin đăng nhập của người dùng mới:
mariadb -u example_user -p
Lưu ý rằng cờ -p
sẽ yêu cầu bạn nhập mật khẩu của người dùng example_user
. Sau khi đăng nhập, xác nhận rằng bạn có thể truy cập cơ sở dữ liệu example_database
:
SHOW DATABASES;
Kết quả sẽ hiển thị:
Output +--------------------+ | Database | +--------------------+ | example_database | | information_schema | +--------------------+ 2 rows in set (0.000 sec)
Tiếp theo, tạo một bảng test có tên todo_list
trong cơ sở dữ liệu example_database
. Từ giao diện MariaDB, chạy 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 dòng dữ liệu vào bảng test. Lặp lại lệnh sau vài lần với các giá trị khác nhau để thêm dữ liệu vào bảng:
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, chạy lệnh:
SELECT * FROM example_database.todo_list;
Kết quả sẽ hiển thị:
Output +---------+--------------------------+ | 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 dữ liệu đã được thêm thành công vào bảng test, thoát khỏi giao diện MariaDB:
exit
Giờ bạn có thể tạo script PHP để kết nối với MariaDB và truy vấn dữ liệu từ bảng.
Tạo một file PHP mới trong thư mục gốc website bằng trình chỉnh sửa bạn thích:
nano /var/www/your_domain/todo_list.php
Thêm nội dung sau vào file todo_list.php
. Lưu ý thay thế example_user
và password
bằng thông tin 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 file sau khi chỉnh sửa xong.
Bây giờ, truy cập file này trên trình duyệt của bạn bằng cách mở tên miền hoặc địa chỉ IP công cộng của máy chủ kèm theo /todo_list.php
:
http://your_domain/todo_list.php
Trang web này sẽ hiển thị nội dung đã được chèn vào bảng test cho khách truy cập:
Điều này chứng tỏ rằng 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ủ MariaDB.
Kết luận
Trong hướng dẫn này, bạn đã thiết lập một môi trường mạnh mẽ để triển khai website và ứng dụng PHP, sử dụng Apache làm máy chủ web và MariaDB làm hệ quản trị cơ sở dữ liệu. Cấu hình này mang lại sự linh hoạt và hiệu suất cao, giúp bạn dễ dàng phát triển và quản lý các ứng dụng web.
Bước tiếp theo quan trọng là tăng cường bảo mật cho website của bạn bằng cách kích hoạt HTTPS. Bạn có thể làm điều này bằng cách cài đặt chứng chỉ SSL miễn phí từ Let’s Encrypt. Ngoài ra, nếu bạn muốn tối ưu hóa quy trình phát triển PHP, hãy xem xét sử dụng Composer để quản lý các dependency và package một cách hiệu quả. Tham khảo thêm hướng dẫn của chúng tôi để biết cách cài đặt và sử dụng Composer trong dự án PHP của bạn.