Hướng dẫn cài đặt WordPress trên CentOS Stream 9 với Nginx và Let’s Encrypt

CentOS tutorial - IT technology blog
CentOS tutorial - IT technology blog

Tại sao lại là CentOS Stream 9 và Nginx?

Hồi mới làm server, mình hay dùng Apache vì nó tiện, cứ quăng file vào là chạy. Nhưng khi quản lý những site có hàng nghìn truy cập cùng lúc, mình thấy Apache ngốn RAM rất nhanh. Một server 2GB RAM có thể gục ngã dưới tay Apache, trong khi Nginx chỉ tiêu tốn khoảng 150-200MB để xử lý lượng traffic tương đương.

Sau khi CentOS 8 dừng lại (EOL), mình đã cân nhắc giữa AlmaLinux hay Rocky Linux. Cuối cùng, mình chọn CentOS Stream 9 cho các dự án cần sự ổn định từ gốc RHEL nhưng vẫn muốn có các gói phần mềm mới hơn. Bài này mình sẽ hướng dẫn anh em dựng một con web WordPress chuẩn chỉnh. Đặc biệt, mình sẽ không bảo anh em tắt SELinux đi như các bài hướng dẫn tràn lan trên mạng. Chúng ta sẽ làm đúng kỹ thuật: bật tường lửa và cấu hình SELinux chặt chẽ.

Khái niệm cốt lõi: Stack LEMP là gì?

Để WordPress vận hành mượt mà, chúng ta cần bộ khung LEMP:

  • Linux: Hệ điều hành (CentOS Stream 9).
  • Engine-X (Nginx): Web server xử lý kết nối, nhẹ và nhanh hơn Apache rất nhiều.
  • MariaDB: Hệ quản trị cơ sở dữ liệu (nhánh mã nguồn mở cực kỳ ổn định của MySQL).
  • PHP: Ngôn ngữ lập trình chính của WordPress.

Bước 1: Cập nhật hệ thống và cấu hình Firewalld

Việc đầu tiên sau khi SSH vào server là cập nhật mọi thứ. Đừng bao giờ bỏ qua bước này vì các bản vá bảo mật quan trọng thường nằm ở đây.

sudo dnf update -y

Tiếp theo là mở cổng trên Firewalld. Mặc định CentOS khóa chặt các cổng để bảo vệ server. Nếu không mở cổng 80 và 443, bạn sẽ không thể truy cập website từ trình duyệt.

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

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

Cài đặt Nginx cực kỳ nhanh gọn với lệnh dnf:

sudo dnf install nginx -y
sudo systemctl enable --now nginx

Với MariaDB, sau khi cài xong, bạn bắt buộc phải chạy script bảo mật. Hồi xưa mình từng chủ quan bỏ qua bước này và kết quả là database bị bot scan mật khẩu liên tục.

sudo dnf install mariadb-server mariadb -y
sudo systemctl enable --now mariadb
sudo mariadb-secure-installation

Hệ thống sẽ hỏi mật khẩu root của DB. Vì mới cài nên chưa có pass, bạn cứ nhấn Enter. Sau đó, hãy chọn Y để đặt mật khẩu mới thật mạnh. Các câu hỏi tiếp theo cũng chọn Y để xóa user vô danh và database rác.

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

WordPress hiện tại đạt hiệu suất tốt nhất trên PHP 8.1 hoặc 8.2. Trên CentOS Stream 9, chúng ta cài các module cần thiết để xử lý ảnh và nén dữ liệu:

sudo dnf install php-fpm php-mysqli php-json php-gd php-intl php-pecl-apcu php-opcache php-mbstring php-xml php-zip -y
sudo systemctl enable --now php-fpm

Lưu ý quan trọng: Nginx và PHP-FPM cần “nói chuyện” cùng một ngôn ngữ. Mặc định PHP-FPM chạy dưới user apache, bạn cần đổi nó sang nginx để tránh lỗi phân quyền.

Hãy mở file /etc/php-fpm.d/www.conf và sửa hai dòng sau:

user = nginx
group = nginx

Bước 4: Tạo Database cho WordPress

Giờ là lúc tạo “nhà” cho dữ liệu. Đăng nhập vào MariaDB:

sudo mariadb -u root -p

Chạy các lệnh sau (nhớ thay mat_khau_cua_ban bằng một chuỗi ký tự khó đoán):

CREATE DATABASE wordpress_db;
CREATE USER 'wp_user'@'localhost' IDENTIFIED BY 'mat_khau_cua_ban';
GRANT ALL PRIVILEGES ON wordpress_db.* TO 'wp_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Bước 5: Cấu hình Nginx Virtual Host

Tải bản WordPress mới nhất về thư mục web:

cd /var/www
sudo curl -O https://wordpress.org/latest.tar.gz
sudo tar -xf latest.tar.gz
sudo chown -R nginx:nginx /var/www/wordpress
sudo chmod -R 755 /var/www/wordpress

Sau đó, tạo file cấu hình Nginx tại /etc/nginx/conf.d/wordpress.conf:

server {
    listen 80;
    server_name yourdomain.com; # Thay bằng domain thật
    root /var/www/wordpress;
    index index.php index.html;

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

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/run/php-fpm/www.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

Kiểm tra cấu hình và khởi động lại: sudo nginx -t && sudo systemctl restart nginx.

Bước 6: Xử lý SELinux – Chìa khóa bảo mật

Nếu truy cập web và thấy lỗi “403 Forbidden”, đó là do SELinux đang chặn Nginx. Thay vì tắt nó đi (rất nguy hiểm), hãy chạy lệnh sau để cấp quyền ghi file đúng cách:

# Cài đặt công cụ quản lý nếu chưa có
sudo dnf install policycoreutils-python-utils -y

# Cho phép Nginx quản lý file web
sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/wordpress(/.*)?"
sudo restorecon -Rv /var/www/wordpress

# Cho phép kết nối mạng (để cài plugin, gửi mail)
sudo setsebool -P httpd_can_network_connect 1

Kinh nghiệm của mình: Nếu không chạy restorecon, các thay đổi sẽ không có hiệu lực. Bạn sẽ loay hoay sửa quyền 777 cả ngày mà vẫn không chạy được web.

Bước 7: Kích hoạt SSL miễn phí với Let’s Encrypt

Web không có HTTPS sẽ bị Google cảnh báo “Không an toàn” và hạ thứ hạng SEO. Chúng ta dùng Certbot để lấy chứng chỉ SSL miễn phí chỉ trong 30 giây.

sudo dnf install certbot python3-certbot-nginx -y
sudo certbot --nginx -d yourdomain.com

Certbot sẽ tự động cấu hình lại Nginx và thiết lập tự động gia hạn chứng chỉ cho bạn. Quá tiện lợi!

Kết luận

Dựng WordPress trên CentOS Stream 9 không khó nếu bạn nắm vững quy trình. Điểm mấu chốt là phối hợp nhịp nhàng giữa Firewalld và SELinux để tạo ra một pháo đài thực sự cho website.

Nếu trong quá trình cài đặt có bước nào báo lỗi, anh em hãy soi kỹ log tại /var/log/nginx/error.log. Mọi manh mối đều nằm ở đó. Chúc anh em triển khai thành công!

Share: