Cách cài đặt LEMP Stack (Nginx, PHP và MariaDB) trên Debian 12

theanh

Administrator
Nhân viên
Ngăn xếp LEMP Linux là một gói phần mềm phổ biến để phát triển và lưu trữ ứng dụng web. Nó bao gồm bốn thành phần chính: Linux, Nginx (phát âm là "Engine-X"), MySQL hoặc MariaDB (một cơ sở dữ liệu quan hệ) và PHP (một ngôn ngữ lập trình web phổ biến). Trong thiết lập này, Linux là hệ điều hành và Nginx là máy chủ web xử lý các yêu cầu HTTP và phục vụ nội dung tĩnh như hình ảnh và tệp .css. MySQL hoặc trong trường hợp của chúng tôi, MariaDB được sử dụng làm hệ thống cơ sở dữ liệu. PHP là ngôn ngữ kịch bản được sử dụng để tạo nội dung web và tương tác với cơ sở dữ liệu một cách động. Các thành phần này tạo thành một môi trường mạnh mẽ và có thể mở rộng để xây dựng và triển khai các trang web và ứng dụng web.

Hướng dẫn này sẽ hướng dẫn bạn cách cài đặt Ngăn xếp LEMP trên máy chủ Debian 12 (bookworm) đã phát hành cách đây vài ngày. Bạn cũng sẽ học cách cài đặt các ứng dụng như phpMyAdmin.

Điều kiện tiên quyết​


  • Máy chủ chạy Debian 12.

  • Người dùng không phải root có quyền sudo.

  • Tên miền đủ điều kiện (FQDN) như example.com trỏ đến máy chủ.

  • Tường lửa đơn giản (UFW) được bật và đang chạy.

  • Mọi thứ đều đã cập nhật.
Mã:
$ sudo apt update && sudo apt upgrade
[*]
Một số gói mà hệ thống của bạn cần.
Mã:
$ sudo apt install wget curl nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring unzip -y
Một số gói này có thể đã được cài đặt trên hệ thống của bạn.

Bước 1 - Cấu hình Tường lửa​

Bước đầu tiên trước khi cài đặt bất kỳ gói nào là cấu hình tường lửa để cho phép kết nối HTTP và HTTPS.

Kiểm tra trạng thái của tường lửa.
Mã:
$ sudo ufw status
Bạn sẽ thấy nội dung tương tự như sau.
Mã:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Cho phép các cổng HTTP và HTTPs.
Mã:
$ sudo ufw allow http
$ sudo ufw allow https
Kiểm tra lại trạng thái để xác nhận.
Mã:
$ sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443/tcp (v6) ALLOW Anywhere (v6)

Bước 2 - Cài đặt PHP​

Debian 12 được tích hợp sẵn PHP 8.2 theo mặc định. Bạn có thể cài đặt bằng cách chạy lệnh sau.
Mã:
$ sudo apt install php-fpm php-cli php-mysql php-mbstring php-xml php-gd
Chúng tôi đã cài đặt MySQL, CLI, GD, Mbstring và các tiện ích mở rộng XML của PHP. Bạn có thể cài đặt bất kỳ tiện ích mở rộng nào theo yêu cầu của mình.

Để luôn sử dụng phiên bản PHP mới nhất hoặc nếu bạn muốn cài đặt nhiều phiên bản PHP, hãy thêm kho lưu trữ PHP của Ondrej.

Đầu tiên, hãy nhập khóa GPG PHP của kho lưu trữ Sury.
Mã:
$ sudo curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg
Thêm PHP của Ondrej Sury kho lưu trữ.
Mã:
$ sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
Cập nhật danh sách kho lưu trữ hệ thống.
Mã:
$ sudo apt update
Bây giờ, bạn có thể cài đặt bất kỳ phiên bản nào của PHP.
Mã:
$ sudo apt install php8.1-fpm php8.1-cli
Kiểm tra phiên bản PHP đã cài đặt.
Mã:
$ php --version
PHP 8.2.7 (cli) (built: Jun 9 2023 19:37:27) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.7, Copyright (c) Zend Technologies with Zend OPcache v8.2.7, Copyright (c), by Zend Technologies

Bước 3 - Cài đặt MariaDB​

Debian 12 không đi kèm MySQL theo mặc định và họ vẫn chưa phát hành gói chính thức cho MySQL. Do đó, chúng tôi sẽ sử dụng MariaDB cho nó. MariaDB cũng không có gói chính thức cho Debian 12 nhưng Debian đi kèm với nó. Do đó, hãy cài đặt nó bằng lệnh sau.
Mã:
$ sudo apt install mariadb-server
Kiểm tra phiên bản MySQL.
Mã:
$ mysql --version
mysql Ver 15.1 Distrib 10.11.3-MariaDB, for debian-linux-gnu (x86_64) using EditLine wrapper
Chạy cài đặt an toàn MariaDB script.
Mã:
$ sudo mysql_secure_installation
Bạn sẽ được yêu cầu nhập mật khẩu root. Nhấn Enter vì chúng tôi chưa đặt bất kỳ mật khẩu nào cho nó.
Mã:
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.
Enter current password for root (enter for none):
Tiếp theo, bạn sẽ được hỏi có muốn chuyển sang phương pháp xác thực socket Unix không. Plugin unix_socket cho phép bạn sử dụng thông tin xác thực hệ điều hành của mình để kết nối với máy chủ MariaDB. Vì bạn đã có tài khoản root được bảo vệ, hãy nhập n để tiếp tục.
Mã:
OK, successfully used password, moving on...
Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.
You already have your root account protected, so you can safely answer 'n'.
Switch to unix_socket authentication [Y/n] n
Tiếp theo, bạn sẽ được hỏi xem bạn có muốn thay đổi mật khẩu root của mình không. Trên Debian 12, mật khẩu root gắn chặt với việc bảo trì hệ thống tự động, vì vậy bạn nên để nguyên. Nhập n để tiếp tục.
Mã:
... skipping.
You already have your root account protected, so you can safely answer 'n'.
Change the root password? [Y/n] n
Tiếp theo, bạn sẽ được hỏi một số câu hỏi nhất định để cải thiện tính bảo mật của MariaDB. Nhập Y để xóa người dùng ẩn danh, không cho phép đăng nhập root từ xa, xóa cơ sở dữ liệu thử nghiệm và tải lại các bảng đặc quyền.
Mã:
... skipping.
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] y ... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] y ... Success!
By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] y - Dropping test database... ... Success! - Removing privileges on test database... ... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] y ... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!
Bạn có thể vào shell MariaDB bằng cách nhập sudo mysql hoặc sudo mariadb trên dòng lệnh.

Bước 4 - Cấu hình MariaDB​

Đăng nhập vào shell MariaDB.
Mã:
$ sudo mysql
Tạo mẫu cơ sở dữ liệu.
Mã:
MariaDB> CREATE DATABASE exampledb;
Tạo một tài khoản người dùng SQL.
Mã:
MariaDB> CREATE USER 'exampleuser'@'localhost' IDENTIFIED BY 'YourPassword2!';
Cấp tất cả các quyền trên cơ sở dữ liệu cho người dùng.
Mã:
MariaDB> GRANT ALL PRIVILEGES ON exampledb.* TO 'exampleuser'@'localhost';
Vì chúng ta không sửa đổi người dùng gốc, bạn nên tạo một người dùng SQL khác để thực hiện các tác vụ quản trị sử dụng xác thực mật khẩu. Chọn một mật khẩu mạnh cho mật khẩu này.
Mã:
MariaDB> GRANT ALL ON *.* TO 'navjot'@'localhost' IDENTIFIED BY 'Yourpassword32!' WITH GRANT OPTION;
Xóa quyền của người dùng.
Mã:
MariaDB> FLUSH PRIVILEGES;
Thoát khỏi shell.
Mã:
MariaDB> exit
Chúng ta hãy đăng nhập lại vào shell MySQL bằng người dùng mới tạo.
Mã:
$ sudo mysql -u exampleuser -p
Tạo một bài kiểm tra bảng.
Mã:
MariaDB> CREATE TABLE exampledb.name_list ( sno INT AUTO_INCREMENT, content VARCHAR(255), PRIMARY KEY(sno) );
Chèn dữ liệu thử nghiệm.
Mã:
MariaDB> INSERT INTO exampledb.name_list (content) VALUES ("Navjot");
Lặp lại lệnh trên nhiều lần để thêm nhiều mục nhập hơn. Chạy lệnh sau để kiểm tra nội dung của bảng.
Mã:
MariaDB> SELECT * FROM exampledb.name_list;
Bạn sẽ nhận được kết quả sau.
Mã:
+-----+---------+
| sno | content |
+-----+---------+
| 1 | Navjot |
| 2 | Adam |
| 3 | Josh |
| 4 | Peter |
+-----+---------+
4 rows in set (0.00 sec)
Thoát khỏi MySQL vỏ.
Mã:
MariaDB> exit

Bước 5 - Cài đặt Nginx​

Debian 12 tích hợp sẵn phiên bản Nginx cũ hơn. Để cài đặt phiên bản mới nhất, bạn cần tải xuống kho lưu trữ Nginx chính thức.

Nhập khóa ký của Nginx.
Mã:
$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \ | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
Thêm kho lưu trữ cho phiên bản ổn định của Nginx.
Mã:
$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/debian `lsb_release -cs` nginx" \ | sudo tee /etc/apt/sources.list.d/nginx.list
Cập nhật hệ thống kho lưu trữ.
Mã:
$ sudo apt update
Cài đặt Nginx.
Mã:
$ sudo apt install nginx
Xác minh cài đặt. Trên hệ thống Debian, lệnh sau chỉ hoạt động với sudo.
Mã:
$ sudo nginx -v
nginx version: nginx/1.24.0
Bắt đầu Nginx.
Mã:
$ sudo systemctl start nginx
Kiểm tra trạng thái dịch vụ.
Mã:
$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enabled) Active: active (running) since Thu 2023-06-15 16:33:46 UTC; 1s ago Docs: https://nginx.org/en/docs/ Process: 2257 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS) Main PID: 2258 (nginx) Tasks: 2 (limit: 1108) Memory: 1.8M CPU: 6ms CGroup: /system.slice/nginx.service ??2258 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf" ??2259 "nginx: worker process"

Bước 6 - Cấu hình PHP-FPM​

Mở php.ini để chỉnh sửa.
Mã:
$ sudo nano /etc/php/8.2/fpm/php.ini
Để đặt kích thước tải tệp lên, hãy thay đổi các giá trị của upload_max_filesizepost_max_size biến.
Mã:
upload_max_filesize = 50M
...
post_max_size = 50M
Cấu hình giới hạn bộ nhớ của PHP tùy thuộc vào tài nguyên và yêu cầu máy chủ của bạn.
Mã:
memory_limit = 256M
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Bạn cũng có thể sử dụng các lệnh sau để thực hiện chỉnh sửa mà không cần mở tập tin.
Mã:
$ sudo sed -i 's/post_max_size = 8M/post_max_size = 50M/' /etc/php/8.2/fpm/php.ini
$ sudo sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 50M/' /etc/php/8.2/fpm/php.ini
$ sudo sed -i 's/memory_limit = 128M/memory_limit = 256M/' /etc/php/8.2/fpm/php.ini
Mở tập tin /etc/php/8.0/fpm/pool.d/www.conf.
Mã:
$ sudo nano /etc/php/8.2/fpm/pool.d/www.conf
Chúng ta cần đặt người dùng/nhóm Unix của các quy trình PHP thành nginx. Tìm các dòng user=www-datagroup=www-data trong tệp và thay đổi chúng thành nginx.
Mã:
...
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
user = nginx
group = nginx
...
Ngoài ra, hãy tìm các dòng listen.owner=www-datalisten.group=www-data trong tệp và thay đổi chúng thành nginx.
Mã:
listen.owner = nginx
listen.group = nginx
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Khởi động lại PHP-fpm quá trình.
Mã:
$ sudo systemctl restart php8.2-fpm

Bước 7 - Cài đặt phpMyAdmin​

Tải xuống tệp lưu trữ phpMyAdmin cho ngôn ngữ tiếng Anh. Tải xuống liên kết cho phiên bản mới nhất từ trang Tải xuống phpMyAdmin.
Mã:
$ wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-english.tar.gz
Tạo thư mục công khai cho trang web.
Mã:
$ sudo mkdir /var/www/html/example.com -p
Giải nén kho lưu trữ để công khai thư mục.
Mã:
$ sudo tar -xzf phpMyAdmin-5.2.1-english.tar.gz -C /var/www/html/example.com
Chuyển sang thư mục công khai.
Mã:
$ cd /var/www/html/example.com
Đổi tên thư mục đã giải nén thành tên nào đó khó hiểu để cải thiện bảo mật.
Mã:
$ sudo mv phpMyAdmin-5.2.1-english sm175

Bước 8 - Cấu hình phpMyAdmin​

Sao chép tệp cấu hình mẫu.
Mã:
$ sudo cp sm175/config.sample.inc.php sm175/config.inc.php
Mở tệp cấu hình cho đang chỉnh sửa.
Mã:
$ sudo nano sm175/config.inc.php
Tìm dòng $cfg['blowfish_secret'] = ''; và nhập chuỗi ngẫu nhiên gồm 32 ký tự để xác thực dựa trên cookie.

Bạn có thể sử dụng trình tạo blowfish trực tuyến của phpSolved hoặc thực hiện thông qua dòng lệnh.

Sao chép giá trị và dán dưới dạng đã hiển thị.
Mã:
$cfg['blowfish_secret'] = 'Tc/HfLPBOAPxJ-rhQP}HJoZEK69c3j:m';
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Thay đổi quyền sở hữu của trang web và phpMyAdmin thành máy chủ Nginx.
Mã:
$ sudo chown -R nginx:nginx /var/www/html/example.com
Xóa cài đặt phpMyAdmin thư mục.
Mã:
$ sudo rm -rf /var/www/html/example.com/sm175/setup

Bước 9 - Cấu hình Opcache​

Opcache là hệ thống lưu trữ đệm của PHP. Nó hoạt động bằng cách lưu mã bytecode của tập lệnh được biên dịch trước trong bộ nhớ, vì vậy mỗi lần người dùng truy cập một trang, trang đó sẽ tải nhanh hơn. Opcache được cài đặt theo mặc định. Để xác minh, hãy kiểm tra phiên bản PHP.
Mã:
$ php --version
PHP 8.2.7 (cli) (built: Jun 9 2023 19:37:27) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.7, Copyright (c) Zend Technologies with Zend OPcache v8.2.7, Copyright (c), by Zend Technologies
Điều này cho chúng ta biết rằng Opcache đã được cài đặt và khả dụng. Trong trường hợp nó không hiển thị ở đây, bạn có thể cài đặt thủ công bằng cách chạy lệnh sau.
Mã:
$ sudo apt install php-opcache
Để thay đổi cài đặt Opcache, hãy mở tệp /etc/php/8.2/fpm/conf.d/10-opcache.ini để chỉnh sửa.
Mã:
$ sudo nano /etc/php/8.2/fpm/conf.d/10-opcache.ini
Các thiết lập sau đây sẽ giúp bạn bắt đầu sử dụng Opcache và thường được khuyến nghị để có hiệu suất tốt. Bạn có thể bật tính năng này bằng cách thêm các dòng sau vào cuối.
Mã:
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Khởi động lại PHP-FPM.
Mã:
$ sudo systemctl restart php8.2-fpm

Bước 10 - Cài đặt Certbot cho SSL​

Chúng ta cần cài đặt Certbot để tạo chứng chỉ SSL miễn phí do Let's Encrypt cung cấp.

Bạn có thể cài đặt Certbot bằng kho lưu trữ của Debian hoặc tải phiên bản mới nhất bằng công cụ Snapd. Chúng ta sẽ sử dụng phiên bản Snapd.

Debian 12 không cài đặt Snapd. Cài đặt gói Snapd.
Mã:
$ sudo apt install snapd
Chạy các lệnh sau để đảm bảo phiên bản Snapd của bạn được cập nhật.
Mã:
$ sudo snap install core
$ sudo snap refresh core
Cài đặt Certbot.
Mã:
$ sudo snap install --classic certbot
Sử dụng lệnh sau để đảm bảo lệnh Certbot có thể chạy được bằng cách tạo liên kết tượng trưng đến /usr/bin thư mục.
Mã:
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Xác minh xem Certbot có hoạt động bình thường không.
Mã:
$ certbot --version
certbot 2.6.0

Bước 11 - Kiểm tra trang web demo​

Tạo trang web​

Tạo và mở trang thử nghiệm cho chỉnh sửa.
Mã:
$ sudo nano /var/www/html/example.com/index.php
Dán mã sau vào đó.
Mã:
 
Back
Bên trên