
Hướng dẫn cài đặt LEMP Stack hoàn chỉnh (2025)
Sơ đồ trang
- Cách hoạt động:
- Ưu điểm của LEMP:
- Yêu cầu hệ thống
- 1. Cấu hình tường lửa (UFW)
- 1.1. Cài đặt và kích hoạt UFW
- 1.2. Thay đổi cổng SSH (tùy chọn nhưng khuyến khích)
- 1.3. Cấu hình firewall rules
- 2. Cài đặt Nginx
- 2.1. Cài đặt Nginx từ repository chính thức
- 2.2. Kiểm tra Nginx hoạt động
- 3. Cài đặt MariaDB
- 3.1. Cài đặt MariaDB 10.11 LTS
- 3.2. Bảo mật MariaDB
- 4. Cài đặt PHP
- 4.1. Thêm repository PHP
- 4.2. Cài đặt nhiều phiên bản PHP
- 4.3. Kiểm tra cài đặt
- 4.4. Tối ưu PHP-FPM
- 5. Cài đặt phpMyAdmin
- 5.1. Cài đặt phpMyAdmin từ source
- 5.2. Cấu hình Nginx cho phpMyAdmin
- 6. Cài đặt SSL với Let's Encrypt
- 6.1. Cài đặt Certbot
- 6.2. Lấy chứng chỉ SSL
- 6.3. Tự động gia hạn SSL
- 7. Cài đặt ModSecurity WAF
- 7.1. Cài đặt dependencies
- 7.2. Compile ModSecurity v3
- 7.3. Compile ModSecurity Nginx Connector
- 7.4. Compile Nginx với ModSecurity
- 7.5. Cấu hình ModSecurity
- 7.6. Cài đặt OWASP Core Rule Set
- 7.7. Kích hoạt ModSecurity trong Nginx
- 8. Tối ưu và bảo mật
- 8.1. Tối ưu MariaDB
- 8.2. Bảo mật phpMyAdmin
- 8.3. Cấu hình Nginx security headers
- 9. Monitoring và bảo trì
- 9.1. Cài đặt monitoring tools
- 9.2. Tạo backup script
- 10. Kiểm tra và xử lý sự cố
- 10.1. Kiểm tra services
- 10.2. Các lỗi thường gặp
- Kết luận
LEMP Stack là một bộ công nghệ mã nguồn mở dùng để triển khai và chạy các ứng dụng web, tương tự như LAMP nhưng dùng Nginx thay vì Apache. Tên “LEMP” là từ viết tắt của các thành phần chính:
- L – Linux: Hệ điều hành nền tảng (Ubuntu, Debian, CentOS, AlmaLinux, v.v.).
- E – Nginx (phát âm là “Engine-X”): Web server hiệu suất cao thay thế Apache.
- M – MySQL (hoặc MariaDB): Hệ quản trị cơ sở dữ liệu dùng để lưu trữ dữ liệu website.
- P – PHP: Ngôn ngữ lập trình phía server xử lý logic và giao tiếp với cơ sở dữ liệu.
Cách hoạt động:
- Nginx tiếp nhận yêu cầu HTTP từ người dùng.
- Nếu là file tĩnh (HTML, CSS, JS…), Nginx trả lại trực tiếp.
- Nếu là mã PHP, Nginx chuyển tiếp tới PHP-FPM (FastCGI Process Manager) để xử lý.
- PHP-FPM có thể tương tác với MySQL/MariaDB để truy xuất dữ liệu.
- Sau đó trả kết quả lại qua Nginx đến trình duyệt của người dùng.
Ưu điểm của LEMP:
- Hiệu suất cao hơn LAMP (vì Nginx xử lý non-blocking, scale tốt hơn).
- Tiêu tốn ít tài nguyên hơn Apache.
- Tùy biến linh hoạt, dễ mở rộng và bảo mật tốt nếu cấu hình đúng cách.
Bài viết này sẽ hướng dẫn bạn cài đặt LEMP Stack đầy đủ với:
- Nginx phiên bản mới nhất
- MariaDB 10.11 LTS
- Nhiều phiên bản PHP (8.1, 8.2, 8.3, 8.4)
- phpMyAdmin để quản lý database
- SSL miễn phí với Let’s Encrypt
- ModSecurity WAF để bảo vệ website
Yêu cầu hệ thống
- Hệ điều hành: Ubuntu 22.04/24.04 LTS hoặc Debian 11/12
- RAM: Tối thiểu 1GB (khuyến nghị 2GB)
- Ổ cứng: Tối thiểu 20GB
- Domain: Một domain để cài SSL (tùy chọn)
- Quyền: Root hoặc user có sudo
1. Cấu hình tường lửa (UFW)
1.1. Cài đặt và kích hoạt UFW
# Cập nhật hệ thống
sudo apt update && sudo apt upgrade -y
# Cài đặt UFW
sudo apt install ufw -y
# Kiểm tra trạng thái UFW
sudo ufw status verbose
1.2. Thay đổi cổng SSH (tùy chọn nhưng khuyến khích)
Để tăng cường bảo mật, nên đổi cổng SSH mặc định:
# Sao lưu file cấu hình SSH
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
# Chỉnh sửa cấu hình SSH
sudo nano /etc/ssh/sshd_config
Tìm và sửa dòng:
#Port 22
Thành:
Port 2222
(Bạn có thể dùng bất kỳ cổng nào từ 1024-65535)
# Khởi động lại SSH
sudo systemctl restart sshd
# QUAN TRỌNG: Mở một terminal mới và kiểm tra kết nối SSH với cổng mới
ssh -p 2222 username@your_server_ip
1.3. Cấu hình firewall rules
# Cho phép cổng SSH mới
sudo ufw allow 2222/tcp
# Cho phép HTTP và HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# Cấu hình mặc định: Chặn incoming, cho phép outgoing
sudo ufw default deny incoming
sudo ufw default allow outgoing
# Kích hoạt UFW
sudo ufw enable
# Kiểm tra các rule
sudo ufw status numbered
2. Cài đặt Nginx
2.1. Cài đặt Nginx từ repository chính thức
# Thêm repository Nginx chính thức
curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo apt-key add -
echo "deb http://nginx.org/packages/ubuntu $(lsb_release -cs) nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
# Cập nhật và cài đặt
sudo apt update
sudo apt install nginx -y
# Khởi động và enable Nginx
sudo systemctl start nginx
sudo systemctl enable nginx
# Kiểm tra phiên bản
nginx -v
2.2. Kiểm tra Nginx hoạt động
Mở trình duyệt và truy cập: http://your_server_ip
Bạn sẽ thấy trang Welcome to nginx!
Bài viết liên quan
3. Cài đặt MariaDB
3.1. Cài đặt MariaDB 10.11 LTS
# Thêm repository MariaDB 10.11
sudo apt-get install software-properties-common dirmngr apt-transport-https -y
sudo curl -LsS https://mariadb.org/mariadb_release_signing_key.asc | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64,arm64,ppc64el] https://mirror.mariadb.org/repo/10.11/ubuntu $(lsb_release -cs) main"
# Cài đặt MariaDB
sudo apt update
sudo apt install mariadb-server mariadb-client -y
# Khởi động và enable MariaDB
sudo systemctl start mariadb
sudo systemctl enable mariadb
3.2. Bảo mật MariaDB
sudo mysql_secure_installation
Trả lời các câu hỏi:
- Enter current password for root: Nhấn Enter (chưa có password)
- Switch to unix_socket authentication: N
- Change the root password: Y (nhập password mới)
- Remove anonymous users: Y
- Disallow root login remotely: Y
- Remove test database: Y
- Reload privilege tables: Y
4. Cài đặt PHP
4.1. Thêm repository PHP
# Thêm repository Ondrej PHP
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
4.2. Cài đặt nhiều phiên bản PHP
# PHP 8.1 (LTS)
sudo apt install -y php8.1-fpm php8.1-mysql php8.1-mbstring \
php8.1-xml php8.1-curl php8.1-zip php8.1-gd php8.1-intl \
php8.1-bcmath php8.1-soap php8.1-opcache php8.1-imagick \
php8.1-redis php8.1-memcached
# PHP 8.2 (Ổn định)
sudo apt install -y php8.2-fpm php8.2-mysql php8.2-mbstring \
php8.2-xml php8.2-curl php8.2-zip php8.2-gd php8.2-intl \
php8.2-bcmath php8.2-soap php8.2-opcache php8.2-imagick \
php8.2-redis php8.2-memcached
# PHP 8.3 (Ổn định mới nhất)
sudo apt install -y php8.3-fpm php8.3-mysql php8.3-mbstring \
php8.3-xml php8.3-curl php8.3-zip php8.3-gd php8.3-intl \
php8.3-bcmath php8.3-soap php8.3-opcache php8.3-imagick \
php8.3-redis php8.3-memcached
# PHP 8.4 (Mới nhất - Tùy chọn)
sudo apt install -y php8.4-fpm php8.4-mysql php8.4-mbstring \
php8.4-xml php8.4-curl php8.4-zip php8.4-gd php8.4-intl \
php8.4-bcmath php8.4-soap php8.4-opcache php8.4-imagick \
php8.4-redis php8.4-memcached
4.3. Kiểm tra cài đặt
# Kiểm tra các phiên bản PHP
php8.1 -v
php8.2 -v
php8.3 -v
php8.4 -v
# Đặt PHP 8.3 làm mặc định
sudo update-alternatives --set php /usr/bin/php8.3
4.4. Tối ưu PHP-FPM
Chỉnh sửa cấu hình cho từng phiên bản PHP:
# Ví dụ cho PHP 8.3
sudo nano /etc/php/8.3/fpm/php.ini
Tìm và sửa các giá trị sau:
memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 300
max_input_time = 300
max_input_vars = 5000
5. Cài đặt phpMyAdmin
5.1. Cài đặt phpMyAdmin từ source
# Cài đặt dependencies
sudo apt install -y unzip
# Tải phpMyAdmin mới nhất
cd /usr/share
sudo wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.zip
sudo unzip phpMyAdmin-latest-all-languages.zip
sudo mv phpMyAdmin-*-all-languages phpmyadmin
sudo rm phpMyAdmin-latest-all-languages.zip
# Tạo thư mục temp cho phpMyAdmin
sudo mkdir -p /usr/share/phpmyadmin/tmp
sudo chown -R www-data:www-data /usr/share/phpmyadmin/tmp
5.2. Cấu hình Nginx cho phpMyAdmin
sudo nano /etc/nginx/conf.d/phpmyadmin.conf
Thêm nội dung sau:
server {
listen 80;
server_name phpmyadmin.yourdomain.com;
root /usr/share/phpmyadmin;
index index.php;
access_log /var/log/nginx/phpmyadmin.access.log;
error_log /var/log/nginx/phpmyadmin.error.log;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ /\.ht {
deny all;
}
}
# Test cấu hình và reload Nginx
sudo nginx -t
sudo systemctl reload nginx
6. Cài đặt SSL với Let’s Encrypt
6.1. Cài đặt Certbot
sudo apt install -y certbot python3-certbot-nginx
6.2. Lấy chứng chỉ SSL
# Thay thế phpmyadmin.yourdomain.com bằng domain của bạn
sudo certbot --nginx -d phpmyadmin.yourdomain.com
6.3. Tự động gia hạn SSL
# Test auto-renewal
sudo certbot renew --dry-run
# Kiểm tra timer tự động gia hạn
sudo systemctl list-timers | grep certbot
7. Cài đặt ModSecurity WAF
7.1. Cài đặt dependencies
sudo apt install -y git gcc build-essential libtool libpcre3 libpcre3-dev \
zlib1g zlib1g-dev libssl-dev libxml2-dev libgeoip-dev
7.2. Compile ModSecurity v3
cd /usr/local/src
sudo git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity
cd ModSecurity
sudo git submodule init
sudo git submodule update
sudo ./build.sh
sudo ./configure
sudo make -j$(nproc)
sudo make install
7.3. Compile ModSecurity Nginx Connector
cd /usr/local/src
sudo git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git
7.4. Compile Nginx với ModSecurity
# Kiểm tra phiên bản Nginx hiện tại
nginx -v
# Download Nginx source (thay X.Y.Z bằng phiên bản của bạn)
cd /usr/local/src
sudo wget http://nginx.org/download/nginx-X.Y.Z.tar.gz
sudo tar -zxvf nginx-X.Y.Z.tar.gz
cd nginx-X.Y.Z
# Compile module
sudo ./configure --with-compat --add-dynamic-module=../ModSecurity-nginx
sudo make modules
# Copy module
sudo mkdir -p /etc/nginx/modules
sudo cp objs/ngx_http_modsecurity_module.so /etc/nginx/modules/
7.5. Cấu hình ModSecurity
# Copy file cấu hình
sudo mkdir -p /etc/nginx/modsec
sudo cp /usr/local/src/ModSecurity/modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf
sudo cp /usr/local/src/ModSecurity/unicode.mapping /etc/nginx/modsec/
# Kích hoạt ModSecurity
sudo sed -i 's/SecRuleEngine DetectionOnly/SecRuleEngine On/' /etc/nginx/modsec/modsecurity.conf
7.6. Cài đặt OWASP Core Rule Set
cd /etc/nginx/modsec
sudo git clone https://github.com/coreruleset/coreruleset.git owasp-crs
cd owasp-crs
sudo cp crs-setup.conf.example crs-setup.conf
# Tạo file include cho rules
sudo nano /etc/nginx/modsec/main.conf
Thêm nội dung:
Include /etc/nginx/modsec/modsecurity.conf
Include /etc/nginx/modsec/owasp-crs/crs-setup.conf
Include /etc/nginx/modsec/owasp-crs/rules/*.conf
7.7. Kích hoạt ModSecurity trong Nginx
Chỉnh sửa file nginx.conf:
sudo nano /etc/nginx/nginx.conf
Thêm vào đầu file:
load_module modules/ngx_http_modsecurity_module.so;
Cập nhật site configuration để sử dụng ModSecurity:
server {
# ... other configs ...
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;
# ... rest of config ...
}
8. Tối ưu và bảo mật
8.1. Tối ưu MariaDB
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
Thêm vào section [mysqld]:
[mysqld]
innodb_buffer_pool_size = 1G # 50-70% RAM
innodb_log_file_size = 256M
innodb_buffer_pool_instances = 1
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
query_cache_type = 1
query_cache_size = 64M
tmp_table_size = 64M
max_heap_table_size = 64M
8.2. Bảo mật phpMyAdmin
# Thay đổi đường dẫn mặc định
sudo mv /usr/share/phpmyadmin /usr/share/phpmyadmin-secure
# Tạo HTTP Basic Auth
sudo apt install -y apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd admin
# Cập nhật Nginx config
Thêm vào server block:
location /phpmyadmin-secure {
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/.htpasswd;
# ... other configs ...
}
8.3. Cấu hình Nginx security headers
Thêm vào server block:
# Security headers
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
9. Monitoring và bảo trì
9.1. Cài đặt monitoring tools
# Htop để monitor resources
sudo apt install -y htop
# NetData để monitoring chi tiết
bash <(curl -Ss https://my-netdata.io/kickstart.sh)
9.2. Tạo backup script
sudo nano /usr/local/bin/backup-lemp.sh
Thêm nội dung:
#!/bin/bash
BACKUP_DIR="/backup/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
# Backup databases
mysqldump -u root -p'YOUR_ROOT_PASSWORD' --all-databases > $BACKUP_DIR/all_databases.sql
# Backup Nginx config
tar -czf $BACKUP_DIR/nginx_config.tar.gz /etc/nginx/
# Backup PHP config
tar -czf $BACKUP_DIR/php_config.tar.gz /etc/php/
# Backup websites (adjust paths as needed)
tar -czf $BACKUP_DIR/websites.tar.gz /var/www/
# Keep only 7 days of backups
find /backup -type d -mtime +7 -exec rm -rf {} \;
# Phân quyền và thêm vào cron
sudo chmod +x /usr/local/bin/backup-lemp.sh
sudo crontab -e
Thêm dòng:
0 2 * * * /usr/local/bin/backup-lemp.sh
10. Kiểm tra và xử lý sự cố
10.1. Kiểm tra services
# Kiểm tra status của các service
sudo systemctl status nginx
sudo systemctl status mariadb
sudo systemctl status php8.3-fpm
# Kiểm tra logs
sudo tail -f /var/log/nginx/error.log
sudo tail -f /var/log/mysql/error.log
sudo tail -f /var/log/php8.3-fpm.log
10.2. Các lỗi thường gặp
502 Bad Gateway
- Kiểm tra PHP-FPM có chạy không
- Kiểm tra socket path trong Nginx config
Access denied for user ‘root’@’localhost’
- Reset password root MySQL/MariaDB
413 Request Entity Too Large
- Tăng client_max_body_size trong Nginx
- Tăng upload_max_filesize và post_max_size trong PHP
Kết luận
Bạn đã hoàn thành cài đặt LEMP Stack đầy đủ với:
- Nginx web server
- MariaDB database
- Nhiều phiên bản PHP
- phpMyAdmin để quản lý database
- SSL certificate miễn phí
- ModSecurity WAF để bảo vệ
Hãy nhớ:
- Thường xuyên cập nhật hệ thống
- Backup dữ liệu định kỳ
- Monitor performance và logs
- Kiểm tra SSL certificate renewal
- Review security logs từ ModSecurity
Chúc bạn thành công với LEMP Stack!