Site icon Cung cấp dịch vụ Cloud VPS, Server, Hosting Việt Nam & Thế giới

Hướng dẫn cài đặt LEMP trên Ubuntu: Nginx, MySQL và PHP

Hướng dẫn cài đặt LEMP trên Ubuntu: Nginx, MySQL và PHP

LEMP là một trong những stack phổ biến nhất để triển khai website và ứng dụng web trên VPS hoặc Server Linux. Mô hình này kết hợp Linux, Nginx, MySQL và PHP để tạo thành một môi trường Web Server có hiệu năng tốt, dễ mở rộng và phù hợp với WordPress, Laravel, website PHP và nhiều hệ thống web khác.

Trong bài viết này, DataOnline hướng dẫn cách cài đặt LEMP trên Ubuntu theo mô hình thực tế, bao gồm Nginx, MySQL, PHP-FPM, cấu hình Virtual Host, Firewall, kiểm tra PHP và các bước bảo mật cần thiết sau khi cài đặt.

Lưu ý: Ubuntu 18.04 đã hết vòng đời hỗ trợ tiêu chuẩn. Nếu triển khai VPS hoặc Server mới, nên sử dụng Ubuntu 24.04 LTS hoặc phiên bản Ubuntu LTS đang được hỗ trợ. Các lệnh trong bài được xây dựng theo môi trường Ubuntu hiện đại, giúp phù hợp hơn với hệ thống triển khai mới.

Mục lục nội dung

Toggle

LEMP là gì?

LEMP là một Web Stack gồm 4 thành phần chính:

Tên gọi LEMP xuất phát từ Nginx được phát âm gần giống “Engine-X”, do đó chữ cái đại diện cho Nginx được sử dụng là E thay vì N.

Mô hình hoạt động cơ bản:

Client
   |
   | HTTP / HTTPS
   |
   v
Nginx
   |
   | PHP Request
   v
PHP-FPM
   |
   | Database Query
   v
MySQL

Nginx tiếp nhận kết nối từ người dùng, xử lý các nội dung tĩnh như HTML, CSS, JavaScript, hình ảnh và chuyển các request PHP sang PHP-FPM.

PHP-FPM xử lý mã PHP và kết nối tới MySQL khi ứng dụng cần đọc hoặc ghi dữ liệu.

DataOnline cung cấp sẵn LEMP được tối ưu khi Quý khách Thuê VPS. Quý khách lựa chọn LEMP với 1 nút bấm, hệ thống hoàn thành cài đặt trong 30s.

LEMP phù hợp với những website nào?

LEMP có thể được sử dụng cho nhiều loại hệ thống:

Đối với VPS có cấu hình từ thấp đến trung bình, Nginx thường là lựa chọn phù hợp nhờ khả năng xử lý nhiều kết nối đồng thời và mức sử dụng tài nguyên hợp lý.

Cài đặt LEMP trên Ubuntu

Bước 1: Cập nhật hệ thống

Trước khi cài đặt, nên cập nhật package index và các gói hệ thống:

sudo apt update
sudo apt upgrade -y

Kiểm tra phiên bản Ubuntu:

cat /etc/os-release

Hoặc:

lsb_release -a

Đối với server mới, nên ưu tiên Ubuntu LTS được hỗ trợ lâu dài.

Bước 2: Cài đặt Nginx

Nginx đảm nhiệm vai trò Web Server.

Cài đặt bằng:

sudo apt install nginx -y

Kiểm tra trạng thái:

sudo systemctl status nginx

Nếu Nginx đang hoạt động, kết quả sẽ hiển thị trạng thái tương tự:

Active: active (running)

Thiết lập Nginx tự động khởi động cùng hệ thống:

sudo systemctl enable nginx

Khởi động Nginx nếu dịch vụ chưa chạy:

sudo systemctl start nginx

Bước 3: Kiểm tra Nginx

Kiểm tra các port đang được Nginx sử dụng:

sudo ss -lntp | grep nginx

Thông thường:

0.0.0.0:80
[::]:80

Điều này cho biết Nginx đang lắng nghe HTTP trên port 80.

Lấy địa chỉ IP public của server:

curl -4 ifconfig.me

Sau đó mở trình duyệt:

http://IP-SERVER

Nếu Nginx hoạt động bình thường, trình duyệt sẽ hiển thị trang mặc định của Nginx.

Bước 4: Cấu hình Firewall

Nếu Ubuntu sử dụng UFW, cần cho phép các port cần thiết.

Kiểm tra trạng thái:

sudo ufw status

Cho phép SSH:

sudo ufw allow OpenSSH

Cho phép HTTP:

sudo ufw allow 80/tcp

Cho phép HTTPS:

sudo ufw allow 443/tcp

Sau đó bật UFW:

sudo ufw enable

Kiểm tra:

sudo ufw status verbose

Một cấu hình cơ bản có thể gồm:

22/tcp    ALLOW
80/tcp    ALLOW
443/tcp   ALLOW

Không nên mở toàn bộ port trên VPS nếu không cần thiết.

Bước 5: Cài đặt MySQL

MySQL được sử dụng để lưu trữ dữ liệu cho website và ứng dụng.

Cài đặt:

sudo apt install mysql-server -y

Kiểm tra dịch vụ:

sudo systemctl status mysql

Nếu MySQL chưa chạy:

sudo systemctl start mysql

Cho MySQL tự động khởi động khi server reboot:

sudo systemctl enable mysql

Kiểm tra phiên bản:

mysql --version

Bước 6: Bảo mật MySQL

Sau khi cài đặt MySQL, nên chạy công cụ bảo mật:

sudo mysql_secure_installation

Tùy phiên bản MySQL, hệ thống có thể hỏi một số tùy chọn bảo mật.

Nên kiểm tra và xử lý các nội dung như:

Không nên mở MySQL port 3306 trực tiếp ra Internet nếu website và database chạy trên cùng một server.

Thông thường ứng dụng chỉ cần kết nối:

localhost:3306

hoặc:

127.0.0.1:3306

Nếu bắt buộc phải cho máy chủ khác truy cập MySQL, nên giới hạn bằng Firewall và chỉ cho phép IP tin cậy.

Bước 7: Kiểm tra MySQL

Đăng nhập MySQL:

sudo mysql

Kiểm tra:

SELECT VERSION();

Thoát:

exit;

Nếu hệ thống sử dụng xác thực bằng mật khẩu:

mysql -u root -p

Bước 8: Tạo Database cho Website

Không nên sử dụng tài khoản root cho ứng dụng website.

Ví dụ tạo database:

CREATE DATABASE website_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Tạo user:

CREATE USER 'website_user'@'localhost' IDENTIFIED BY 'MatKhauRatManh';

Cấp quyền:

GRANT ALL PRIVILEGES ON website_db.* TO 'website_user'@'localhost';

Áp dụng:

FLUSH PRIVILEGES;

Kiểm tra:

SHOW DATABASES;

Thoát:

exit;

Cách phân quyền này tốt hơn việc cho website sử dụng tài khoản MySQL root.

Cài đặt PHP và PHP-FPM

Bước 9: Cài đặt PHP

Nginx không xử lý PHP trực tiếp. Vì vậy cần cài PHP-FPM.

Trên Ubuntu LTS hiện đại, có thể cài:

sudo apt install php-fpm php-mysql -y

Kiểm tra PHP:

php -v

Kiểm tra PHP-FPM:

systemctl status php8.3-fpm

Tên service có thể thay đổi tùy phiên bản PHP đang được Ubuntu cung cấp.

Kiểm tra các phiên bản PHP-FPM:

systemctl list-units --type=service | grep php

Bước 10: Cài thêm các PHP Extension phổ biến

Đối với WordPress, Laravel và nhiều ứng dụng PHP, nên cài thêm một số extension:

sudo apt install php-cli php-curl php-gd php-mbstring php-xml php-zip php-intl php-bcmath php-soap -y

Kiểm tra các extension:

php -m

Một số ứng dụng có thể yêu cầu thêm extension riêng. Không nên cài tất cả extension nếu website không sử dụng.

Bước 11: Kiểm tra PHP-FPM

Kiểm tra socket:

ls -la /run/php/

Ví dụ:

php8.3-fpm.sock

Socket này sẽ được Nginx sử dụng để chuyển request PHP cho PHP-FPM.

Kiểm tra PHP-FPM đang listen:

sudo ss -lx | grep php

Nếu sử dụng phiên bản PHP khác, đường dẫn socket sẽ thay đổi.

Cấu hình Nginx chạy PHP

Bước 12: Tạo thư mục Website

Ví dụ domain:

example.com

Tạo thư mục:

sudo mkdir -p /var/www/example.com/public

Phân quyền:

sudo chown -R $USER:$USER /var/www/example.com

Tạo file HTML kiểm tra:

nano /var/www/example.com/public/index.html

Nội dung:

<!DOCTYPE html>
<html>
<head>
    <title>Example.com</title>
</head>
<body>
    <h1>LEMP Server is working</h1>
</body>
</html>

Bước 13: Tạo Virtual Host cho Nginx

Ubuntu sử dụng hai thư mục phổ biến:

/etc/nginx/sites-available/
/etc/nginx/sites-enabled/

Tạo cấu hình:

sudo nano /etc/nginx/sites-available/example.com

Nội dung:

server {
    listen 80;
    listen [::]:80;

    server_name example.com www.example.com;

    root /var/www/example.com/public;

    index index.php index.html;

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

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}

Thay:

example.com

bằng domain thực tế.

Nếu phiên bản PHP-FPM khác 8.3, cần thay đường dẫn:

/run/php/php8.3-fpm.sock

bằng socket tương ứng.

Bước 14: Kích hoạt Website

Tạo symbolic link:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com

Kiểm tra cấu hình:

sudo nginx -t

Nếu kết quả:

syntax is ok
test is successful

thì có thể reload Nginx:

sudo systemctl reload nginx

Bước 15: Tắt Website mặc định của Nginx

Nếu không sử dụng cấu hình mặc định:

sudo rm /etc/nginx/sites-enabled/default

Kiểm tra lại:

sudo nginx -t

Sau đó:

sudo systemctl reload nginx

Kiểm tra PHP trên Nginx

Bước 16: Tạo file phpinfo

Tạo:

sudo nano /var/www/example.com/public/info.php

Thêm:

<?php
phpinfo();

Truy cập:

http://example.com/info.php

Nếu xuất hiện trang thông tin PHP, điều đó cho thấy:

Nginx
   |
   v
PHP-FPM
   |
   v
PHP

đang hoạt động bình thường.

Sau khi kiểm tra xong, phải xóa file:

sudo rm /var/www/example.com/public/info.php

Không nên để phpinfo() tồn tại trên website production vì trang này có thể tiết lộ nhiều thông tin về môi trường máy chủ.

Cấu hình DNS cho Domain

Để website hoạt động bằng domain, cần tạo DNS record trỏ domain về IP VPS.

Ví dụ:

Type: A
Name: @
Value: IP-VPS

Và:

Type: A
Name: www
Value: IP-VPS

Có thể kiểm tra:

dig example.com

Hoặc:

nslookup example.com

Kết quả cần trả về đúng địa chỉ IP của VPS.

Nếu sử dụng Cloudflare hoặc DNS Provider khác, cần đảm bảo bản ghi DNS được cấu hình chính xác.

Cài đặt SSL HTTPS cho Nginx

Website production không nên chỉ sử dụng HTTP.

HTTPS giúp:

Có thể sử dụng Let’s Encrypt để cấp chứng chỉ TLS miễn phí.

Cài Certbot:

sudo apt install certbot python3-certbot-nginx -y

Sau đó:

sudo certbot --nginx -d example.com -d www.example.com

Certbot có thể tự động cấu hình HTTPS cho Virtual Host Nginx.

Kiểm tra chứng chỉ:

sudo certbot certificates

Kiểm tra tự động gia hạn:

sudo systemctl status certbot.timer

Có thể chạy thử:

sudo certbot renew --dry-run

Cấu hình quyền thư mục Website

Một trong những vấn đề thường gặp khi triển khai PHP là quyền truy cập file.

Kiểm tra:

ls -lah /var/www/example.com/public

Không nên tùy tiện sử dụng:

chmod -R 777 /var/www/example.com

Đây là cấu hình không an toàn và có thể tạo ra rủi ro bảo mật.

Nên cấp quyền theo đúng nhu cầu của ứng dụng.

Đối với WordPress, Laravel hoặc ứng dụng PHP có khả năng upload file, cần đặc biệt chú ý đến quyền ghi của thư mục:

uploads
storage
cache
bootstrap/cache

tùy theo framework hoặc ứng dụng.

Tối ưu PHP-FPM

PHP-FPM sử dụng process để xử lý request PHP.

Có thể kiểm tra cấu hình pool:

sudo nano /etc/php/8.3/fpm/pool.d/www.conf

Một số thông số quan trọng:

pm = dynamic
pm.max_children = 20
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 6

Các giá trị trên chỉ mang tính tham khảo.

Không nên đặt pm.max_children quá cao chỉ vì VPS có nhiều CPU.

Cần tính toán dựa trên:

Có thể kiểm tra mức sử dụng RAM:

free -h

Kiểm tra CPU:

top

hoặc:

htop

Bật OPcache cho PHP

OPcache giúp PHP lưu bytecode đã biên dịch trong bộ nhớ, từ đó giảm thời gian xử lý request.

Kiểm tra:

php -m | grep -i opcache

Nếu chưa có:

sudo apt install php-opcache -y

Sau khi thay đổi cấu hình PHP-FPM:

sudo systemctl restart php8.3-fpm

OPcache đặc biệt hữu ích đối với WordPress, Laravel và các ứng dụng PHP có nhiều request.

Tối ưu Nginx cơ bản

Có thể kiểm tra cấu hình Nginx:

sudo nginx -t

Các thông số quan trọng thường nằm trong:

/etc/nginx/nginx.conf

Ví dụ cấu hình worker:

worker_processes auto;

Nginx có thể tự xác định số worker phù hợp với CPU.

Đối với server có nhiều website và traffic lớn, có thể tiếp tục tối ưu:

Không nên sao chép một cấu hình tối ưu trên Internet vào production mà không kiểm tra tài nguyên và workload thực tế.

Cấu hình Cache cho Website PHP

Một LEMP Stack cơ bản mới chỉ xử lý request. Để website có tốc độ tốt hơn, có thể bổ sung nhiều tầng cache.

Mô hình:

Client
   |
Nginx
   |
Cache
   |
PHP-FPM
   |
MySQL

Các loại cache phổ biến:

Đối với WordPress, Redis có thể được sử dụng làm Object Cache để giảm số lượng truy vấn trực tiếp tới MySQL.

Kiểm tra các thành phần của LEMP

Sau khi hoàn tất, có thể kiểm tra lần lượt.

Kiểm tra Linux

cat /etc/os-release

Kiểm tra Nginx

nginx -v

và:

systemctl status nginx

Kiểm tra MySQL

mysql --version

và:

systemctl status mysql

Kiểm tra PHP

php -v

Kiểm tra PHP-FPM

systemctl status php8.3-fpm

Kiểm tra port

sudo ss -lntup

Các port thường gặp:

22    SSH
80    HTTP
443   HTTPS
3306  MySQL

Không nên mở port 3306 ra Internet nếu ứng dụng không cần truy cập MySQL từ bên ngoài.

Kiểm tra log Nginx

Khi website bị lỗi, nên kiểm tra log trước khi thay đổi cấu hình.

Access log:

sudo tail -f /var/log/nginx/access.log

Error log:

sudo tail -f /var/log/nginx/error.log

Đối với Virtual Host:

sudo tail -f /var/log/nginx/example.com.error.log

nếu website được cấu hình log riêng.

Kiểm tra log PHP-FPM

Có thể sử dụng:

sudo journalctl -u php8.3-fpm

Theo dõi realtime:

sudo journalctl -u php8.3-fpm -f

Nếu PHP không chạy, cần kiểm tra:

Một số lỗi thường gặp khi cài LEMP

Lỗi 502 Bad Gateway

Đây là lỗi phổ biến khi Nginx không kết nối được PHP-FPM.

Kiểm tra:

systemctl status php8.3-fpm

Kiểm tra socket:

ls -lah /run/php/

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

sudo nginx -t

Đảm bảo:

fastcgi_pass unix:/run/php/php8.3-fpm.sock;

trỏ đúng socket thực tế.

Lỗi 403 Forbidden

Có thể do:

Kiểm tra:

ls -lah /var/www/example.com/public

và:

sudo tail -f /var/log/nginx/error.log

Lỗi 404 Not Found

Kiểm tra:

root /var/www/example.com/public;

có đúng thư mục chứa website hay không.

Kiểm tra:

ls -lah /var/www/example.com/public

Nếu sử dụng Laravel hoặc WordPress, cần kiểm tra thêm cấu hình try_files.

Lỗi Nginx không khởi động

Chạy:

sudo nginx -t

Nếu có lỗi:

nginx: [emerg]

hãy sửa lỗi cấu hình trước khi restart.

Sau đó:

sudo systemctl restart nginx

Website chạy HTML nhưng PHP không chạy

Kiểm tra:

php -v

Sau đó:

systemctl status php8.3-fpm

và kiểm tra cấu hình:

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}

Bảo mật VPS sau khi cài LEMP

Cài LEMP xong chưa có nghĩa là VPS đã được bảo mật hoàn chỉnh.

Nên thực hiện thêm các bước:

Sử dụng SSH Key

Hạn chế sử dụng mật khẩu SSH khi có thể.

Có thể tạo SSH key trên máy quản trị:

ssh-keygen

Sau đó cấu hình SSH sử dụng key.

Hạn chế SSH

Nếu không cần SSH từ mọi nơi, có thể giới hạn port 22 bằng Firewall hoặc chỉ cho phép các IP quản trị.

Cập nhật hệ thống

Định kỳ:

sudo apt update
sudo apt upgrade

Không mở các port không cần thiết

Kiểm tra:

sudo ss -lntup

Chỉ nên expose các dịch vụ cần thiết.

Không cho MySQL truy cập trực tiếp từ Internet

Kiểm tra MySQL:

sudo ss -lntp | grep 3306

Nếu chỉ sử dụng local database, nên để MySQL listen trên localhost.

Xóa file test

Không để lại:

info.php
phpinfo.php
test.php

trên website production.

LEMP khác gì so với LAMP?

LEMP và LAMP đều là Web Stack phổ biến.

Thành phần LEMP LAMP
Linux
Web Server Nginx Apache
Database MySQL/MariaDB MySQL/MariaDB
PHP PHP-FPM PHP/Apache PHP
Hiệu năng kết nối đồng thời Tốt Tốt
Reverse Proxy Rất phù hợp Có thể triển khai
.htaccess Không hỗ trợ trực tiếp Hỗ trợ
WordPress Phù hợp Phù hợp
Laravel Phù hợp Phù hợp

Một điểm quan trọng là Nginx không hỗ trợ .htaccess như Apache.

Do đó khi chuyển website từ Apache sang Nginx, những rule trong .htaccess cần được chuyển sang cấu hình Nginx tương ứng.

LEMP có phù hợp để chạy WordPress không?

Có.

LEMP là một trong những lựa chọn phổ biến để chạy WordPress trên VPS.

Mô hình:

Nginx
  |
PHP-FPM
  |
WordPress
  |
MySQL

Để tối ưu WordPress, có thể bổ sung:

Đối với website có traffic cao, việc tối ưu toàn bộ stack thường mang lại hiệu quả lớn hơn việc chỉ tăng CPU hoặc RAM.

LEMP có phù hợp với Laravel không?

Laravel hoạt động tốt trên Nginx và PHP-FPM.

Đối với Laravel, Document Root nên trỏ tới:

/public

thay vì thư mục gốc của source code.

Ví dụ:

/var/www/example.com/
├── app/
├── bootstrap/
├── config/
├── database/
├── public/
├── resources/
├── routes/
└── storage/

Nginx nên sử dụng:

root /var/www/example.com/public;

Cách này giúp tránh việc các file cấu hình hoặc source code bên ngoài thư mục public bị truy cập trực tiếp từ Internet.

Khi nào nên sử dụng LEMP?

LEMP phù hợp nếu bạn cần:

Nếu muốn quản lý nhiều website bằng giao diện trực quan thay vì tự cấu hình Nginx, PHP-FPM và MySQL bằng command line, có thể cân nhắc sử dụng các control panel như DirectAdmin hoặc các giải pháp quản trị Server tương ứng.

Checklist triển khai LEMP Production

Trước khi đưa website vào hoạt động chính thức, nên kiểm tra:

[ ] Ubuntu đã được cập nhật
[ ] Nginx hoạt động
[ ] MySQL hoạt động
[ ] PHP-FPM hoạt động
[ ] Domain trỏ đúng IP
[ ] Virtual Host cấu hình đúng
[ ] nginx -t không báo lỗi
[ ] Firewall chỉ mở port cần thiết
[ ] SSH được bảo vệ
[ ] MySQL không public nếu không cần
[ ] SSL/HTTPS đã cấu hình
[ ] PHP OPcache đã bật
[ ] Quyền thư mục đúng
[ ] Đã xóa phpinfo()
[ ] Đã kiểm tra Nginx access log
[ ] Đã kiểm tra Nginx error log
[ ] Đã kiểm tra PHP-FPM log
[ ] Đã thiết lập backup
[ ] Đã có phương án khôi phục dữ liệu

Kết luận

LEMP là một nền tảng Web Server mạnh, linh hoạt và phù hợp với nhiều loại website PHP. Với mô hình Nginx, PHP-FPM và MySQL, VPS có thể đáp ứng tốt từ website cá nhân, WordPress, blog cho đến các ứng dụng web có lượng truy cập lớn hơn.

Quy trình triển khai cơ bản gồm:

Ubuntu
   |
Nginx
   |
PHP-FPM
   |
MySQL
   |
Website

Tuy nhiên, cài đặt LEMP chỉ là bước đầu. Đối với VPS production, cần tiếp tục cấu hình HTTPS, Firewall, SSH, quyền file, OPcache, backup, monitoring và các cơ chế cache phù hợp.

Nếu đang triển khai một VPS mới, nên sử dụng Ubuntu LTS được hỗ trợ thay vì Ubuntu 18.04 đã hết vòng đời. Việc lựa chọn phiên bản hệ điều hành còn được hỗ trợ giúp máy chủ nhận được các bản vá bảo mật và thuận lợi hơn khi nâng cấp PHP, Nginx, MySQL cũng như các phần mềm ứng dụng về sau.

Exit mobile version