Thứ hai, 24/02/2020 | 00:00 GMT+7

Cách cài đặt Linux, Nginx, MySQL, PHP (LEMP) trên CentOS 8

Phần mềm LEMP là một group phần mềm được dùng để phục vụ các trang web động và ứng dụng web được viết bằng PHP. Tên “LEMP” là từ viết tắt mô tả hệ điều hành L inux với web server Nginx (phát âm như “ E ngine-X”). Dữ liệu backend được lưu trữ trong database M ariaDB và xử lý bởi P HP.

Lớp database trong LEMP thường là server database MySQL, nhưng trước khi CentOS 8 phát hành, MySQL không có sẵn từ repository CentOS mặc định. Do đó, MariaDB , một nhánh cộng đồng của MySQL, đã trở thành một giải pháp thay thế được chấp nhận rộng rãi cho MySQL làm hệ thống database mặc định cho LEMP trên máy CentOS. MariaDB hoạt động như một bản thay thế cho server MySQL ban đầu, trong thực tế, điều này nghĩa là bạn có thể chuyển sang MariaDB mà không cần phải thực hiện bất kỳ thay đổi cấu hình hoặc mã nào trong ứng dụng của bạn .

Trong hướng dẫn này, bạn sẽ cài đặt LEMP trên server CentOS 8. Mặc dù MySQL có sẵn từ repository mặc định trong CentOS 8, hướng dẫn này sẽ hướng dẫn quy trình cài đặt LEMP với MariaDB làm hệ thống quản lý database .

Yêu cầu

Để làm theo hướng dẫn này, bạn cần quyền truy cập vào server CentOS 8 với quyền là user không phải root có quyền sudo và firewall hoạt động được cài đặt trên server của bạn. Để cài đặt điều này, bạn có thể làm theo Hướng dẫn Cài đặt Server Ban đầu cho CentOS 8 của ta .

Bước 1 - Cài đặt Server Web Nginx

Để hiển thị các trang web cho khách truy cập trang web của ta , ta sẽ sử dụng Nginx, một web server hiệu suất cao. Ta sẽ sử dụng trình quản lý gói dnf , là trình quản lý gói mặc định mới trên CentOS 8, để cài đặt phần mềm này.

Cài đặt gói nginx với:

  • sudo dnf install nginx

Khi được yêu cầu , hãy nhập y để xác nhận bạn muốn cài đặt nginx.

Sau khi cài đặt xong, hãy chạy lệnh sau để bật và khởi động server :

  • sudo systemctl start nginx

Trong trường hợp bạn đã bật firewalld firewalld theo hướng dẫn cài đặt server ban đầu của ta , bạn cần cho phép kết nối với Nginx. Lệnh sau sẽ kích hoạt vĩnh viễn các kết nối HTTP, chạy trên cổng 80 theo mặc định:

  • sudo firewall-cmd --permanent --add-service=http

Để xác minh thay đổi đã được áp dụng, bạn có thể chạy:

  • sudo firewall-cmd --permanent --list-all

Bạn sẽ thấy kết quả như thế này:

Output
public target: default icmp-block-inversion: no interfaces: sources: services: cockpit dhcpv6-client http ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:

Bạn cần reload cấu hình firewall để các thay đổi có hiệu lực:

  • sudo firewall-cmd --reload

Với luật firewall mới được thêm vào, bạn có thể kiểm tra xem server có hoạt động hay không bằng cách truy cập địa chỉ IP công cộng hoặc domain của server từ trình duyệt web .

Lưu ý : Trong trường hợp bạn đang sử dụng DigitalOcean làm nhà cung cấp dịch vụ lưu trữ DNS, bạn có thể kiểm tra tài liệu sản phẩm của ta để biết hướng dẫn chi tiết về cách cài đặt domain mới và trỏ nó đến server của bạn.

Nếu bạn không có domain được trỏ đến server của bạn và bạn không biết địa chỉ IP công cộng của server , bạn có thể tìm domain đó bằng cách chạy lệnh sau:

  • ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'

Thao tác này sẽ in ra một vài địa chỉ IP. Bạn có thể thử lần lượt từng cái trong trình duyệt web của bạn .

Một cách khác, bạn có thể tìm địa chỉ IP của bạn với nào có thể truy cập được, khi được xem từ các vị trí khác trên internet:

  • curl -4 icanhazip.com

Nhập địa chỉ mà bạn nhận được trong trình duyệt web của bạn và địa chỉ đó sẽ đưa bạn đến trang đích mặc định của Nginx:

Trang Nginx mặc định CentOS 8

Nếu bạn thấy trang này, thì web server của bạn hiện đã được cài đặt chính xác.

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

Đến đây bạn đã có một web server và đang chạy, bạn cần cài đặt một hệ thống database để có thể lưu trữ và quản lý dữ liệu cho trang web của bạn . Ta sẽ cài đặt MariaDB , một bản fork do cộng đồng phát triển của server MySQL root của Oracle.

Để cài đặt phần mềm này, hãy chạy:

  • sudo dnf install mariadb-server

Khi quá trình cài đặt hoàn tất, bạn có thể bật và khởi động server MariaDB với:

  • sudo systemctl start mariadb

Để cải thiện tính bảo mật của server database của bạn, bạn nên chạy tập lệnh bảo mật được cài đặt sẵn với MariaDB. 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 database 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ẽ đưa bạn qua một loạt dấu nhắc , nơi bạn có thể thực hiện một số thay đổi đối với cài đặt MariaDB của bạn . Dấu nhắc đầu tiên sẽ yêu cầu bạn nhập password gốc của database hiện tại. Điều này không được nhầm lẫn với user root hệ thống . User gốc database là admin-user có đầy đủ các quyền đối với hệ thống database . Vì bạn vừa cài đặt MariaDB và chưa thực hiện bất kỳ thay đổi cấu hình nào nên password này sẽ trống, vì vậy chỉ cần nhấn ENTER tại dấu nhắc .

Dấu nhắc tiếp theo hỏi bạn có muốn cài đặt password gốc database hay không . Vì MariaDB sử dụng một phương pháp xác thực đặc biệt cho user root thường an toàn hơn so với sử dụng password , bạn không cần cài đặt điều này ngay bây giờ. Gõ N và sau đó nhấn ENTER .

Từ đó, bạn có thể nhấn Y rồi ENTER để chấp nhận giá trị mặc định cho tất cả các câu hỏi tiếp theo. Thao tác này sẽ xóa user ẩn danh và database thử nghiệm, vô hiệu hóa đăng nhập root từ xa và tải các luật mới này để server áp dụng ngay những thay đổi bạn đã thực hiện.

Khi bạn hoàn tất, hãy đăng nhập vào console MariaDB bằng lệnh :

  • sudo mysql

Thao tác này sẽ kết nối với server MariaDB dưới dạng root user database quản trị, được suy ra bằng cách sử dụng sudo khi chạy lệnh này. Bạn sẽ thấy kết quả như thế này:

Output
Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 9 Server version: 10.3.17-MariaDB MariaDB Server 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 ý bạn không cần cung cấp password để kết nối với quyền là user root . Điều đó hoạt động vì phương pháp xác thực mặc định cho user MariaDB quản trị là unix_socket thay vì password . Mặc dù điều này thoạt đầu có vẻ là một mối lo ngại về bảo mật, nhưng nó làm cho server database an toàn hơn vì user duy nhất được phép đăng nhập với quyền user MariaDB gốc 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 như nhau. Về mặt thực tế, điều đó 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 của bạn .

Để tăng cường bảo mật, tốt nhất bạn nên cài đặt các account user chuyên dụng với ít quyền mở rộng hơn cho mọi database , đặc biệt nếu bạn có kế hoạch lưu trữ nhiều database trên server của bạn . Để chứng minh cài đặt như vậy, ta sẽ tạo database có tên example_database và user có tên example_user , nhưng bạn có thể thay thế các tên này bằng các giá trị khác nhau.

Để tạo database mới, hãy chạy lệnh sau từ console MariaDB của bạn:

  • CREATE DATABASE example_database;

Đến đây bạn có thể tạo một user mới và cấp cho họ các quyền đầy đủ trên database tùy chỉnh mà bạn vừa tạo. Lệnh sau định nghĩa password của user này là password , nhưng 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:

  • GRANT ALL ON example_database.* TO 'example_user'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

Đ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 của bạn.

Xóa các quyền đảm bảo rằng chúng được lưu và khả dụng trong phiên hiện tại:

  • FLUSH PRIVILEGES;

Sau đó, thoát khỏi shell MariaDB:

  • 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 MariaDB, lần này bằng thông tin đăng nhập user tùy chỉnh:

  • mysql -u example_user -p

Lưu ý cờ -p trong lệnh này, nó sẽ nhắc bạn nhập password bạn đã chọn khi tạo user example_user . Sau khi đăng nhập vào console MariaDB, hãy xác nhận bạn có quyền truy cập vào database example\_database :

  • SHOW DATABASES;

Điều này sẽ cung cấp cho bạn kết quả sau:

Output
+--------------------+ | Database | +--------------------+ | example_database | | information_schema | +--------------------+ 2 rows in set (0.000 sec)

Để thoát khỏi vỏ MariaDB, hãy nhập:

  • exit

Đến đây, hệ thống database của bạn đã được cài đặt và bạn có thể chuyển sang cài đặt PHP, thành phần cuối cùng của LEMP .

Bước 3 - Cài đặt PHP-FPM

Bạn đã cài đặt Nginx để phân phát nội dung của bạn và MariaDB được cài đặt để lưu trữ và quản lý dữ liệu . Đến đây bạn có thể cài đặt PHP để xử lý mã và tạo nội dung động cho web server .

Trong khi Apache nhúng trình thông dịch PHP trong mỗi yêu cầu, Nginx yêu cầu một chương trình bên ngoài để xử lý quá trình PHP processor và hoạt động như cầu nối giữa chính trình thông dịch PHP và web server . Điều này cho phép hiệu suất tổng thể tốt hơn trong hầu hết các trang web dựa trên PHP, nhưng nó yêu cầu cấu hình bổ sung. Bạn cần cài đặt php-fpm , viết tắt của “PHP fastCGI process manager” và yêu cầu Nginx chuyển các yêu cầu PHP đến phần mềm này để xử lý. Ngoài ra, bạn cần php-mysqlnd , một module PHP cho phép PHP giao tiếp với database dựa trên MySQL. Các gói PHP cốt lõi sẽ tự động được cài đặt dưới dạng các gói phụ thuộc.

Để cài đặt các gói php-fpmphp-mysql , hãy chạy:

  • sudo dnf install php-fpm php-mysqlnd

Khi quá trình cài đặt hoàn tất, bạn cần chỉnh sửa file /etc/php-fpm.d/www.conf để điều chỉnh một số cài đặt.

Trình soạn thảo văn bản mặc định đi kèm với CentOS 8 là vi . vi là một editor cực kỳ mạnh mẽ, nhưng nó có thể hơi khó đối với user chưa quen . Bạn có thể cần cài đặt một editor thân thiện với user hơn như nano để tạo điều kiện chỉnh sửa các file cấu hình trên server CentOS 8 của bạn:

  • sudo dnf install nano

Bây giờ, hãy mở file cấu hình /etc/php-fpm.d/www.conf bằng nano hoặc editor mà bạn chọn:

  • sudo nano /etc/php-fpm.d/www.conf

Bây giờ hãy tìm chỉ thị usergroup . Nếu bạn đang sử dụng nano , bạn có thể nhấn CTRL + W để tìm kiếm các cụm từ này bên trong file đang mở.

/etc/php-fpm.d/www.conf
… ; Unix user/group of processes ; Note: The user is mandatory. If the group is not set, the default user's group ;       will be used. ; RPM: apache user chosen to provide access to the same directories as httpd user = apache ; RPM: Keep a group allowed to write in log dir. group = apache

Bạn sẽ nhận thấy rằng cả biến usergroup đều được đặt thành apache . Ta cần thay đổi những điều này thành nginx :

/etc/php-fpm.d/www.conf
… ; RPM: apache user chosen to provide access to the same directories as httpd user = nginx ; RPM: Keep a group allowed to write in log dir. group = nginx

Lưu file khi bạn chỉnh sửa xong. Nếu bạn đang sử dụng nano , hãy làm như vậy bằng cách nhấn CTRL + X , sau đó nhấn YENTER .

Để bật và khởi động dịch vụ php-fpm , hãy chạy:

  • sudo systemctl start php-fpm

Cuối cùng, khởi động lại web server Nginx để nó tải các file cấu hình được tạo bởi cài đặt php-fpm :

  • sudo systemctl restart nginx

Web server của bạn hiện đã được cài đặt đầy đủ. Trong bước tiếp theo, ta sẽ tạo một kịch bản thử nghiệm PHP đảm bảo mọi thứ hoạt động như mong đợi.

Bước 4 - Kiểm tra PHP với Nginx

Trên CentOS 8, cài đặt php-fpm mặc định tự động tạo file cấu hình cho phép web server Nginx của bạn xử lý file .php trong root tài liệu mặc định có tại /usr/share/nginx/html . Bạn sẽ không cần thực hiện bất kỳ thay đổi nào đối với cấu hình của Nginx để PHP hoạt động chính xác trong web server của bạn.

Điều chỉnh duy nhất mà ta sẽ thực hiện là thay đổi cài đặt quyền mặc định trên folder root tài liệu Nginx của bạn. Bằng cách này, bạn có thể tạo và sửa đổi các file trong folder đó với user hệ thống thông thường của bạn mà không cần phải đặt trước mỗi lệnh bằng sudo .

Lệnh sau sẽ thay đổi quyền sở hữu của root tài liệu Nginx mặc định thành user và group được gọi là sammy , vì vậy hãy đảm bảo thay thế tên user và group được đánh dấu trong lệnh này để phản ánh tên user và group của hệ thống.

  • sudo chown -R sammy.sammy /usr/share/nginx/html/

Bây giờ ta sẽ tạo một trang PHP thử nghiệm đảm bảo web server hoạt động như mong đợi.

Tạo một file PHP mới có tên là info.php tại folder /usr/share/nginx/html :

  • nano /usr/share/nginx/html/info.php

Đoạn mã PHP sau sẽ hiển thị thông tin về môi trường PHP hiện tại đang chạy trên server :

/usr/share/nginx/html/info.php
<?php  phpinfo(); 

Khi bạn hoàn tất, hãy lưu file .

Bây giờ ta có thể kiểm tra xem web server của ta có thể hiển thị chính xác nội dung được tạo bởi tập lệnh PHP hay không. Truy cập trình duyệt của bạn và truy cập tên server hoặc địa chỉ IP của server , theo sau là /info.php :

http://server_host_or_IP/info.php 

Bạn sẽ thấy một trang tương tự như sau:

Thông tin PHP mặc định của CentOS 8

Sau khi kiểm tra thông tin liên quan về server PHP của bạn 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 CentOS của bạn. Bạn có thể sử dụng rm để xóa file đó:

  • rm /usr/share/nginx/html/info.php

Bạn luôn có thể tạo lại file này nếu sau này bạn cần. Tiếp theo, ta sẽ kiểm tra kết nối database từ phía PHP.

Bước 5 - 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 MariaDB và thực thi các truy vấn database hay không, bạn có thể tạo một bảng kiểm tra với dữ liệu giả và truy vấn nội dung của nó từ một tập lệnh PHP.

Đầu tiên, kết nối với console MariaDB với user database bạn đã tạo ở Bước 2 của hướng dẫn này:

  • mysql -u example_user -p

Tạo một bảng có tên todo_list . Từ console MariaDB, 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) ); 

Bây giờ, hãy chèn một vài hàng nội dung trong bảng thử nghiệm. Bạn có thể cần 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:

  • 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 của bạn, hãy chạy:

  • SELECT * FROM example_database.todo_list;

Bạn sẽ thấy kết quả sau:

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 bạn có dữ liệu hợp lệ trong bảng thử nghiệm của bạn , bạn có thể thoát khỏi console MariaDB:

  • exit

Đến đây bạn có thể tạo tập lệnh PHP sẽ kết nối với MariaDB và truy vấn nội dung của bạn. Tạo một file PHP mới trong folder root web tùy chỉnh của bạn bằng trình soạn thảo bạn muốn . Ta sẽ sử dụng nano cho điều đó:

  • nano /usr/share/nginx/html/todo_list.php

Thêm nội dung sau vào tập lệnh PHP của bạn:

/usr/share/nginx/html/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 file khi bạn chỉnh sửa xong.

Như vậy, bạn có thể truy cập trang này trong trình duyệt web của bạn bằng cách truy cập vào tên server hoặc địa chỉ IP công cộng của server , theo sau là /todo_list.php :

http://server_host_or_IP/todo_list.php 

Bạn sẽ thấy một trang như thế này, hiển thị nội dung bạn đã chèn vào bảng thử nghiệm của bạn :

Ví dụ về danh sách việc cần làm trong PHP

Điều đó 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 server MariaDB của bạn.

Kết luận

Trong hướng dẫn này, bạn đã xây dựng một nền tảng linh hoạt để cung cấp các trang web và ứng dụng PHP cho khách truy cập của bạn , sử dụng Nginx làm web server . Bạn đã cài đặt Nginx để xử lý các yêu cầu PHP thông qua php-fpm và bạn cũng cài đặt database MariaDB để lưu trữ dữ liệu trang web của bạn .


Tags:

Các tin trước

Cách cài đặt Linux, Apache, MariaDB, PHP (LAMP) trên Debian 10 2019-07-15
Cách cài đặt Linux, Apache, MySQL, PHP (LAMP) trên Debian 8 2018-10-18
Cách cài đặt Linux, Nginx, MySQL, PHP ( LEMP) trên Debian 9 2018-09-13
Cách cài đặt Linux, Apache, MariaDB, PHP (LAMP) trên Debian 9 2018-09-04
Cách cài đặt Linux, Nginx, MySQL, PHP ( LEMP) trên Ubuntu 18.04 2018-05-23
Sơ lược về lịch sử Linux 2017-10-27
Cách cấu hình firewall Linux cho Docker Swarm trên CentOS 7 2017-01-11
Cách cấu hình firewall Linux cho Docker Swarm trên Ubuntu 16.04 2017-01-09
Cách cài đặt Linux, Nginx, MySQL, PHP (LEMP Stack) trên Debian 8 2016-12-20
Cách thiết lập xác thực Linux tập trung với FreeIPA trên CentOS 7 2016-12-15