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 (linux, 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.
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
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.
Tiến hành cài đặt nginx bằng lệnh:
apt install nginx
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
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
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
Note: Cài thư viện php mcrypt trên ubuntu 20.04: 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:
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ả.
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
Đặ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.
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 cài đặt MySQL 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.
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 !