Hồi ức về đợt ‘di cư’ khỏi CentOS 8
Cuối năm 2021, khi CentOS 8 bất ngờ dừng hỗ trợ (EOL), mình và nhiều anh em sysadmin rơi vào cảnh ‘trở tay không kịp’. Lúc đó mình đang ôm 5 con server chạy production cho khách. Chỉ có vỏn vẹn một tuần để chuyển sạch sang Rocky Linux nhằm giữ an toàn cho hệ thống.
Sau những đêm ‘thức trắng’ đó, mình nhận ra Rocky Linux 9 là điểm dừng chân cực kỳ đáng tin cậy. Nó giữ nguyên cái chất ổn định của Red Hat nhưng hoàn toàn miễn phí. Hôm nay, mình sẽ cùng anh em dựng lại bộ khung LEMP (Linux, Nginx, MariaDB, PHP) trên ‘vùng đất mới’ này.
Tại sao lại là LEMP mà không phải LAMP?
Câu hỏi này quá quen thuộc nhưng vẫn cần nhắc lại. Với các con VPS cỏ (1 vCPU, 1GB RAM), Nginx là cứu cánh tuyệt vời. Thực tế cho thấy Nginx chỉ tốn khoảng 20MB RAM khi ở trạng thái chờ. Trong khi đó, Apache thường ‘ngốn’ gấp 3-4 lần con số này.
Nginx xử lý hàng nghìn kết nối đồng thời cực mượt nhờ cơ chế event-driven. Bạn cứ tưởng tượng Nginx như một anh bồi bàn siêu hạng. Anh ta có thể nhận order của 50 bàn cùng lúc mà không hề lúng túng hay làm đổ vỡ gì.
Bước 1: Cài đặt Nginx – Trạm trung chuyển tốc độ cao
Bắt đầu thôi! Việc đầu tiên luôn là cập nhật hệ thống để tránh các xung đột package cũ.
sudo dnf update -y
sudo dnf install nginx -y
Cài xong, anh em nhớ kích hoạt để Nginx tự chạy khi reboot. Nhiều anh em mới làm hay quên bước này, dẫn đến việc server khởi động lại là website ‘tèo’.
sudo systemctl start nginx
sudo systemctl enable nginx
Tiếp theo, hãy mở cổng 80 (HTTP) và 443 (HTTPS) trên firewall. Rocky Linux mặc định khóa rất chặt. Nếu không mở, bạn sẽ chỉ thấy lỗi ‘Connection timed out’ khi truy cập web.
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
Bước 2: Cài đặt MariaDB – Kho lưu trữ ‘nồi đồng cối đá’
Mình ưu tiên chọn MariaDB thay vì MySQL vì tính tương thích cực cao và hoàn toàn miễn phí. Trong các bài test truy vấn phức tạp, MariaDB thường cho tốc độ phản hồi nhanh hơn 5-10%.
sudo dnf install mariadb-server mariadb -y
sudo systemctl start mariadb
sudo systemctl enable mariadb
Đừng bao giờ để nguyên cấu hình mặc định rồi dùng luôn. Hãy chạy script bảo mật để dọn sạch các user ‘rác’ và đặt mật khẩu root thật mạnh.
sudo mysql_secure_installation
Lời khuyên của mình: Khi script hỏi, cứ nhấn Y (Yes) toàn bộ để thắt chặt bảo mật tối đa cho database.
Bước 3: Cài đặt PHP 8.1 – Tăng tốc xử lý logic
Rocky Linux 9 đi kèm PHP 8.1 với tính năng JIT giúp hiệu năng thực thi nhanh hơn hẳn bản 7.4 cũ. Các dự án WordPress hay Laravel khi lên PHP 8.1 thường giảm được 20-30% thời gian phản hồi trang.
sudo dnf install php php-fpm php-mysqlnd php-gd php-curl php-xml php-mbstring -y
Điểm mấu chốt ở đây: Mặc định php-fpm chạy dưới user apache. Vì chúng ta dùng Nginx, bạn phải đổi nó sang user nginx để tránh lỗi phân quyền 403 hoặc Permission Denied.
Mở file /etc/php-fpm.d/www.conf và sửa hai dòng này:
user = nginx
group = nginx
Sau đó khởi động dịch vụ lên:
sudo systemctl start php-fpm
sudo systemctl enable php-fpm
Bước 4: Cấu hình Nginx ‘bắt tay’ với PHP
Nginx không tự đọc được file PHP mà phải gửi qua PHP-FPM xử lý qua socket. Chúng ta sẽ tạo một file cấu hình server block mới.
Tạo file /etc/nginx/conf.d/itfromzero.conf:
server {
listen 80;
server_name your_domain_or_IP;
root /usr/share/nginx/html;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
Trước khi restart, hãy chạy lệnh sudo nginx -t. Nếu thấy ‘syntax is ok’, bạn đã đi đúng hướng rồi đấy.
sudo systemctl restart nginx
Về đích: Kiểm tra và Monitoring
Để biết hệ thống đã thông suốt chưa, hãy tạo một file info.php nhanh gọn:
echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/html/info.php
Truy cập IP của server/info.php. Nếu bảng thông tin hiện ra, chúc mừng bạn đã sở hữu một LEMP stack chuẩn chỉ!
Kinh nghiệm xương máu của mình: Nếu gặp lỗi 502 Bad Gateway, 90% là do SELinux chặn Nginx kết nối tới socket. Hãy thử chạy lệnh setsebool -P httpd_can_network_connect 1 để gỡ nút thắt này. Đừng nản lòng, việc đọc log tại /var/log/nginx/error.log mỗi ngày sẽ biến bạn thành một cao thủ sysadmin thực thụ.
