Skip to content Skip to main navigation Skip to footer

Cài đặt WordPress với Docker Compose, Nginx, Apache và SSL

Cài đặt WordPress với Docker Compose, Nginx, Apache và SSL với 5 bước vô cùng đơn giản..

Giới thiệu

Ở bài viết này chúng ta sẽ tiến hành tạo một website WordPress thông qua Docker Compose, Nginx, Apache, PHP 8.1, MariaDB và Let’s Encrypt trên Ubuntu 22.04. Và thiết lập này hiện tại được coi là sự kết hợp tối ưu nhất và đang được thử nghiệm trên Google Cloud với hệ điều hành Ubuntu 22.04. Và trước khi đi vào cài đặt, các bạn cần đảm bảo giúp mình các điều kiện cần thiến bên dưới

Điều kiện máy chủ cần đáp ứng:

  1. Cài đặt Docker trên Ubuntu 22.04
  2. Cài đặt Docker Compose trên Ubuntu 22.04.
  3. Domain phải được trỏ đến IP máy chủ

Hãy đảm bảo rằng bạn đã hoàn thành các thành phần được nêu ở trên.

Nếu đã đáp ứng đủ các điều kiện trên, bây giờ chúng ta sẽ tiến hành cài đặt và cấu hình website WordPress.

Hướng dẫn cài đặt

Bước 1: Tạo thư mục chứa dự án.

Đầu tiên, hãy SSH vào máy chủ của mình và tiến hành tạo một thư mục chứa dự án mới. Ở đây mình sẽ đặt tên dự án là  wp-project. Bạn có thể thay thế tên này bằng tên mà bạn muốn.

AZDIGI Tutorial
cd /home
mkdir wp-project
    

Bước 2: Tạo Docker Compose file YML

  • Bây giờ bạn di chuyển vào thư mục dự án.
AZDIGI Tutorial
cd wp-project
    
  • Tạo một file docker-compose.yml mới
AZDIGI Tutorial
nano docker-compose.yml
    

Và thêm nội dung bên dưới vào file vừa tạo.

version: "3.9"
services:
    wordpress:
        container_name: wordpress
        image: wordpress:php8.1-apache
        restart: always
        stdin_open: true
        tty: true
        environment:
            WORDPRESS_DB_HOST: mariadb
            WORDPRESS_DB_USER: db_user
            WORDPRESS_DB_PASSWORD: db_user_pass
            WORDPRESS_DB_NAME: db_name
        volumes:
            - wordpress_data:/var/www/html
            - ./wordpress:/var/www/html
    mariadb:
        container_name: mariadb
        image: mariadb
        restart: always
        environment:
            MYSQL_DATABASE: db_name
            MYSQL_USER: db_user
            MYSQL_PASSWORD: db_user_pass
            MYSQL_RANDOM_ROOT_PASSWORD: 'root_pass'
        volumes:
            - db_data:/var/lib/mysql
    nginx:
        container_name: nginx
        image: nginx:latest
        restart: unless-stopped
        ports:
            - 80:80
            - 443:443
        volumes:
            - ./nginx/conf:/etc/nginx/conf.d
            - ./certbot/conf:/etc/nginx/ssl
            - ./certbot/data:/var/www/html
    certbot:
        container_name: certbot
        image: certbot/certbot:latest
        command: certonly --webroot --webroot-path=/var/www/html --email youremail@domain.com --agree-tos --no-eff-email -d domain.com -d www.domain.com
        volumes:
            - ./certbot/conf:/etc/letsencrypt
            - ./certbot/logs:/var/log/letsencrypt
            - ./certbot/data:/var/www/html
volumes:
    db_data:
    wordpress_data:

Lưu ý: Ở phần mình bôi đậm các bạn có thể sửa lại bằng thông tin của các bạn nhé.

Bước 3: Cấu hình Nginx

Theo như nội dung cấu hình của File docker-compose.yml , thì chúng ta sẽ cần tạo file default.conf bên trong đường dẫn nginx/conf, do đó các bạn sử dụng cách lệnh sau để tạo folder/file mình cần.

  • Tạo folder nginx/conf
AZDIGI Tutorial
mkdir -p /root/nginx/conf
    
  • Tạo file default.conf bên trong nginx/conf
AZDIGI Tutorial
nano /root/nginx/conf/default.conf
    

Và thêm nội dung bên dưới vào file vừa tạo.

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

    server_name domain.com www.domain.com;

    root /var/www/html;
    index index.php;

    location ~ /.well-known/acme-challenge {
        allow all; 
        root /var/www/html;
    }

    location / {
        try_files $uri @apache;
    }

    location ~ ^/.user.ini {
        deny all;
    }

    location ~*  .(svg|svgz)$ {
        types {}
        default_type image/svg+xml;
    }

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location @apache {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://wordpress:80;
    }

    location ~[^?]*/$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://wordpress:80;
    }

    location ~ .php$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://wordpress:80;
    }

    location ~/. {
        deny all;
        access_log off;
        log_not_found off;
    }
} 

Lưu ý: Ở phần mình bôi đậm các bạn hãy sửa lại bằng tên Domain của các bạn nhé.

Bước 4: Triển khai WordPress với Docker Compose

Lưu ý: Bạn cần đảm bảo rằng mình đang đứng tại folder chứa dự án, ở đây mình đã tạo trước đó với tên wp-project (ở bước 1)

Khởi động các containers bằng lệnh sau.

AZDIGI Tutorial
cd wp-project
docker-compose up -d
    

Quá trình chạy sẽ diễn ra như hình dưới, các bạn cần chờ quá trình chạy hoàn tất nhé.

Nếu thành công bạn, kết quả sẽ hiển thị như bên dưới.

Khi tất cả các containers được khởi động, bạn sẽ thấy hai thư mục certbot và wordpress được tạo ra và nằm cùng với file docker-compose.yml như hình. Trong đó:

  • cerbot: Chứa các file liên quan đến chứng chỉ SSL của bạn.
  • wordpress: Chứa mã nguồn website WordPress của bạn.

Để xem các containers, bạn có thể thực hiện lệnh sau.

AZDIGI Tutorial
docker-compose ps
    
Cài đặt WordPress với Docker Compose, Nginx, Apache và SSL

Bước 5: Cấu hình Let’s Encrypt SSL với Nginx

Khi bạn có chứng chỉ SSL Let’s Encrypt, bạn có thể cấu hình HTTPS và chuyển hướng trang web sang HTTPS bằng cách chỉnh sửa file cấu hình default.conf như sau:

AZDIGI Tutorial
nano /root/nginx/conf/default.conf
    

Thực hiện thêm đoạn sau vào dưới vào

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

    server_name domain.com www.domain;

    return 301 https://domain.com$request_uri;
}

 server {
    listen [::]:443 ssl http2;
    listen 443 ssl http2;

    server_name domain.com;

    ssl_certificate /etc/nginx/ssl/live/domain.com/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/live/domain.com/privkey.pem;

    return 301 https://www.domain.com$request_uri; 
}

server {
    listen [::]:443 ssl http2;
    listen 443 ssl http2;

    server_name www.domain.com;

    ssl_certificate /etc/nginx/ssl/live/domain.com/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/live/domain.com/privkey.pem;

    root /var/www/html;
    index index.php;

    location ~ /.well-known/acme-challenge {
         allow all; 
         root /var/www/html;
    }

    location / {
        try_files $uri @apache;
    }

    location ~ ^/.user.ini {
        deny all;
    }

    location ~*  .(svg|svgz)$ {
        types {}
        default_type image/svg+xml;
    }

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location @apache {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://wordpress:80;
    }

    location ~[^?]*/$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://wordpress:80;
    }

    location ~ .php$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://wordpress:80;
    }

    location ~/. {
        deny all;
        access_log off;
        log_not_found off;
    }
} 

Lưu ý: Các bạn nhớ thay domain.com bằng tên Domain của các bạn.

Ở đây mình làm Demo mới Domain là azdigi.space , nên cách chỉnh sửa sẽ tương tự như hình

Cài đặt WordPress với Docker Compose, Nginx, Apache và SSL

Sau khi chỉnh sửa File xong các bạn lưu lại và khởi động lại Nginx với lệnh

AZDIGI Tutorial
docker-compose restart nginx
    
Cài đặt WordPress với Docker Compose, Nginx, Apache và SSL

Bây giờ bạn hãy vào trình duyệt bất kỳ và truy cập theo địa chỉ website bạn đã thiết lập, lúc này bạn sẽ thấy website của mình đã tự chuyển hướng sang https và hiển thị trang cài đặt WordPress mặc định. Bạn tiến hành nhập thông tin Database đã khai báo ở file docker-compose.yml (ở Bước 2: Tạo Docker Compose file YML) vào là hoàn tất. Và giao diện WordPress sau khi thiết lập xong sẽ như hình.

Cài đặt WordPress với Docker Compose, Nginx, Apache và SSL

Ở trên là toàn bộ các bước cài đặt một website WordPress hoàn chỉnh với Docker Compose, Nginx, Apache và SSL. Với cấu hình này có lẽ là tối ưu nhất ở thời điểm hiện tại, và được các nhà cung cấp có tiếng như Google Cloud làm thành Template và đưa vào sử dụng. Hy vọng bài viết này sẽ hữu ích với các bạn, chúc các bạn thực hiện thành công.

Các bạn có thể tham khảo thêm các hướng dẫn sử dụng khác tại link bên dưới:

Nếu các bạn cần hỗ trợ các bạn có thể liên hệ bộ phận hỗ trợ theo các cách bên dưới:

Bình chọn lsvr_kba