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.
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ẹ.
Phần Server Image các bạn nhớ chọn CentOS, phiên bản CentOS 9 Stream x64 nha.
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:
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
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
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
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:
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
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
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
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
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
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
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
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'@'%';
Thử kết nối bằng Navicat hoặc DataGrip xem coi nào :D
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
Tạo account kết nối FTP
useradd ftproot;
passwd ftproot;
Dùng FileZilla kết nối thử cái nào:
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
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
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
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 Name và Stream.
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