Hướng dẫn cài đặt LEMP stack trên Ubuntu 20.04

Lời mở đầu

Chào các bạn, Trong bài này mình sẽ cài đặt LEMP stack trên Ubuntu 20.04. Mình cũng test thành công trên Ubuntu 20.10. Ngoài ra ếu bạn muốn cài trên centos, Debian thì xem các bài viết sau:

 

LEMP là gì? – Đây là viết tắt của (, EngineX, MySQL, PHP) là  môi trường nền linux với webserver Nginx với PHP và MySQL để sử dụng cho các ứng dụng như WordPress, forum.v.v. Một Stack thường dùng khác là LAMP stack (Linux, APACHE, MySQL, PHP) cũng được hướng dẫn trong blog này, mời bạn tìm đọc.

Bước 1: Chuẩn bị Server để cài đặt LEMP stack trên Ubuntu 20.04

Yêu cầu tối thiểu: Server chạy Ubuntu 20.x 64 bit, 1CPU, 1GB ram, 1 Network Card và kết nối internet. Trong bài tôi sử dụng VMware với cấu hình sau:
CPU: 2 Core

RAM: 4GB

SSD: 30GiB

OS: Ubuntu 20.04 LTS. Link tải: https://ubuntu.com/download/server

Chúng ta sang bước 2: Hướng dẫn cài đăt :), bắt tay vào việc thôi nào!

Bước 2: Cài đặt Nginx, MySQL, PHP trên Ubuntu 20.04 LTS

Note: Trong bài viết tôi luôn đang nhập server bằng user root vì các lệnh cài đặt yêu cầu quyền quản trị root. Với một số bạn khi cài đặt trên môi trường server thực có thể không được phép remote login bằng root t hì phải chuyển qua user root bằng cách gõ lệnh:

su -

Sau khi nhập mật khẩu root sẽ được sử dụng quyền root để cài đặt. Bạn cũng có thể thêm sudo vào trước mỗi câu lệnh nếu hệ thống đã cài sudo và cấp quyền cho user của bạn.

Sử dụng su - command để chuyển sang root user

1. Update server trước khi bắt đầu cài đặt LEMP stack trên Ubuntu 20.04

Đầu tiên bạn cần update server đẻ nhận các gói cài đặt mới nhất. Sử dụng lệnh sau:

apt update -y

2. Cài đặt nginx webserver:

Bước tiếp theo là cài nginx web server. Bạn có thể kiểm tra phiên bản nginx sắp cài bằng lệnh:

apt list nginx* | grep nginx

lệnh kiểm tra gói cài đặt nginx mặc định

Phiên bản hiện tại được cung cấp từ repository mặc định của Ubuntu là nginx-1.18.0 (Bản nginx stable mới nhất). Nếu muốn cài phiên bản khác bạn có thể vào : https://nginx.org để tải và cài đăt.

Xem tiếp:   Hướng dẫn tiết kiệm pin cho Iphone bạn không thể bỏ qua

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

apt install nginx

Confirm install nginx to ubuntu cài đặt LEMP stack trên Ubuntu 20.04

Bấm y và enter, nginx sẽ được cài đặt vào server.

Sau khi quá trình tải và cài đặt kết thúc, ta cấu hình cho nginx tự chạy mỗi khi khởi động máy:

systemctl enable nginx
systemctl start nginx

Kiểm tra trạng thái nginx:

systemctl status nginx

Nginx trong cài đặt LEMP stack trên Ubuntu 20.04

Vậy là nginx đã được cài đặt thành công trên ubuntu 20.04. Ta chuyển sang bước cài PHP

3. Cài PHP7.4 trên ubuntu 20.04

Bản PHP7.4 được coi là ổn định nhất hiện nay. Bản PHP này được cung cấp mặc định trên Ubuntu 20.04. Bạn có thể kiểm tra bằng lệnh:

apt list php7.4* | grep php7.4

list các gói php7.4 cung cấp bởi Ubuntu

Bạn có thể thấy php có rất nhiều các module bổ xung. Trong thực tế thường dùng các module sau:

php7.4 php7.4-fpm php7.4-curl php7.4-gd php7.4-json php7.4-mbstring php-pear php7.4-dev libmcrypt-dev php7.4-tidy php7.4-mysqlnd php7.4-cli php7.4-soap php7.4-redis php7.4-memcache php7.4-memcached php7.4-imagick php7.4-geoip php7.4-apcu php7.4-bcmath php7.4-zip

Để cài đặt, ta sử dụng lệnh sau:

apt install php7.4 php7.4-fpm php7.4-curl php7.4-gd php7.4-json php7.4-mbstring php-pear php7.4-dev libmcrypt-dev php7.4-tidy php7.4-mysqlnd php7.4-cli php7.4-soap php7.4-redis php7.4-memcache php7.4-memcached php7.4-imagick php7.4-geoip php7.4-apcu php7.4-bcmath php7.4-zip

Kiểm tra kết quả cài đặt:

php7.4 -v

php-fpm7.4 -v

systemctl status php7.4-fpm.service

 cài đặt LEMP stack trên Ubuntu 20.04

Note: : Thư viện php mcrypt phiên bản 7.4 không được cung cấp mặc định qua gói cài đặt. Ta phải cài nó thông qua pear (pecl).

Kiểm tra gói cài bằng lệnh:

which pecl

pecl search mcrypt

 

Cài đặt thư viện php mcrypt bằng lệnh:

pecl install mcrypt

Bấm enter tại dấu nhắc:

Cấu hình đưa thư viện vào file php.ini:

echo "extension=mcrypt.so" >> /etc/php/7.4/fpm/php.ini

Khởi động lại php7.4-fpm:

systemctl restart php7.4-fpm.service

Kiểm tra module được load thành công chưa:

php-fpm7.4 -i | grep mcrypt

Kết quả: Thành công.

4. Cấu hình php-fpm

Ở bước này ta sẽ cấu hình php-fpm để sử dụng với nginx. Mặc định php-fpm sử dụng unix socket. Tuy nhiên tôi thường sử dụng port 9000 cho dịch vụ này để dễ debug.

các file cấu hình php-fpm7.4 trên Ubuntu 20.04 được lưu tại vị trí sau:

File config chính: /etc/php/7.4/fpm/php-fpm.conf

Sửa file trên bằng trình soạn thảo yêu thích của bạn với nội dung sau:

;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;
include=/etc/php/7.4/fpm/pool.d/*.conf
[global]
pid = /run/php/php7.4-fpm.pid
error_log = /var/log/php7.4-fpm/error.log
daemonize = yes

File config cho các pool: /etc/php/7.4/fpm/pool.d/www.conf

[www]
;comment port 9000 if using socket
listen = 127.0.0.1:9000
;comment socket if using port
;listen = /var/run/php-fpm/default.sock
listen.allowed_clients = 127.0.0.1
listen.owner = www-data
listen.group = www-data 
user = www-data
group = www-data
pm = ondemand
pm.max_children = 20
; default: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 15
pm.max_requests = 500
pm.status_path = /php_status
request_terminate_timeout = 100s
pm.process_idle_timeout = 10s;
request_slowlog_timeout = 4s
slowlog = /var/log/php7.4-fpm/php-fpm-slow.log
rlimit_files = 131072
rlimit_core = unlimited
catch_workers_output = yes
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
php_admin_value[error_log] = /var/log/php7.4-fpm/admin-php-fpm-error.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session

Tạo foler log:

mkdir -p /var/log/php7.4-fpm/

Khởi động lại php-fpm:

systemctl restart php74-fpm.service

5. Cấu hình nginx sử dụng php-fpm

Sửa file /etc/nginx/nginx.conf với cấu hình như sau:

# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/

user www-data;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
#include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 1024;
use epoll;
multi_accept on;

}

http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log off;
#access_log /var/log/nginx/access.log main;

#SSL complaint
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA HIGH !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
ssl_session_tickets off;

#limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
#limit_conn_status 444;
#limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=50r/s;
#limit_req_status 444;

sendfile on;
tcp_nopush on;
tcp_nodelay on;
types_hash_max_size 2048;
client_body_buffer_size 16K;
client_header_buffer_size 1k;
client_max_body_size 128m;
large_client_header_buffers 4 8k;
client_body_timeout 24;
client_header_timeout 24;
keepalive_timeout 25;
send_timeout 10;

include /etc/nginx/mime.types;
default_type application/octet-stream;

# For sercurity, Hide Nginx Server Tokens/version Number

server_tokens off;

#turn Gzip On
gzip on;
gzip_static on;
gzip_disable "MSIE [1-6]\.";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_min_length 1000;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

# File cache
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 5;
open_file_cache_errors off;

# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;

}

Tạo file /etc/nginx/conf.d/php-fpm.conf

# PHP-FPM FastCGI server
# network or unix domain socket configuration

upstream php-fpm {
server 127.0.0.1:9000;
#server unix:/run/php-fpm/www.sock;
}

Tạo file test nginx: /etc/nginx/conf.d/test.conf

server {
listen 80;
access_log off;
error_log off;

root /home/test/html;
index index.php index.htm index.html;


location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_intercept_errors on;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 256k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;

fastcgi_pass php-fpm;
}

}

Kiểm tra cấu hình nginx:

nginx -t

Khởi động lại nginx để cập nhật cấu hình mới:

systemctl restart nginx.service

systemctl status nginx.service

Kiểm tra nginx hoạt động tốt với php chưa:

Xem tiếp:   Cách sử dụng JSON.parse () và JSON.stringify ()

tạo folder: /home/test/html để chứa file php:

mkdir -p /home/test/html

tạo file info.php:

echo "<?php phpinfo(); ?>" > /home/test/html/info.php

Truy cập vào địa chỉ http://[your_server_ip]/info.php để xem kết quả.

Kiểm tra phpinffo sau khi cài đặt LEMP stack trên Ubuntu 20.04

Note: Nếu không truy cập được và báo timeout, có thể bạn chưa mở port http (80). Bạn phải mở port 80 trên Ubuntu. Lệnh mở port :

ufw allow 80

ufw reload

6. Cài MySQL trên ubuntu 20.04

Hiện tải có nhiều phiên bản MySql để bạn sử dụng, thông dụng nhất là mariadb có sẵn trên repository của Ubuntu. Kiểm tra như sau:

apt list mariadb-server

 

Cài Mariadb-server bằng lệnh:

apt install mariadb-server

 

Sau khi cài đặt, mariadb tự động chạy khi khởi động. Bạn kiểm tra trạng thái dịch vụ bằng lệnh:

systemctl status mariadb.service

 

Kiểm tra mariadb đã chạy chưa trong cài đặt LEMP stack trên Ubuntu 20.04

Đặt mật khẩu root cho MySql server.

Mặc định mật khẩu là ký tự rỗng. Để bảo mật ta đặt mật khẩu và xóa test database. Việc này dễ thực hiện bằng công cụ có sẵn sau khi cài:

chạy lệnh sau:

mysql_secure_installation

 

Ở bước này ta nhập mật khẩu root,  mặc định là ký tự rỗng nên ta gõ Enter luôn:

Ở bước này Hệ thống hỏi có đặt mật khâu root cho SQL không, bạn chọn Y hoặc bấm Enter (măc định là Y). Nhập mật khẩu root bạn muốn đặt vào. Bạn nên sử dụng mật khẩu có độ MẠNH cao. Ví dụ: Từ 6 ký tự trở lên, bao gồm Chữ Hoa, Chữ Thường, Số và ký tự đặc biệt.

Xem tiếp:   Các trường hợp không gõ được tiếng Việt trên windows và cách khắc phục.

Bước này, Hệ thống hỏi có xóa hết các user khác ngoài root không. Bạn nên chọn xóa hết. => bấm Y và Enter

Bước này hỏi bạn có cho đăng nhập root từ máy khác hay không. Để bảo mật bạn nên chọn Y cấm user root đăng nhập từ remote IP.

Xóa test Database.

Bước  cuối cùng: cập nhật lại quyền trong SQL. Bấm Y và Enter. Vậy là bạn đã hoàn thành bước trên Ubuntu 20.04

Bạn có thể login vào MySQL từ dòng lệnh:

mysql -u root -p

 

Nhập mật khẩu đã tạo ở bước trên.

Mariadb 10.3 - cài đặt LEMP stack trên Ubuntu 20.04

Vậy là MySQL đã được cài đặt thành công và khởi chạy đúng cách.

Tổng kết

Qua các bước trên, toiyeuit.com đã hướng dẫn bạn chi tiết từng bước để cài đặt LEMP stack trên Ubuntu 20.04. Hy vọng bài viêt hữu ích với các bạn. Nếu có thắc mắc hay có bài viết hay bổ xung mời bạn để lại lời nhắn dưới phần bình luận.

Xem thêm: Hướng dẫn cài đặt WordPress trên Centos 7

Chúc các bạn sức khỏe !

 

Check Also

Cách cung cấp các ứng dụng Flask với Gunicorn và Nginx trên Ubuntu

Giới thiệu Trong hướng dẫn này, bạn sẽ xây dựng một ứng dụng python bằng …