Hướng dẫn cài đặt LEMP trên CentOS Stream 9

Bài viết này sẽ hướng dẫn các bạn cài đặt LEMP stack trên CentOS Stream 9 mới nhất trên Vultr Cloud VPS.
Hướng dẫn cài đặt LEMP trên CentOS Stream 9
Hướng dẫn cài đặt LEMP trên CentOS Stream 9

Tạo Cloud Instance trên Vultr

Đăng nhập vào Vultr, sau đó chọn Deploy New Instance. Nghèo quá nên mình chọn gói Cloud Compute, location Singapore load cho nó lẹ.

screen-shot-2022-05-13-at-000012.png

Phần Server Image các bạn nhớ chọn CentOS, phiên bản CentOS 9 Stream x64 nha.

screen-shot-2022-05-13-at-000139.png screen-shot-2022-05-13-at-063904.png

Sau đó bấm vào deploy và ngồi chờ tầm 5 phút thôi nè 😀

Sau khi Vultr cài đặt xong, sẽ hiện ra trang như vầy:

screen-shot-2022-05-13-at-064906-1024x496.png

Có một số thứ quan trọng trong khung màu đỏ mà bạn cần quan tâm. Chúng chính là thông tin server để bạn thực hiện kết nối vào Cloud Instance.

 

SSH vào Cloud Instance

ssh root@your_domain_ip
screen-shot-2022-05-13-at-065549.png

Ok, kết nối thành công :D

 

Cài đặt Nginx Web Server

Để thực hiện cài đặt, các bạn sử dụng lệnh sau đây:

yum install nginx -y
screen-shot-2022-05-13-at-070339.png

Sau khi cài đặt Nginx, chúng ta tiếp tục thực hiện các lệnh sau đây:

# Bắt đầu khởi chạy web server
systemctl start nginx

# Tự động khởi chạy web server mỗi khi chúng ta reboot Cloud Instance
systemctl enable nginx

# Kiểm tra trạng thái web server
systemctl status nginx
screen-shot-2022-05-13-at-070658.png

Sau đó, chúng ta sẽ cập nhật các firewall rules để cho phép xử lý các kết nối thông qua giao thức HTTP trên web server.

# Cho phép các kết nối http
firewall-cmd --permanent --zone=public --add-service=http 

# Cho phép các kết nối https
firewall-cmd --permanent --zone=public --add-service=https

# Khởi chạy lại firewall service
firewall-cmd --reload

Kết quả hiển thị như sau là ổn:

screen-shot-2022-05-13-at-073811.png

Từ giờ, chúng ta đã có thể truy cập tới trang web của chúng ta bằng địa chỉ IP:

http://your_ip_address

Nó load ra được trang web mặc định như vầy là ổn nha :D

screen-shot-2022-05-13-at-074032.png

Chúng ta cũng cần phải gán nginx làm owner user cho web directory. Mặc định, các folder này thuộc về owner user root.

chown nginx:nginx /usr/share/nginx/html -R

 

Cài đặt MariaDB

 

MariaDB là một phiên bản khác của MySQL và hoàn toàn miễn phí.

Để cài đặt nó, chúng ta thực hiện lệnh sau đây. À quên, nó hỏi gì thì cứ chọn Yes nhé.

yum install mariadb-server mariadb -y

Tương tự với việc cài đặt Nginx, sau khi cài MariaDB xong, chúng ta sẽ tiến hành khởi động MariaDB.

systemctl start mariadb

systemctl enable mariadb

systemctl status mariadb
screen-shot-2022-05-13-at-074931.png

Mặc định, MariaDB không thực hiện sẵn secure (ví dụ như password mặc định…) cho chúng ta. Để thực hiện việc này, chúng ta sử dụng câu lệnh sau:

mysql_secure_installation
6.png

Sau khi hoàn tất, chúng ta thử kết nối vào MariaDB bằng câu lệnh sau đây:

mysql -e "SHOW DATABASES;" -p
screen-shot-2022-05-13-at-075347.png

Done phần database rồi nè :D

 

Cài đặt PHP 8.0

 

Chúng ta cần cài đặt php-fpm để chạy được PHP trên Nginx.

Bên cạnh đó, chúng ta cũng sẽ cài thêm một số PHP modules khác để chạy được các framework nổi tiếng khác của PHP như Laravel,…

yum install php php-fpm php-mysqlnd php-common php-json php-opcache php-ldap php-gd php-bcmath php-ctype php-fileinfo php-xml php-curl php-mbstring php-zip -y
screen-shot-2022-05-13-at-095626.png

Sau khi cài xong, chúng ta sẽ enable PHP-FPM lên.

systemctl start php-fpm

systemctl enable php-fpm

systemctl status php-fpm

Output như hình bên dưới là ổn nha :D

screen-shot-2022-05-13-at-095808.png

Theo mặc định, PHP-FPM sẽ khởi chạy dưới danh nghĩa apache user. Chúng ta sẽ cập nhật nó để chạy với nginx user.

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

Sau đó tìm các giá trị sau đây:

user = apache
group = apache

Và cập nhật chúng lại như dưới đây:

user = nginx
group = nginx

Giờ thì chúng ta sẽ reload lại php và nginx để hệ thống cập nhật các thay đổi:

systemctl restart nginx php-fpm

Tạo một file php để kiểm tra php info nào :D

echo "<?php echo 'Linux user who processing PHP: ' . exec('whoami'); phpinfo(); ?>" > /usr/share/nginx/html/info.php

# Sau đó truy cập bằng link này
http://your_ip_address/info.php
screen-shot-2022-05-13-at-100808.png

Ok ngon :D

 

Mở port 3306 kết nối MariaDB từ xa

systemctl status firewalld

systemctl enable --now firewalld

firewall-cmd --permanent --zone=public --add-port=3306/tcp

firewall-cmd --reload

Vậy là giờ bạn đã có thể kết nối MariaDB từ xa mà không cần ssh trực tiếp vào server :D

Thử cái nha. Ở bước secure MariaDB trước đó, mình đã ngăn chặn user kết nối remote database bằng account root, nên mình cần tạo một account MariaDB khác trước đã.

mysql -u root;

# Tạo user tên là nonroot, password là !~(nonroot)~!
CREATE USER 'nonroot'@'%' IDENTIFIED BY '!~(nonroot)~!';

CREATE DATABASE demo_lemp;

# Gán quyền cho user nonroot thao tác với database demo_lemp.
GRANT ALL PRIVILEGES ON demo_lemp.* TO 'nonroot'@'%';
screen-shot-2022-05-13-at-101909.png

Thử kết nối bằng Navicat hoặc DataGrip xem coi nào :D

screen-shot-2022-05-13-at-102503.png screen-shot-2022-05-13-at-102600.png

Ngon lành :D

 

Cài đặt FTP server (VSFTPD) trên CentOS Stream 9

# Cài đặt vsftpd thông qua dnf
dnf install vsftpd -y

systemctl start vsftpd

systemctl enable vsftpd

systemctl status vsftpd

# Cho phép người dùng kết nối với server thông qua FTP
firewall-cmd --add-service=ftp --permanent --zone=public

firewall-cmd --reload
screen-shot-2022-05-13-at-103053.png

 

Tạo account kết nối FTP

useradd ftproot;

passwd ftproot;

Dùng FileZilla kết nối thử cái nào:

screen-shot-2022-05-13-at-103522-1024x154.png

Ok ngon luôn :D

 

Tạo SSL Certificate để xử lý HTTPS

sudo mkdir /etc/ssl/private
sudo chmod 700 /etc/ssl/private

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt
screen-shot-2022-05-13-at-105020.png

Sau đó chạy tiếp lệnh:

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Cái này sẽ chạy hơi lâu, các bạn chờ tí nha :D

 

Cấu hình Nginx xử lý HTTPS

sudo nano /etc/nginx/conf.d/ssl.conf

Sau đó nhập vào nội dung như dưới đây:

server {
    listen 443 http2 ssl;
    listen [::]:443 http2 ssl;

    server_name _;

    ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
    ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  10m;
    ssl_ciphers PROFILE=SYSTEM;
    ssl_prefer_server_ciphers on;

    client_max_body_size 2G;
    fastcgi_buffers 64 4K;

    access_log /var/log/nginx/https_access.log combined;
    error_log /var/log/nginx/https_error.log;

    include /etc/nginx/default.d/*.conf;

    root /usr/share/nginx/html;
    index index.php index.html;

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~* \.(htaccess|htpasswd) {
            deny all;
    }
}

Sau đó nhớ restart lại Nginx nha :D

systemctl restart nginx;

Thử truy cập bằng https xem coi nào:

https://your_ip_address
screen-shot-2022-05-13-at-110609-1024x779.png

Nó hiện ra bảng này thì bấm Accept là được nha :D tại cái certificate của mình là pha ke :D

screen-shot-2022-05-13-at-111007-1024x778.png

 

Tắt SELinux

SELinux (Security-Enhanced Linux) là một mô đun bảo mật ở nhân của Linux, cung cấp cơ chế hỗ trợ các chính sách bảo mật kiểm soát truy cập (access control) , bao gồm các điều khiển truy nhập bắt buộc theo phong cách Bộ Quốc phòng Hoa Kỳ (MAC).

SELinux có 3 chế độ hoạt động cơ bản, trong đó Enforcing là chế độ mặc định khi cài đặt.

  • Enforcing: Chế độ mặc định sẽ cho phép và thực thi chính sách bảo mật SELinux trên hệ thống, từ chối các hành động truy cập và ghi nhật ký. Cơ chế này vô tình làm chúng ta không thể ghi logs hay thay đổi các tập tin từ bên ngoài, dù cho bạn set chmod về 777.
  • Permissive: Trong chế độ Permissive, SELinux được kích hoạt nhưng sẽ không thực thi chính sách bảo mật, chỉ cảnh báo và ghi lại các hành động. Chế độ Permissive hữu ích cho việc khắc phục sự cố SELinux.
  • Disabled: SELinux bị vô hiệu hóa hoặc bị tắt đi.

Vậy nên, để chạy được một số PHP framework như Laravel,… có cơ chế cache files và ghi logs, chúng ta cần chuyển mode sang Permissive hoặc tắt nó đi luôn.

sestatus;
setenforce Permissive;
sudo setenforce 0;

Để tắt SELinux hoàn toàn, bạn cần chỉnh sửa lại config mặc định của CentOS 9.

nano /etc/selinux/config;

Tìm dòng sau đây và sửa nó lại:

#SELINUX=enforcing
SELINUX=disabled

Lưu file lại, sau đó chạy lệnh sau đây:

setenforce Permissive;
sudo setenforce 0;

 

Kết

Bài viết đến đây là hết, xin cám ơn các bạn đã theo dõi. Hẹn gặp lại trong các bài viết tới nhé :D

 

Phụ lục: cài đặt PHP 8.1

Chúng ta sẽ sử dụng dnf để cài đặt PHP 8.1.

Đầu tiên cần kiểm tra các phiên bản php đang có sẵn trên dnf.

dnf module list php

Bạn sẽ nhận được một kết quả kiểu như vầy. Bạn cần quan tâm 2 cột NameStream.

Last metadata expiration check: 0:54:24 ago on Sun 01 Jan 2023 06:59:33 PM UTC.
CentOS Stream 9 - AppStream
Name              Stream               Profiles                                Summary
php               8.1 [e]              common [d], devel, minimal              PHP scripting language

Sau đó cài đặt PHP với đúng phiên bản trên stream mà bạn chọn. Hiện tại chỉ có 8.1 là có sẵn.

dnf module enable php:8.1
// Hệ thống có hỏi gì thì cứ chọn Y - Yes là ổn

Sau khi cài đặt xong PHP 8.1, chúng ta sẽ cài thêm một số PHP extensions quan trọng:

dnf install php php-fpm php-mysqlnd php-common php-json php-opcache php-ldap php-gd php-bcmath php-ctype php-fileinfo php-xml php-curl php-mbstring php-zip

Sau đó khởi động lại php-fpm và kiểm tra version PHP.

systemctl restart php-fpm;
php -v;

Kết quả trên cả toẹt vời :D

PHP 8.1.8 (cli) (built: Jul  5 2022 21:55:55) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.1.8, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.8, Copyright (c), by Zend Technologies

Comments

Bài viết nổi bật

Dạo gần đây đi đâu cũng nghe nói về microservices, người người nhà nhà rục rịch chuyển dịch hệ thống sang microservices. Trước khi đưa ra sự so sánh, mình sẽ khái quát một chút về Monolith Application và MicroServices một chút cho các bạn chưa biết nắm rõ hơn nhé.
PHP là ngôn ngữ được sử dụng rộng rãi nhất trên thế giới trong lập trình web. Nó cũng bị ghét nhất. Nhưng tại sao nhiều developer lại ghét nó đến vậy? Hôm nay chúng ta hãy cùng tìm hiểu lý do xem chúng có thuyết phục không nhé ^_^
Lúc trước mình hay sử dụng cách này trên laptop phụ của mình, giờ mua license luôn rồi. Hôm nay mình xin chia sẻ cho bạn nào cần nhé.
JWT Tokens là một cách thức lưu trữ thông tin xác thực hiệu quả, nhưng làm cách nào để chúng ta có thể giúp chúng an toàn hơn? Có 2 cách thường dùng để lưu trữ JWT Tokens là LocalStorage và Cookies. Bây giờ chúng ta sẽ bắt đầu "mổ xẻ" các ưu - nhược điểm của mỗi loại nhé.
Có khá nhiều bạn đã yêu cầu mình một bài viết về Repository Design Pattern. Vậy mục đích của nó là gì? Nó có thực sự cần thiết cho ứng dụng của bạn hay không? Những điểm mạnh, điểm yếu của nó là gì? Chúng ta cùng đi sâu tìm hiểu qua bài viết này nhé.

Mục lục

Related posts

Trong phần này, chúng ta sẽ tìm hiểu một số khái niệm cơ bản nhất về AWS là gì và một số lợi ích khi sử dụng AWS.
Bài hướng dẫn này sẽ hướng dẫn các bạn cài đặt LEMP stack (Linux - Nginx - MySQL - PHP) trên CentOS 8.

Tin mới nhất

Triển khai Saga Pattern trong microservices với NodeJS và Choreography-Based Saga
Mô hình Saga đưa ra một giải pháp có cấu trúc để giải quyết thách thức này. Nó cung cấp một phương pháp có hệ thống để quản lý transaction qua nhiều microservices. Điều này giải quyết những phức tạp của các transaction phân tán và hoàn toàn tương thích với các nguyên tắc của kiến trúc microservices, được đặc trưng bởi sự kết nối lỏng lẻo và khả năng triển khai độc lập của các service.
Một API cho phép giao tiếp hai chiều giữa các ứng dụng phần mềm thông qua các requests. Một Webhook là một API nhẹ, hỗ trợ chia sẻ dữ liệu một chiều được kích hoạt bởi các events.
Một trong những câu hỏi được đặt thường xuyên nhất về TypeScript là liệu chúng ta nên sử dụng interface hay type. Câu trả lời cho câu hỏi này, giống như nhiều câu hỏi lập trình khác, là nó phụ thuộc vào tình hình cụ thể. Trong một số trường hợp, một cái có lợi thế rõ rệt hơn cái kia, nhưng trong nhiều trường hợp, chúng có thể thay thế cho nhau.
Trong phần này, chúng ta sẽ tìm hiểu một số khái niệm cơ bản nhất về AWS là gì và một số lợi ích khi sử dụng AWS.
Trở thành một software developer hiệu suất cao không phải là điều dễ dàng. Điều này đòi hỏi bạn phải có kỹ năng và kiến thức về lập trình, cũng như cách tiếp cận và giải quyết các vấn đề phức tạp. Tuy nhiên, nếu bạn có chút kiên nhẫn và sự nỗ lực, bạn hoàn toàn có thể trở thành một developer tài năng và thành công.
Đây là các types cơ bản nhưng cũng phổ biến nhất trong Typescript. Một số types khác phức tạp hơn cũng được xây dựng dựa trên những types cơ bản này.
Trong thế giới lập trình, trách nhiệm lớn nhất của chúng ta không phải chỉ làm cho code chạy được, mà còn phải đảm bảo rằng các đoạn code mà chúng ta viết có thể dễ dàng kiểm tra và bảo trì trong một khoảng thời gian dài.
Thông tin được định nghĩa dưới dạng dữ liệu, kiến thức về thông tin, và trí tuệ về tri thức.
Phân trang - một thành phần không thể thiếu trong các ứng dụng có lượng dữ liệu lớn. Tuy nhiên, bạn hiểu được bao nhiêu về nó?
Javascript là một thành phần không thể thiếu đối với frontend developers. Tuy nhiên, ngay từ lúc ra đời, nó đã tồn tại khá nhiều vấn đề cần khắc phục. Đó là lý do tại sao từ 2015 (ES6) tới 2021 (ES12) ra đời nhằm giúp Javascript trở nên tốt hơn.
Dạo này mình làm việc với mấy bạn trên github, thấy hay xài mấy từ viết tắt mà mình không hiểu lắm. Thôi thì tổng hợp lại một list các từ viết tắt hay dùng trong github luôn cho ai cần :D
Trong phần này, chúng ta sẽ tìm hiểu một số khái niệm cơ bản nhất về AWS là gì và một số lợi ích khi sử dụng AWS.
Bài viết này sẽ hướng dẫn các bạn cài đặt LEMP stack trên CentOS Stream 9 mới nhất trên Vultr Cloud VPS.
Bài hướng dẫn này sẽ hướng dẫn các bạn cài đặt LEMP stack (Linux - Nginx - MySQL - PHP) trên CentOS 8.