Ngày đăng: 15 tháng 4 năm 2024
“LAMP” stack là một nhóm phần mềm nguồn mở thường được cài đặt cùng nhau để cho phép máy chủ lưu trữ các trang web động và ứng dụng web được viết bằng PHP. Thuật ngữ này là từ viết tắt đại diện cho hệ điều hành Linux với máy chủ web Apache. Dữ liệu trang web được lưu trữ trong cơ sở dữ liệu MySQL và nội dung động được xử lý bởi PHP.
Trong hướng dẫn này, bạn sẽ thiết lập LAMP stack trên máy chủ Ubuntu 22.04. Các bước này vẫn nhất quán cho Ubuntu v18.04 trở lên.
Nếu bạn đang sử dụng Ubuntu phiên bản 16.04 trở xuống, chúng tôi khuyên bạn nên nâng cấp lên phiên bản mới nhất vì Ubuntu không còn hỗ trợ cho các phiên bản này nữa. Bộ hướng dẫn Nâng cấp Ubuntu LTS sẽ giúp bạn nâng cấp phiên bản Ubuntu của mình.
Để hoàn thành hướng dẫn này, bạn cần có một máy chủ chạy Ubuntu, cùng với non-root user có đặc quyền sudo
và tường lửa đang hoạt động. Để được hướng dẫn về cách thiết lập những thứ này, vui lòng làm theo Hướng dẫn thiết lập máy chủ ban đầu của chúng tôi.
Máy chủ web Apache là một trong những máy chủ web phổ biến nhất trên thế giới. Nó được ghi chép đầy đủ, có một cộng đồng người dùng tích cực và được sử dụng rộng rãi trong phần lớn lịch sử của web, điều này khiến nó trở thành một lựa chọn tuyệt vời để lưu trữ một trang web.
Bắt đầu bằng cách cập nhật package manager cache. Nếu đây là lần đầu tiên bạn sử dụng sudo
trong phiên này, bạn sẽ được nhắc cung cấp mật khẩu người dùng để xác nhận rằng bạn có đặc quyền phù hợp để quản lý các gói hệ thống bằng apt
:
- sudo apt update
Sau đó, cài đặt Apache với:
- sudo apt install apache2
Bạn sẽ được nhắc xác nhận cài đặt của Apache. Xác nhận bằng cách nhấn Y
, sau đó ENTER
.
Sau khi quá trình cài đặt hoàn tất, bạn sẽ cần điều chỉnh cài đặt tường lửa của mình để cho phép lưu lượng HTTP. Công cụ cấu hình tường lửa mặc định của Ubuntu được gọi là Uncomplicated Firewall (UFW). Nó có các cấu hình ứng dụng khác nhau mà bạn có thể tận dụng. Để liệt kê tất cả các cấu hình ứng dụng UFW hiện có, hãy thực hiện lệnh này:
- sudo ufw app list
OutputAvailable applications:
Apache
Apache Full
Apache Secure
OpenSSH
Dưới đây là ý nghĩa của từng cấu hình này:
80
(lưu lượng truy cập web bình thường, không được mã hóa).80
(lưu lượng truy cập web bình thường, không được mã hóa) và cổng 443
(lưu lượng truy cập được mã hóa TLS/SSL).443
(lưu lượng được mã hóa TLS/SSL).Hiện tại, tốt nhất là chỉ cho phép kết nối trên cổng 80
, vì đây là bản cài đặt Apache mới và bạn chưa định cấu hình chứng chỉ TLS/SSL để cho phép lưu lượng HTTPS trên máy chủ của mình.
Để chỉ cho phép lưu lượng truy cập trên cổng 80
, hãy sử dụng cấu hình Apache
:
- sudo ufw allow in "Apache"
Xác minh thay đổi với:
- sudo ufw status
OutputStatus: 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 tường lửa.
Bạn có thể thực hiện kiểm tra ngay lập tức để xác minh rằng mọi thứ diễn ra theo đúng kế hoạch bằng cách truy cập địa chỉ IP công cộng của máy chủ trong trình duyệt web của bạn (xem ghi chú bên dưới tiêu đề tiếp theo để biết địa chỉ IP công cộng của bạn là gì nếu bạn không có thông tin này):
http://your_server_ip
Trang web Ubuntu Apache mặc định có sẵn cho mục đích thử nghiệm và thông tin. Dưới đây là ví dụ về trang web mặc định Apache cho Ubuntu 22.04:
Nếu bạn có thể xem trang này thì máy chủ web của bạn đã được cài đặt chính xác và có thể truy cập được thông qua tường lửa.
Nếu bạn không biết địa chỉ IP công cộng của máy chủ của mình là gì thì có một số cách để tìm địa chỉ đó. Thông thường, đây là địa chỉ bạn sử dụng để kết nối với máy chủ của mình thông qua SSH.
Có một số cách khác nhau để thực hiện việc này từ dòng lệnh. Trước tiên, bạn có thể sử dụng công cụ iproute2
để lấy địa chỉ IP của mình bằng cách nhập:
- ip addr show ens3 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'
Điều này sẽ cung cấp cho bạn hai hoặc ba dòng trở lại. Tất cả đều là địa chỉ chính xác nhưng máy tính của bạn chỉ có thể sử dụng một trong số đó, vì vậy hãy thử từng địa chỉ một.
Một phương pháp khác là sử dụng tiện ích curl
liên hệ với bên ngoài để cho bạn biết cách họ nhìn thấy máy chủ của bạn. Điều này được thực hiện bằng cách hỏi một máy chủ cụ thể địa chỉ IP của bạn là gì:
- curl http://icanhazip.com
Cho dù bạn chọn phương pháp nào, hãy nhập địa chỉ IP của bạn vào trình duyệt web để xác minh rằng máy chủ của bạn đang chạy.
Bây giờ bạn đã thiết lập và chạy 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 trang web của mình. MySQL là một hệ thống quản lý cơ sở dữ liệu phổ biến được sử dụng trong môi trường PHP.
Một lần nữa, hãy sử dụng apt
để tải và cài đặt phần mềm này:
- sudo apt install mysql-server
Khi được nhắc, hãy xác nhận cài đặt bằng cách gõ Y
, rồi ENTER
.
Khi quá trình cài đặt hoàn tất, bạn nên chạy tập lệnh bảo mật được cài đặt sẵn với MySQL. Tập lệnh 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 cơ sở dữ liệu của bạn.
Cảnh báo: Kể từ tháng 7 năm 2022, sẽ xảy ra lỗi khi bạn chạy tập lệnh mysql_secure_installation
mà không cấu hình thêm. Lý do là tập lệnh này sẽ cố gắng đặt mật khẩu cho tài khoản MySQL root của cài đặt, nhưng theo mặc định trên cài đặt Ubuntu, tài khoản này không được định cấu hình để kết nối bằng mật khẩu.
Trước tháng 7 năm 2022, tập lệnh này sẽ âm thầm thất bại sau khi cố gắng đặt mật khẩu tài khoản root và tiếp tục thực hiện các lời nhắc còn lại. Tuy nhiên, khi viết tập lệnh này sẽ trả về lỗi sau dưới đây khi bạn nhập và xác nhận mật khẩu:
Output ... Failed! Error: SET PASSWORD has no significance for user 'root'@'localhost' as the authentication method used doesn't store authentication data in the MySQL server. Please consider using ALTER USER instead if you want to change authentication parameters.
New password:
Điều này sẽ dẫn tập lệnh vào một vòng lặp đệ quy mà bạn chỉ có thể thoát ra bằng cách đóng cửa sổ terminal của mình.
Vì tập lệnh mysql_secure_installation
thực hiện một số hành động khác hữu ích để đảm bảo an toàn cho cài đặt MySQL của bạn, nên bạn vẫn nên chạy tập lệnh này trước khi bắt đầu sử dụng MySQL để quản lý dữ liệu của mình. Tuy nhiên, để tránh đi vào vòng lặp đệ quy này, trước tiên bạn cần điều chỉnh cách xác thực root MySQL user của mình.
Đầu tiên, hãy mở dấu nhắc MySQL:
- sudo mysql
Sau đó chạy lệnh ALTER USER
sau để thay đổi phương thức xác thực của root user thành phương thức sử dụng mật khẩu. Ví dụ sau thay đổi phương thức xác thực thành mysql_native_password
:
- ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Sau khi thực hiện thay đổi này, hãy thoát khỏi dấu nhắc MySQL:
- exit
Sau đó, bạn có thể chạy tập lệnh mysql_secure_installation
mà không gặp vấn đề gì.
Bắt đầu tập lệnh tương tác bằng cách chạy:
- sudo mysql_secure_installation
Điều này sẽ hỏi bạn có muốn định cấu hình VALIDATE PASSWORD PLUGIN
hay không.
Lưu ý: Việc bật tính năng này giống như một lời kêu gọi phán xét. Nếu được bật, mật khẩu không khớp với tiêu chí đã chỉ định sẽ bị MySQL từ chối kèm theo lỗi. Việc tắt xác thực là an toàn nhưng bạn phải luôn sử dụng mật khẩu mạnh vfa duy nhất cho thông tin xác thực cơ sở dữ liệu.
Trả lời Y
nếu có, hoặc bất kỳ điều gì khác để tiếp tục mà không bật.
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 trả lời “yes”, 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ẽ gặp 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 và 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: 1
Bất kể bạn có chọn thiết lập VALIDATE PASSWORD PLUGIN
hay không, tiếp theo, máy chủ của bạn sẽ yêu cầu bạn chọn và xác nhận mật khẩu cho MySQL root user. Điều này không nên nhầm lẫn với system root. Database root user là người dùng quản trị có đầy đủ đặc quyền đối với hệ thống cơ sở dữ liệu. Mặc dù phương thức xác thực mặc định cho MySQL root user không liên quan đến việc sử dụng mật khẩu, ngay cả khi mật khẩu được đặt, bạn nên xác định mật khẩu mạnh ở đây như một biện pháp an toàn bổ sung.
Nếu bạn bật xác thực mật khẩu, bạn sẽ được hiển thị độ mạnh mật khẩu cho mật khẩu gốc bạn vừa nhập, và máy chủ của bạn sẽ hỏi bạn có muốn tiếp tục với mật khẩu đó không. Nếu bạn hài lòng với mật khẩu hiện tại của mình, hãy nhập Y
cho “yes” 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
ở mỗi dấu nhắc. Thao tác này sẽ xóa một số người dùng ẩn danh và cơ sở dữ liệu thử nghiệm, vô hiệu hóa thông tin đăng nhập root từ xa và tải các quy tắc mới này để MySQL ngay lập tức tôn trọng những thay đổi 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 hay không bằng cách gõ:
- sudo mysql
Điều này sẽ kết nối với máy chủ MySQL với tư cách là administrative database user root, được suy ra bằng cách sử dụng sudo
khi chạy lệnh này. Dưới đây là một ví dụ đầu ra:
OutputWelcome 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, gõ:
- exit
Lưu ý rằng bạn không cần cung cấp mật khẩu để kết nối với tư cách là root user, mặc dù bạn đã xác định mật khẩu khi chạy tập lệnh mysql_secure_installation
. Đó là do phương thức xác thực mặc định cho administrative MySQL user là unix_socket
thay vì password
. Mặc dù điều này có vẻ giống như một mối lo ngại về bảo mật, nhưng nó giúp máy chủ cơ sở dữ liệu an toàn hơn vì user duy nhất được phép đăng nhập với tư cách là root MySQL user là những user hệ thống có đặc quyền sudo kết nối từ bảng điều khiển hoặc thông qua một ứng dụng chạy với cùng đặc quyền . Về mặt thực tế, điều đó có nghĩa là bạn sẽ không thể sử dụng administrative database root user để kết nối từ ứng dụng PHP của mình. Đặt mật khẩu cho tài khoản MySQL root có tác dụng như một biện pháp bảo vệ, trong trường hợp phương thức xác thực mặc định đượ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 tài khoản user chuyên dụng với các đặc quyền ít mở rộng hơn cho mọi cơ sở dữ liệu, đặc biệt nếu bạn định lưu trữ nhiều cơ sở dữ liệu trên máy chủ của mình.
Lưu ý: Có một số phiên bản PHP cũ hơn không hỗ trợ caching_sha2_password
, phương thức xác thực mặc định cho MySQL 8. Vì lý do đó, khi tạo database users cho các ứng dụng PHP trên MySQL 8, bạn cần phải định cấu hình ứng dụng của mình để sử dụng trình cắm mysql_native_password
. Hướng dẫn này sẽ trình bày cách thực hiện điều đó trong 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 ngăn xếp LAMP.
Bạn đã cài đặt Apache để phục vụ nội dung của mình và cài đặt MySQL để lưu trữ và quản lý dữ liệu của bạn. PHP là thành phần thiết lập của chúng tôi sẽ xử lý mã để hiển thị nội dung động cho người dùng cuối cùng. Ngoài gói php
, bạn sẽ 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. Bạn cũng sẽ cần libapache2-mod-php
để kích hoạt Apache xử lý các tệp PHP. Các gói PHP lõi sẽ tự động được cài đặt dưới dạng phụ thuộc.
Để cài đặt các gói này, hãy chạy lệnh sau:
- sudo apt install php libapache2-mod-php php-mysql
Sau khi quá trình cài đặt hoàn tất, hãy chạy lệnh sau để xác nhận phiên bản PHP của bạn:
- php -v
OutputPHP 8.1.2 (cli) (built: Mar 4 2022 18:13:46) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.2, Copyright (c) Zend Technologies
with Zend OPcache v8.1.2, Copyright (c), by Zend Technologies
Trong một số trường hợp, bạn sẽ muốn sửa đổi cách Apache phục vụ các tệp khi một thư mục được yêu cầu. Hiện tại, nếu người dùng yêu cầu một thư mục từ máy chủ, trước tiên Apache sẽ tìm một tệp có tên là index.html
. Chúng tôi muốn yêu cầu máy chủ web ưu tiên các tệp PHP hơn các tệp khác, để khiến Apache tìm kiếm tệp index.php
trước tiên. Nếu bạn không làm điều đó, tệp index.html
được đặt trong thư mục gốc tài liệu của ứng dụng sẽ luôn được ưu tiên hơn tệp index.php
.
Để thực hiện thay đổi này, hãy mở tệp cấu hình dir.conf
trong trình soạn thảo văn bản bạn chọn. Ở đây, chúng ta sẽ sử dụng nano
:
- sudo nano /etc/apache2/mods-enabled/dir.conf
Nó sẽ trông giống thế này:
<IfModule mod_dir.c>
DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm
</IfModule>
Di chuyển tệp chỉ mục PHP (được đánh dấu ở trên) đến vị trí đầu tiên sau đặc tả DirectoryIndex
, như sau:
<IfModule mod_dir.c>
DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
</IfModule>
Khi bạn hoàn tất, hãy lưu và đóng tệp bằng cách nhấn CTRL+X
. Xác nhận lưu bằng cách gõ Y
và sau đó nhấn ENTER
để xác minh vị trí lưu tệp.
Sau đó, khởi động lại máy chủ web Apache để những thay đổi của bạn được nhận dạng. Bạn có thể làm điều đó bằng lệnh sau:
- sudo systemctl restart apache2
Bạn cũng có thể kiểm tra trạng thái của dịch vụ apache2
bằng systemctl
:
- sudo systemctl status apache2
Sample Output● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Drop-In: /lib/systemd/system/apache2.service.d
└─apache2-systemd.conf
Active: active (running) since Thu 2021-07-15 09:22:59 UTC; 1h 3min ago
Main PID: 3719 (apache2)
Tasks: 55 (limit: 2361)
CGroup: /system.slice/apache2.service
├─3719 /usr/sbin/apache2 -k start
├─3721 /usr/sbin/apache2 -k start
└─3722 /usr/sbin/apache2 -k start
Jul 15 09:22:59 ubuntu1804 systemd[1]: Starting The Apache HTTP Server...
Jul 15 09:22:59 ubuntu1804 apachectl[3694]: AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' di
Jul 15 09:22:59 ubuntu1804 systemd[1]: Started The Apache HTTP Server.
Nhấn Q
để thoát khỏi đầu ra trạng thái này.
Để mở rộng chức năng của PHP, bạn có tùy chọn cài đặt một số mô-đun bổ sung. Để xem các tùy chọn có sẵn cho các mô-đun và thư viện PHP, hãy chuyển kết quả apt search
thành less
, một pager cho phép bạn cuộn qua đầu ra của các lệnh khác:
- apt search php- | less
Sử dụng các phím mũi tên để di chuyển lên xuống và nhấn Q
để thoát.
Kết quả là tất cả các thành phần tùy chọn mà bạn có thể cài đặt. Nó sẽ cung cấp cho bạn một mô tả ngắn cho mỗi dòng:
bandwidthd-pgsql/bionic 2.0.1+cvs20090917-10ubuntu1 amd64
Tracks usage of TCP/IP and builds html files with graphs
bluefish/bionic 2.2.10-1 amd64
advanced Gtk+ text editor for web and software development
cacti/bionic 1.1.38+ds1-1 all
web interface for graphing of monitoring systems
ganglia-webfrontend/bionic 3.6.1-3 all
cluster monitoring toolkit - web front-end
golang-github-unknwon-cae-dev/bionic 0.0~git20160715.0.c6aac99-4 all
PHP-like Compression and Archive Extensions in Go
haserl/bionic 0.9.35-2 amd64
CGI scripting program for embedded environments
kdevelop-php-docs/bionic 5.2.1-1ubuntu2 all
transitional package for kdevelop-php
kdevelop-php-docs-l10n/bionic 5.2.1-1ubuntu2 all
transitional package for kdevelop-php-l10n
…
:
Để tìm hiểu thêm về chức năng của từng mô-đun, bạn có thể tìm kiếm trên Internet để biết thêm thông tin về chúng. Ngoài ra, hãy xem mô tả dài của gói bằng cách gõ:
- apt show package_name
Sẽ có rất nhiều kết quả đầu ra, với một trường có tên là Description
sẽ có phần giải thích dài hơn về chức năng mà mô-đun cung cấp.
Ví dụ: để tìm hiểu mô-đun php-cli
làm gì, bạn có thể gõ lệnh này:
- apt show php-cli
Cùng với một lượng lớn thông tin khác, bạn sẽ tìm thấy thông tin giống như thế này:
Output…
Description: command-line interpreter for the PHP scripting language (default)
This package provides the /usr/bin/php command interpreter, useful for
testing PHP scripts from a shell or performing general shell scripting tasks.
.
PHP (recursive acronym for PHP: Hypertext Preprocessor) is a widely-used
open source general-purpose scripting language that is especially suited
for web development and can be embedded into HTML.
.
This package is a dependency package, which depends on Ubuntu's default
PHP version (currently 7.2).
…
Nếu sau khi nghiên cứu, bạn quyết định muốn cài đặt một gói, bạn có thể làm như vậy bằng cách sử dụng lệnh apt install
giống như bạn đã làm với phần mềm khác.
Nếu bạn quyết định rằng php-cli
là thứ bạn cần, bạn có thể gõ:
- sudo apt install php-cli
Nếu muốn cài đặt nhiều mô-đun, bạn có thể thực hiện điều đó bằng cách liệt kê từng mô-đun, cách nhau bằng dấu cách, làm theo lệnh apt install
, như sau:
- sudo apt install package1 package2 ...
Tại 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 thiết lập của bạn bằng tập lệnh PHP, tốt nhất bạn nên thiết lập Máy chủ ảo Apache thích hợp để lưu giữ các tệp và thư mục trên trang web của bạn.
Khi sử dụng máy chủ web Apache, bạn có thể tạo các máy chủ ảo (tương tự như các khối máy chủ trong Nginx) để đóng gói chi tiết cấu hình và lưu trữ nhiều miền từ một máy chủ. Trong hướng dẫn này, chúng tôi sẽ thiết lập một miền có tên your_domain, nhưng bạn nên thay thế tên miền này bằng tên miền của riêng bạn.
Apache trên Ubuntu có một máy chủ ảo được bật theo mặc định, được định cấu hình để phục vụ các tài liệu 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 nó có thể trở nên khó sử dụng nếu bạn đang lưu trữ nhiều trang web. Thay vì sửa đổi /var/www/html
, chúng tôi sẽ tạo cấu trúc thư mục trong /var/www
cho trang your_domain, để lại /var/www/html
làm thư mục mặc định sẽ được cung cấp nếu yêu cầu của khách hàng không phù hợp với bất kỳ trang web khác.
Tạo thư mục cho your_domain như sau:
- sudo mkdir /var/www/your_domain
Tiếp theo, gán 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 system user hiện tại của bạn:
- sudo chown -R $USER:$USER /var/www/your_domain
Sau đó, mở tệp cấu hình mới trong thư mục sites-available
của Apache bằng trình soạn thảo ưa thích của bạn. Ở đây, chúng ta sẽ sử dụng nano
:
- sudo nano /etc/apache2/sites-available/your_domain.conf
Điều này sẽ tạo ra một tập tin trống mới. Thêm vào cấu hình cơ bản sau bằng tên miền của riêng bạn:
<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 tệp khi bạn hoàn tất. Nếu bạn đang sử dụng nano
, hãy thực hiện đ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, chúng tôi yêu cầu Apache phân phát your_domain
bằng cách sử dụng /var/www/your_domain
làm thư mục gốc của web. Nếu bạn muốn kiểm tra Apache mà không cần tên miền, bạn có thể xóa hoặc nhận xét 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 của tùy chọn.
Bây giờ, hãy sử dụng a2ensite
để kích hoạt máy chủ ảo mới:
- sudo a2ensite your_domain
Bạn có thể muốn tắt trang web mặc định được cài đặt cùng với Apache. Điều này là bắt buộc 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 đè máy chủ ảo của bạn. Để tắt trang web mặc định của Apache, hãy nhập:
- sudo a2dissite 000-default
Để đảm bảo tệp cấu hình của bạn không chứa lỗi cú pháp, hãy chạy lệnh sau:
- 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 của bạn hiện đang hoạt động nhưng web root /var/www/your_domain
vẫn trống. Tạo tệp index.html
ở vị trí đó để kiểm tra xem máy chủ ảo có hoạt động như mong đợi không:
- nano /var/www/your_domain/index.html
Bao gồm nội dung sau trong tập tin 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>
Lưu và đóng tệp, sau đó truy cập trình duyệt của bạn và truy cập tên miền hoặc địa chỉ IP của máy chủ của bạn:
http://server_domain_or_IP
Trang web của bạn sẽ phản ánh nội dung trong tệp bạn vừa chỉnh sửa:
Bạn có thể để tệp này làm trang đích tạm thời cho ứng dụng của mình cho đến khi bạn thiết lập tệp index.php
để thay thế nó. Khi bạn làm điều đó, hãy nhớ xóa hoặc đổi tên tệp index.html
khỏi thư mục gốc tài liệu của bạn (document root), vì theo mặc định, tệp này sẽ được ưu tiên hơn tệp index.php
.
DirectoryIndex
trên ApacheVới cài đặt DirectoryIndex
mặc định trên Apache, tệp có tên index.html
sẽ luôn được ưu tiên hơn tệp index.php
. Điều này hữu ích cho việc thiết lập các trang bảo trì trong các ứng dụng PHP, bằng cách tạo tệp 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
nên khi đó nó sẽ trở thành trang đích cho ứng dụng. Sau khi bảo trì kết thúc, index.html
sẽ được đổi tên hoặc xóa khỏi thư mục gốc của tài liệu, đưa trang ứng dụng thông thường trở lại.
Trong trường hợp bạn muốn thay đổi hành vi này, bạn sẽ cần chỉnh sửa tệp /etc/apache2/mods-enabled/dir.conf
và sửa đổi thứ tự liệt kê tệp index.php
trong chỉ thị DirectoryIndex
:
- 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 và đóng tệp, bạn sẽ 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, chúng ta sẽ tạo tập lệnh PHP để kiểm tra xem PHP đã được cài đặt và định cấu hình chính xác trên máy chủ của bạn chưa.
Bây giờ bạn đã có một vị trí tùy chỉnh để lưu trữ các tệp và thư mục trên trang web của mình, hãy tạo tập lệnh kiểm tra PHP để xác nhận rằng Apache có thể xử lý và xử lý các yêu cầu đối với tệp PHP.
Tạo một tệp mới có tên info.php
bên trong thư mục gốc web tùy chỉnh của bạn:
- nano /var/www/your_domain/info.php
Điều này sẽ mở một tập tin trống. Thêm văn bản sau, là mã PHP hợp lệ, vào bên trong tệp:
<?php
phpinfo();
Khi bạn hoàn tất, hãy lưu và đóng tệp.
Để kiểm tra tập lệnh này, hãy truy cập trình duyệt web của bạn và truy cập tên miền hoặc địa chỉ IP của máy chủ, theo sau là tên tập lệnh, trong trường hợp này là info.php
:
http://server_domain_or_IP/info.php
Đây là một ví dụ về trang web 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ó rất hữu ích cho việc gỡ lỗi và đảm bảo rằng cài đặt của bạn đang được áp dụng chính xác.
Nếu bạn thấy trang này trong trình duyệt thì cài đặt PHP của bạn đang hoạt động như mong đợi.
Sau khi kiểm tra thông tin liên quan về máy chủ PHP của bạn thông qua trang đó, tốt nhất bạn nên xóa tệp 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. 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 bạn cần truy cập lại thông tin.
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 kiểm tra với dữ liệu kiểm tra và truy vấn nội dung của nó từ tập lệnh PHP. Trước khi làm điều đó, bạn cần tạo cơ sở dữ liệu thử nghiệm và MySQL user mới được cấu hình đúng cách để truy cập vào cơ sở dữ liệu đó.
Tạo cơ sở dữ liệu có tên example_database và người dùng có tên example_user. Bạn có thể thay thế những tên này bằng các giá trị khác nhau.
Đầ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 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ờ hãy tạo một user mới và cấp cho họ đầy đủ đặc quyền trên cơ sở dữ liệu tùy chỉnh mà bạn vừa tạo.
Lệnh sau tạo một user mới có tên example_user
để xác thực bằng phương thức caching_sha2_password
. Chúng ta đang xác định mật khẩu của user này là password
nhưng bạn nên thay thế giá trị này bằng mật khẩu an toàn do chính bạn chọn.
- CREATE USER 'example_user'@'%' IDENTIFIED BY 'password';
Lưu ý: Câu lệnh ALTER USER
trước đó đặt root MySQL user xác thực bằng plugin caching_sha2_password
. Theo tài liệu chính thức của MySQL, caching_sha2_password
là plugin xác thực ưa thích của MySQL, vì nó cung cấp mã hóa mật khẩu an toàn hơn so với mysql_native_password
cũ hơn nhưng vẫn được sử dụng rộng rãi.
Tuy nhiên, một số phiên bản PHP không hoạt động đáng tin cậy với caching_sha2_password
. PHP đã báo cáo rằng sự cố này đã được khắc phục kể từ PHP 7.4, nhưng nếu sau này bạn gặp lỗi khi cố gắng đăng nhập vào phpMyAdmin, bạn có thể muốn đặt quyền root để xác thực bằng mysql_native_password
:
- ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Bây giờ hãy cấp cho người dùng này quyền đối với cơ sở dữ liệu 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 cơ sở dữ liệu example_database
, đồng thời ngăn user 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ờ hãy thoát khỏi MySQL shell bằng:
- exit
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 bảng điều khiển MySQL, lần này bằng thông tin xác thực người dùng tùy chỉnh:
- mysql -u example_user -p
Hãy lưu ý cờ -p
trong lệnh này, cờ này sẽ nhắc bạn nhập mật khẩu được sử dụng khi tạo user example_user. Sau 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ẽ cung cấp cho bạn đầu ra sau:
Output+--------------------+
| Database |
+--------------------+
| example_database |
| information_schema |
+--------------------+
2 rows in set (0.000 sec)
Tiếp theo, tạo một bảng thử nghiệm có tên todo_list. Từ bảng điều khiển 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 dòng nội dung vào bảng kiểm tra. Lặp lại lệnh tiếp theo một vài lần, sử dụng các giá trị khác nhau để điền vào bảng kiểm tra của bạn:
- 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;
Sau đây là đầu ra:
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 bạn có dữ liệu hợp lệ trong bảng thử nghiệm của mình, hãy thoát khỏi bảng điều khiển MySQL:
- exit
Bây giờ bạn có thể tạo tập lệnh PHP sẽ kết nối với MySQL và truy vấn nội dung của bạn. Tạo một tệp PHP mới trong thư mục gốc web tùy chỉnh của bạn bằng trình chỉnh sửa ưa thích của bạn:
- nano /var/www/your_domain/todo_list.php
Tập lệnh PHP sau đây 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ẽ đưa ra một ngoại lệ.
Thêm nội dung này vào tập lệnh todo_list.php
của bạn, nhớ thay thế example_user
và password
bằng mật khẩu của riêng 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 định cấu hình cho trang web của bạn, theo sau là /todo_list.php
:
http://your_domain_or_IP/todo_list.php
Trang web này sẽ hiển thị nội dung bạn đã chèn vào bảng kiểm tra cho khách truy cập:
Đ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.
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, sử dụng Apache làm máy chủ web và MySQL làm hệ thống cơ sở dữ liệu.
Bước tiếp theo ngay lập tức, bạn nên đảm bảo rằng các kết nối đến máy chủ web của mình được bảo mật bằng cách cung cấp chúng qua HTTPS. Để thực hiện được điều đó, bạn có thể sử dụng Let's Encrypt trên Ubuntu 22.04 / 20.04 / 18.04 để bảo mật trang web của mình bằng chứng chỉ TLS/SSL miễn phí.