BÀI VIẾT

Hướng dẫn cài đặt Nginx, MariaDB và PHP (LEMP) trên Debian 11

4.7K
author Đặng Văn Chương - 2022-07-15 10:11:38 (GMT+7)

Bạn không sử dụng Debian 11?
Xem bài viết cho các distro khác

Giới thiệu

Nginx là một webserver mã nguồn mở mạnh mẽ và nổi tiếng phục vụ web HTTP. Sử dụng kiến thức đơn luồng (event-driven), không đồng bộ (asynchronous) để website có hiệu suất và sự ổn định tối đa.

MariaDB là hệ quản trị cơ sở dữ liệu mã nguồn mở (DBMS) được phát triển bởi các nhà sáng lập MySQL. Được phát hành lần đầu vào năm 2009.

PHP (Hypertext Preprocessor) là ngôn ngữ lập trình hướng đối tượng được sử dụng cho máy chủ web.

Bài viết này sẽ hướng dẫn cài đặt Nginx, MariaDB và PHP (viết tắt là LEMP) trên Debian 11.

Yêu cầu thiết yếu

Để thực hiện được các hướng dẫn này, chúng ta cần các yêu cầu sau:

  • Máy chủ sử dụng: Debian 11
  • Tài khoản người dùng: Có quyền truy cập sudo hoặc root

Bước 1: Cài đặt Nginx

Chúng ta cần cập nhật hệ điều hành Debian 11 để đảm bảo các gói hiện có được cập nhật lên phiên bản mới nhất:

bash (root)
apt update && apt upgrade -y

Sau khi cập nhật xong các gói tin cần thiết trên Debian 11 chúng ta thực thi lệnh bên dưới để cài đặt nginx:

bash (root)
apt-get install nginx

Sau khi lệnh cài đặt hoàn thành chúng ta có thể thực thi lệnh sau để kiểm tra xem nginx đã được cài đặt thành công trên Debian 11 hay chưa:

bash (root)
nginx -v

Phiên bản hiện tại của nginx tại thời điểm mình viết bài này là 1.18.0:

Kết quả
nginx version: nginx/1.18.0

Truy cập trình duyệt bằng IP máy chủ của chúng ta để kiểm tra: nginx

Bước 2: Cài đặt và Cấu hình firewall

Đầu tiên, chúng ta cài đặt các phụ thuộc cần thiết cho csf:

bash (root)
apt-get install libio-socket-inet6-perl libsocket6-perl sendmail dnsutils unzip libio-socket-ssl-perl libcrypt-ssleay-perl git perl iptables libnet-libidn-perl libwww-perl -y

Bây giờ, hãy đảm bảo rằng không có tường lửa nào khác đang chạy trên hệ thống của chúng ta. Vì vậy, hãy tắt tường lửa đang chạy trên hệ thống (nếu có):

bash (root)
ufw disable

Tiếp theo, chúng ta tải xuống source code csf bằng wget:

bash (root)
wget http://download.configserver.com/csf.tgz

Bây giờ chúng ta hãy giải nén file vừa tải về bằng lệnh sau:

bash (root)
tar -xvzf csf.tgz

Sau khi quá trình giải nén hoàn thành, chúng ta di chuyển vào thư mục csf vừa giải nén:

bash (root)
cd csf

Tiến hành cài đặt csf bằng lệnh:

bash (root)
sh install.sh

Sau khi kết thúc lệnh cài đặt, chúng ta hãy khởi động dịch vụ csf:

bash (root)
systemctl start csf

Ngoài ra, chúng ta cũng nên chạy perl để kiểm tra xem csf đã được cài đặt thành công chưa:

bash (root)
perl /usr/local/csf/bin/csftest.pl
Kết quả
Testing ip_tables/iptable_filter...OK
Testing ipt_LOG...OK
Testing ipt_multiport/xt_multiport...OK
Testing ipt_REJECT...OK
Testing ipt_state/xt_state...OK
Testing ipt_limit/xt_limit...OK
Testing ipt_recent...OK
Testing xt_connlimit...OK
Testing ipt_owner/xt_owner...OK
Testing iptable_nat/ipt_REDIRECT...OK
Testing iptable_nat/ipt_DNAT...OK

RESULT: csf should function on this server

Bây giờ, chúng ta hãy kích hoạt csf khởi động cùng hệ thống bằng lệnh:

bash (root)
systemctl enable csf

Chỉnh sửa file csf.conf tại /etc/csf/csf.conf:

  • Thay TESTING = "1" thành "0"
  • Thay RESTRICT_SYSLOG = "0" thành "1"
  • Thêm các port TCP_INTCP_OUT cần thiết cho server. Ở bài hướng dẫn này chúng ta cần có các ports 80, 443
/etc/csf/csf.conf
. . .
TESTING = "0"
. . .
RESTRICT_SYSLOG = "1"
. . .
# Allow incoming TCP ports
TCP_IN = "80,443"
# Allow outgoing TCP ports
TCP_OUT = "80,443"
. . .

Sau khi hoàn tất cấu hình mọi thứ, chúng ta hãy thực hiện lệnh sau để áp dụng các thay đổi:

bash (root)
csf -r

Bước 3: Tạo virtualhost cho Nginx

Đầu tiên, chúng ta cần tạo user cho mỗi trang web của chúng ta, phân quyền và chỉ định nhóm người dùng tương ứng cho các user:

bash (root)
useradd website1
useradd website2
usermod -a -G website1 website1
usermod -a -G website2 website2

Tiếp theo, chúng ta cần tạo 2 thư mục chứa mã nguồn cho 2 website của mình bằng lệnh:

bash (root)
mkdir -p /home/website1/public_html
mkdir -p /home/website2/public_html

Sau khi tạo xong user và thư mục chứa mã nguồn cho website, chúng ta phân quyền user cho thư mục web tương ứng:

bash (root)
chown -R website1:website1 /home/website1
chmod 750 /home/website1/ 
chown -R website2:website2 /home/website2
chmod 750 /home/website2/ 

Phân quyền này sẽ làm user website1 không thể xem hay can thiệp được vào dữ liệu user website2 (không có quyền)

Bây giờ, chúng ta hãy tạo trang index.html đầu tiên cho 2 website:

bash (root)
touch /home/website1/public_html/index.html

Thêm nội dung sau đây vào file index.html:

/home/website1/public_html/index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Website 1</title>
</head>
<body>
    <h2>Đây là your-domain-1.com.vn</h2>
</body>
</html>
bash (root)
touch /home/website2/public_html/index.html

Thêm nội dung sau đây vào file index.html:

/home/website2/public_html/index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Website 2</title>
</head>
<body>
    <h2>Đây là your-domain-2.com.vn</h2>
</body>
</html>

Tiếp theo, chúng ta cần cấu hình virtualhosts cho 2 website vừa tạo. Để có nội dung file virtualhosts mặc định cho 2 site your-domain-1.com.vnyour-domain-2.com.vn, chúng ta cần coppy nội dung virtualhosts từ file default :

bash (root)
cp /etc/nginx/sites-available/default /etc/nginx/sites-available/your-domain-1.com.vn.conf
cp /etc/nginx/sites-available/default /etc/nginx/sites-available/your-domain-2.com.vn.conf

Và bây giờ, chúng ta chỉnh sửa nội dung cấu hình virtualhosts cho 2 website bằng cách sử dụng trình soạn thảo linux bất kì để chỉnh sửa file /etc/nginx/sites-available/your-domain-1.com.vn.conf/etc/nginx/sites-available/your-domain-2.com.vn.conf như sau:

  • Chỉnh sửa file /etc/nginx/sites-available/your-domain-1.com.vn.conf
/etc/nginx/sites-available/your-domain-1.com.vn.conf
server {
        listen 80;
        listen [::]:80;

        root /home/website1/public_html;
        index index.php index.html index.htm;

        server_name your-domain-1.com.vn www.your-domain-1.com.vn;

        location / {
                try_files $uri $uri/ =404;
        }
         location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/run/php/php8.1-your-domain-1.com.vn-fpm.sock;
}
  • Chỉnh sửa file /etc/nginx/sites-available/your-domain-2.com.vn.conf
/etc/nginx/sites-available/your-domain-2.com.vn.conf
server {
        listen 80;
        listen [::]:80;

        root /home/website2/public_html;
        index index.php index.html index.htm;

        server_name your-domain-2.com.vn www.your-domain-2.com.vn;

        location / {
                try_files $uri $uri/ =404;
        }
         location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/run/php/php8.1-your-domain-2.com.vn-fpm.sock;
}

Trong đó:

  • listen: port máy chủ đang sử dụng
  • root: đường dẫn chứa mã nguồn
  • server_name: Tên website
  • fastcgi_pass: Đường dẫn của file sock php-fpm

Sau khi chỉnh sửa xong nội dung file virtualhosts của 2 website your-domain-1.com.vnyour-domain-2.com.vn, chúng ta hãy tạo liên kết tượng trưng file virtualhosts này sang /etc/nginx/sites-enable bằng lệnh:

bash (root)
ln -s /etc/nginx/sites-available/your-domain-1.com.vn.conf /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/your-domain-2.com.vn.conf /etc/nginx/sites-enabled/

Tiếp theo, chúng ta hãy kiểm tra để đảm bảo rằng không có lỗi cú pháp trong bất kì file nào trên service bằng lệnh:

bash (root)
nginx -t
Kết quả
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Nếu không có bất kì lỗi nào được thông báo, chúng ta hãy khởi động lại nginx để kích hoạt các thay đổi:

bash (root)
systemctl restart nginx

Truy cập trình duyệt để kiểm tra xem website của chúng ta đã hoạt động chưa (chúng ta có thể trỏ file host website của mình về địa chỉ IP VPS để kiểm tra bằng cách làm theo hướng dẫn tại đây): nginx nginx

Bước 4: Cài đặt MariaDB

Đầu tiên, chúng ta cần cập nhật hệ điều hành Debian 11 để đảm bảo các gói hiện có đều được cập nhật lên phiên bản mới nhất:

bash (root)
apt update && apt upgrade -y

Nhập kho lưu trữ MariaDB 10.7:

bash (root)
curl -LsS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | bash -s -- --mariadb-server-version=10.7 --skip-maxscale --skip-tools

Cài đặt MariaDB 10.7:

bash (root)
apt-get install mariadb-server mariadb-client -y

Sau khi lệnh cài đặt hoàn thành, chúng ta có thể sử dụng lệnh sau để kiểm tra MariaDB đã được cài đặt thành công chưa:

bash (root)
mariadb --version
Kết quả
mariadb  Ver 15.1 Distrib 10.7.4-MariaDB, for debian-linux-gnu (x86_64) using readline EditLine wrapper

Bước 5: Cấu hình bảo mật cho MariaDB

Sau khi đã cài đặt thành công MariaDB, chúng ta có thể cấu hình bảo mật cho MariaDB:

bash (root)
mariadb-secure-installation
Kết quả
Enter current password for root (enter for none):
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 --> Chọn n và Enter
 ... skipping.

You already have your root account protected, so you can safely answer 'n'.

Change the root password? [Y/n] y --> Chọn y và Enter
New password: `Nhập mật khẩu mariadb của chúng ta`
Re-enter new password: `Nhập lại mật khẩu mariadb của chúng ta`
Password updated successfully!
Reloading privilege tables..
 ... Success!


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 --> Chọn y và Enter
 ... 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 --> Chọn y và Enter
 ... 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 --> Chọn y và Enter
 - 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 --> Chọn y và Enter
 ... 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ây giờ, chúng ta có thể đăng nhập vào MariaDB để tạo cơ sở dữ liệu cho riêng mình bằng lệnh sau:

bash (root)
mariadb -u root -p

Bước 6: Cài đặt PHP

Đầu tiên, chúng ta cần cài đặt kho lưu trữ PHP và cập nhật kho lưu trữ APT:

bash (root)
curl -sSL https://packages.sury.org/php/README.txt | bash -x

Sau khi cài đặt kho lưu trữ xong bây giờ chúng ta có thể cài đặt PHP bằng lệnh sau:

bash (root)
apt install php8.1 php8.1-fpm php8.1-cli php8.1-curl php8.1-zip php8.1-mysql -y

Bây giờ, chúng ta có thể kiểm tra xem PHP đã được cài đặt thành công chưa bằng lệnh:

bash (root)
php -v
Kết quả
PHP 8.1.7 (cli) (built: Jun 25 2022 08:11:34) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.7, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.7, Copyright (c), by Zend Technologies

6.1. Cấu hình php-fpm

Bây giờ, chúng ta coppy pool php mặc định cho 2 website của mình:

bash (root)
cp /etc/php/8.1/fpm/pool.d/www.conf /etc/php/8.1/fpm/pool.d/fpm-your-domain-1.com.vn.conf
cp /etc/php/8.1/fpm/pool.d/www.conf /etc/php/8.1/fpm/pool.d/fpm-your-domain-2.com.vn.conf

Tiếp theo, chúng ta cần truy cập vào file fpm-your-domain-1.com.vn.conf (tại /etc/php/8.1/fpm/pool.d/fpm-your-domain-1.com.vn.conf) và fpm-your-domain-2.com.vn.conf (tại /etc/php/8.1/fpm/pool.d/fpm-your-domain-2.com.vn.conf) để chỉnh sửa các thông tin sau:

/etc/php/8.1/fpm/pool.d/fpm-your-domain-1.com.vn.conf
[website1]
user = website1
group = website1
listen = /run/php/php8.1-your-domain-1.com.vn-fpm.sock
listen.owner = website1
listen.group = website1
pm.max_spare_servers = 3
pm.min_spare_servers = 1
pm.start_servers = 2
pm.max_children = 5
pm = dynamic
/etc/php/8.1/fpm/pool.d/fpm-your-domain-2.com.vn.conf
[website2]
user = website2
group = website2
listen = /run/php/php8.1-your-domain-2.com.vn-fpm.sock
listen.owner = website2
listen.group = website2
pm.max_spare_servers = 3
pm.min_spare_servers = 1
pm.start_servers = 2
pm.max_children = 5
pm = dynamic

Sau khi hoàn thành các bước cấu hình, chúng ta khởi động lại php-fpm và kiểm tra trạng thái php-fpm

bash (root)
systemctl restart php8.1-fpm
systemctl status php8.1-fpm
Kết quả
php8.1-fpm.service - The PHP 8.1 FastCGI Process Manager
     Loaded: loaded (/lib/systemd/system/php8.1-fpm.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2022-07-14 20:59:37 +07; 2s ago
       Docs: man:php-fpm8.1(8)
    Process: 18285 ExecStartPost=/usr/lib/php/php-fpm-socket-helper install /run/php/php-fpm.sock /etc/php/8.1/fpm/pool.d/www.conf 81 (code=exited, status=0/SUCCESS)
   Main PID: 18280 (php-fpm8.1)
     Status: "Ready to handle connections"
      Tasks: 5 (limit: 3547)
     Memory: 11.2M
        CPU: 59ms
     CGroup: /system.slice/php8.1-fpm.service
             ├─18280 php-fpm: master process (/etc/php/8.1/fpm/php-fpm.conf)
             ├─18281 php-fpm: pool website1
             ├─18282 php-fpm: pool website1
             ├─18283 php-fpm: pool website2
             └─18284 php-fpm: pool website2

Jul 14 20:59:37 vps systemd[1]: Starting The PHP 8.1 FastCGI Process Manager...
Jul 14 20:59:37 vps systemd[1]: Started The PHP 8.1 FastCGI Process Manager.

Bây giờ, chúng ta hãy khởi động lại nginx và truy cập trình duyệt web kiểm tra kết quả:

bash (root)
systemctl restart nginx

Website 1: ![website1](https://123host.vn/uploads/tutorial/5378538416.png Website 2: website2

6.2. Hướng dẫn tạo file info.php để kiểm tra thông tin PHP

Đầu tiên, chúng ta cần di chuyển đến thư mục public_html của mã nguồn website1:

bash (root)
cd /home/website1/public_html

Chúng ta sử dụng trình soạn thảo bất kì để tạo file info.php và thêm nội dung sau vào file info.php:

/home/website1/public_html/info.php
<?php
          phpinfo();
?>

Tiếp theo, chúng ta di chuyển đến thư mục public_html của mã nguồn website2:

bash (root)
cd /home/website2/public_html

Chúng ta sử dụng trình soạn thảo bất kì để tạo file info.php và thêm nội dung sau vào file info.php:

/home/website2/public_html/info.php
<?php
          phpinfo();
?>

Bây giờ, chúng ta hãy khởi động lại nginx và truy cập trình duyệt web kiểm tra kết quả:

bash (root)
systemctl restart nginx

Bây giờ chúng ta truy cập trình duyệt và kiểm tra trang PHP information cho mỗi trang web. Tại phần PHP Variables, $ _SERVER ['USER'] phải là website1 cho website1 và website2 cho website2 và đường dẫn thư mục gốc của website1 là $ _SERVER ['HOME']: /home/website1, của website2 là $ _SERVER ['HOME']: /home/website2:

Thông tin php info website 1: info.php info.php Thông tin php info website 2: info.php info.php

Bước 7: Cài đặt và cấu hình Let's Encrypt

Đầu tiên, chúng ta cần cài thư viện certbot cho nginx để có thể cài đặt và cấu hình Let's Encrypt bằng lệnh sau:

bash (root)
apt install python3-certbot-nginx -y

Sau khi cài đặt certbot thành công, chúng ta hãy cài đặt và cấu hình Let's Encrypt cho website bằng lệnh sau:

bash (root)
certbot --nginx --agree-tos --redirect --hsts --staple-ocsp --email admin@your-domain.com.vn -d www.your-domain.com.vn
Kết quả
Congratulations! You have successfully enabled https://www.your-domain.com.vn
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Subscribe to the EFF mailing list (email: admin@your-domain.com.vn).

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/www.your-domain.com.vn/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/www.your-domain.com.vn/privkey.pem
   Your certificate will expire on 2022-10-08. To obtain a new or
   tweaked version of this certificate in the future, simply run
   certbot again with the "certonly" option. To non-interactively
   renew *all* of your certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Tổng kết

Như vậy, qua bài viết này chúng ta đã biết cách cài đặt Nginx, MariaDB, PHP,cấu hình Virtualhost cho Nginx, cài đặt Let's Encrypt trên Debian 11 hoàn tất một cách đầy đủ nhất. Hy vọng bài viết này sẽ giúp bạn cài đặt thành công!


Bạn có làm được theo hướng dẫn này không?

Bài liên quan

Hướng dẫn cài đặt và cấu hình LEMP Stack trên CentOS 7
Hướng dẫn cài đặt và cấu hình LEMP Stack trên CentOS 7

Object Storage

Chuẩn S3, không giới hạn băng thông

Object Storage

Thuê Server Riêng

Chi phí thấp, cấu hình cao

Thuê Server Riêng
Thông tin tác giả
Bình luận

Tính năng đang được phát triển

Đang tải bình luận