Hướng Dẫn Cấu Hình LEMP VirtualHosts Trên CentOS 7

Tác giả: 09/10/2022

LEMP

LEMP là một nhóm phần mềm nguồn mở thường được cài đặt cùng nhau để cho phép máy chủ lưu trữ các trang web động và ứng dụng web. LEMP được viết tắt từ 4 thành phần của nó:

  • L – Hệ điều hành Linux
  • E – Nginx (Engine x) một máy chủ web
  • M – Hệ quản trị cơ sở dữ liệu MySQL hoặc MariaDB
  • P – Ngôn ngữ lập trình PHP

Trên server sẽ cấu hình chạy 2 web site là:

  • tudv1.tudv.xyz – đường dẫn: /home/tudv1/public_html
  • tudv2.tudv.xyz – đường dẫn: /home/tudv2/public_html

Cài đặt LEMP trên CentOS 7

Trước tiên tắt selinux

vi /etc/sysconfig/selinux  :  selilux=disabled

reboot

1 – Cài NGINX

Update yum và mở rộng thư viện

Nginx không có sẵn trong kho lưu trữ CentOS mặc định nên trước tiên chúng ta cần thêm kho lưu trữ EPEL bằng cách chạy lệnh :

yum update -y

yum install epel-release -y

Cài đặt nginx

yum install nginx -y

Khởi động dịch vụ

systemctl start nginx

systemctl enable nginx

Mở 2 port firewalld zone public.

firewall-cmd –zone=public –permanent –add-port=80/tcp

firewall-cmd –zone=public –permanent –add-port=443/tcp

firewall-cmd –reload

Kiểm tra xem Nginx đã bind trên cổng 80 hay chưa bằng lệnh

netstat -pnltu | grep nginx

2 – Cài đặt Mariadb

yum install mariadb-server mariadb -y

Chạy maria

systemctl start mariadb

systemctl enable mariadb

service mariadb restart

Khai báo root và bảo mật mariadb

mysql_secure_installation

Bạn tạo mật khẩu root Mysql .Nhấn Enter = yes, Ngược lại nhập no

 

3 – Cài đặt kho lưu trữ Remi để có thể sử dụng các phiên bản PHP mới nhất

Cài đặt kho Remi

mkdir /data && cd /data

yum install yum-utils -y

wget http://rpms.remirepo.net/enterprise/remi-release-7.rpm

rpm -Uvh remi-release-7.rpm

Sau khi cài đặt gói Remi xong, cần chọn phiên bản PHP mà mình cần cài đặt và kích hoạt gói chứa phiên bản PHP đó

yum-config-manager –enable remi-php80

Cài các module của PHP 8.0

yum install -y php php-fpm php-ldap php-zip php-embedded php-cli php-mysql php-common php-gd php-xml php-mbstring php-mcrypt php-pdo php-soap php-json php-simplexml php-process php-curl php-bcmath php-snmp php-pspell php-gmp php-intl php-imap perl-LWP-Protocol-https php-pear-Net-SMTP php-enchant php-pear php-devel php-zlib php-xmlrpc php-tidy php-opcache php-cli php-pecl-zip unzip gcc

Xem phiên bản php mặc định

php -v

PHP là thành phần để hiển thị nội dung động, nó xử lý các tập lệnh, kết nối với cơ sở dữ liệu MySQL để lấy thông tin và chuyển nội dung đã xử lý cho máy chủ web để hiển thị.

Không giống như Apache, Nginx cần một chương trình trung gian giữa nó và trình biên dịch PHP được gọi là PHP-FPM để xử lý các PHP request. Điều này giúp Nginx cải thiện hiệu suất đáng kể trên những trang PHP. Ngoài ra, chúng ta sẽ cần php-mysql, một mô-đun PHP cho phép PHP giao tiếp với cơ sở dữ liệu dựa trên MySQL.

Trong phần này, chúng ta sẽ đi sâu hơn vào vai trò của PHP-FPM:

FPM là viết tắt của “FastCGI Process Manager”, mỗi khi có 1 request được gửi đến, nó sẽ được xử lý bởi 1 worker (process), PHP-FPM có nhiệm điều khiển công việc tải request đến worker, sinh và diệt các worker.

Tập hợp các worker lại với nhau được gọi là 1 pool (nhóm). và với 1 Server PHP-FPM có thể có nhiều pool, trong mỗi pool sẽ lại có nhiều worker đang xử lý request.

PHP-FPM điều phối request gửi đến, 1 worker chỉ có thể xử lý 1 request tại 1 thời điểm

Vậy mục đích sinh ra pool để làm gì ? Việc tạo ra các pool riêng biệt trong thực tế là việc chạy nhiều website ở trên cùng 1 Server. Trong môi trường như này, khi các website đều chạy dưới quyền 1 user, nếu có lỗ hổng từ 1 website thì hacker có thể truy cập vào website để lấy cắp dữ liệu. Vì vậy ta nên chia ra mỗi website được xử lý bởi 1 pool riêng biệt, mỗi pool lại có owner User khác nhau làm tăng khả năng bảo mật. Ngoài ra, ở mỗi pool ta còn có thể cấu hình tối ưu cho riêng từng site để tăng hiệu suất.

Tiến hành lập user cho từng website, không cung cấp cho chúng quyền đăng nhập hoặc liên kết thông tin nào khác:

useradd -s /sbin/nologin tudv1

Thêm tudv1 và  vào group nginx để cho phép webserver tương tác với user và ngược lại.

usermod -a -G tudv1 nginx

mkdir /home/tudv1/public_html

Tạo foder public_html trong /home/tudv1

Chuyển chủ sở hữu cá nhân và nhóm của folder public html cho cá nhân và nhóm tudv1

chmod 750 /home/tudv1/

chown -R tudv1. /home/tudv1/public_html

Tương tự với tudv2

useradd -s /sbin/nologin tudv2

usermod -a -G tudv2 nginx

Tạo foder public_html trong /home/tudv2

mkdir /home/tudv2/public_html

chmod 750 /home/tudv2/

chown -R tudv2. /home/tudv2/public_html

Cài đặt này sẽ làm user tudv1 không thể xem hay can thiệp được vào dữ liệu user tudv2.

Tạo php-fpm pool mới cho từng site bằng cách copy file cấu hình mặc định:

cp /etc/php-fpm.d/www.conf /etc/php-fpm.d/fpm-tudv1.conf

cp /etc/php-fpm.d/www.conf /etc/php-fpm.d/fpm-tudv2.conf

Xóa bỏ pool mặc định:

Cấu hình pool tudv1:

vi /etc/php-fpm.d/fpm-tudv1.conf

Các giá trị thay đổi

  • [www] = [tudv1]   ;   Dòng 4
  • user= nginx       ;   Dòng 24
  • group =nginx      ;   Dòng 26 :
  • listen = /var/run/tudv1-fpm.sock  ; Dòng 38
  • listen.owner = nginx  ;   Dòng 49 bỏ # đầu dòng
  • listen.group = nginx   ;  Dòng 50  bỏ # đầu dòng

Chỉnh sửa trên đã thực hiện 3 việc:

  • Cấp quyền truy cập vào các thư mục như httpd cho user tudv1.
  • Thay đổi php-fpm từ listen trên cổng 9000 qua TCP sang listen trực tiếp trên socket file /var/run/tudv1-fpm.sock.
  • Thay đổi owner và group của tệp socket trên thành nginx.

Cấu hình tương tự như vậy với tudv2

vi /etc/php-fpm.d/fpm-tudv2.conf

 

Tiến hành khởi động và enable php-fpm:

systemctl enable –now php-fpm

systemctl status php-fpm

Ngoài file cấu hình mặc định /etc/nginx/nginx.conf, Nginx còn cung cấp thư mục /etc/nginx/conf.d để lưu trữ các file cấu hình cho từng trang web riêng biệt (khá tương tự với virtual host của Apache).Chúng ta sẽ tạo mới file cấu hình cho tudv1 và tudv2 của mình tại thư mục này:

vi /etc/nginx/conf.d/tudv1.conf

Dán vào:

server {
listen 80;
server_name tudv1.tudv.xyz;

access_log /var/log/nginx/tudv1.tudv.xyz-access.log;

error_log /var/log/nginx/tudv1.tudv.xyz-error.log;

root /home/tudv1/public_html;
index index.php index.html;

location / {
try_files $uri $uri/ =404;
}

location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/tudv1-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

Tiếp tục với conf của tudv2

vi /etc/nginx/conf.d/tudv2.conf

Làm tương tự

server {
listen 80;
server_name tudv2.tudv.xyz;

access_log /var/log/nginx/tudv2.tudv.xyz-access.log;

error_log /var/log/nginx/tudv2.tudv.xyz-error.log;

root /home/tudv2/public_html;
index index.php index.html;

location / {
try_files $uri $uri/ =404;
}

location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/tudv2-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

Giải thích:

listen – cổng mà site sẽ lắng nghe. website1 listen trên port 80 nên sẽ ghi đè lên cấu hình mặc định của nginx.

server_name – Tên domain/sub của site

root – đường dẫn mã nguồn

fastcgi_pass – đường dẫn của file sock php-fpm

Kiểm tra lỗi:

nginx -t

Restart Nginx để áp dụng các thay đổi:

systemctl restart nginx

Test thử thêm vào các file index.php 1 đoạn thể hiện nội dung để xem sự hoạt động của php-fpm

vi /home/tudv1/public_html/index.php

php-fpm.conf : error_log = /var/log/php-fpm/fpm-error.log  : trạng thái rảnh rỗi của pool , sẵn sàng điều worker xử lý  request

Phân quyền cho php-fpm.sock

chmod 666 /var/run/tudv1-fpm.sock
chmod 666 /var/run/tudv2-fpm.sock

chown nginx:nginx /var/run/tudv1-fpm.sock
chown nginx:nginx /var/run/tudv2-fpm.sock

4-Cài đặt wordpress.

Tạo database name và user database  sử dụng cho wordpress

Đăng nhập vào mysql

mysql -u root -p

Nhập password đã tạo cho MariaDB server đã tạo trước đó

Tạo cơ sở dữ liệu

CREATE DATABASE tudv1;

Sau khi tạo xong cơ sở dữ liệu, ta cần tạo người dùng cho cơ sở dữ liệu đó.

CREATE USER tudv1@localhost IDENTIFIED BY ‘Pp098765a@1’;

Tại thời điểm này, ta đã tạo một người dùng cơ sở dữ liệu, tuy nhiên ta vẫn chưa cấp cho người dùng đó quyền truy cập vào cơ sở dữ liệu. Có thể thêm các quyền đó bằng lệnh sau:

GRANT ALL PRIVILEGES ON tudv1.* TO tudv1@localhost IDENTIFIED BY ‘Pp098765a@1’;

Bây giờ người dùng có quyền truy cập vào cơ sở dữ liệu, ta cần xóa các đặc quyền để MySQL biết về những thay đổi đặc quyền gần đây mà ta đã thực hiện

FLUSH PRIVILEGES;

Tạo DB với site tudv2

CREATE DATABASE tudv2;

CREATE USER tudv2@localhost IDENTIFIED BY ‘Pp098765a@1’;

GRANT ALL PRIVILEGES ON tudv2.* TO tudv2@localhost IDENTIFIED BY ‘Pp098765a@1’;

FLUSH PRIVILEGES;

exit

Tải wordpress và copy vào /home/user public_html

yum install wget

mkdir /data && cd /data

wget http://wordpress.org/latest.tar.gz

Giải nén tệp vừa tải xuống

tar -xzvf latest.tar.gz

Chuyển wordpress vào public_html từng user

rsync -av /data/wordpress/* /home/tudv1/public_html

rsync -av /data/wordpress/* /home/tudv2/public_html

Khai báo kết nối database của wordpress mới tải về

cd /home/tudv1/public_html

Tạo tệp wp-config.php bằng cách sao chép tệp mẫu wp-config-sample.php mà WordPress đã cung cấp

cp wp-config-sample.php wp-config.php

Chỉnh sửa tệp wp-config.php mới với thông tin cơ sở dữ liệu chính xác mà ta đã tạo ở trên

vi wp-config.php

Thay đổi các giá trị DB_NAME, DB_USER, DB_PASSWORD thành các giá trị đã thiết lập ở trên

Làm tương tự với tudv2.

cd /home/tudv2/public_html

cp wp-config-sample.php wp-config.php

Chỉnh wp-config.php của user tudv2

Truy cập vào trang quản trị WordPress bằng cách thêm hậu tố /wp-admin vào sau tên miền http://tudv1.tudv.xyz/wp-admin/ , http://tudv1.tudv.xyz/wp-admin/ để tạo tài khoản admin, thông tin sở hữu website…

 

Tổng kết

Như vậy Nhân Hòa đã hướng dẫn các bạn cách dựng LEMP  trên CENTOS7.

Hy vọng bài viết này hữu ích với các bạn. Chúc các bạn thành công !

Nếu trong quá trình thực hiện theo hướng dẫn mà gặp phải vấn đề hoặc có điều gì thắc mắc thì bạn cứ để lại phản hồi bên dưới.

Xin chào các bạn và hẹn gặp lại các bạn trong các bài viết sau tại wiki.nhanhoa.com

 

Trả lời