DockerDocker ComposeLinuxWordpress

Hướng dẫn chi tiết: Thiết lập môi trường phát triển WordPress đa phiên bản PHP với Docker

Cài đặt và cấu hình môi trường local cho nhiều WordPress site sử dụng Docker, Nginx, PHP-FPM và MariaDB

12-10-2024
Nâng cấp một vài config để tối ưu tốc độ


09-10-2024
Cập nhật sử dụng nhiều phiên bản PHP cho từng loại website


21-09-2024
Mới cập nhật lại stack dùng php-fpm + nginx tối ưu hiệu năng hơn apache


[12-10-2024] Nâng cấp các config thêm cho môi trường dev nhanh hơn
  1. Docker Compose:

    • Sử dụng depends_on cho các service phụ thuộc nhau.
    • Sử dụng restart: unless-stopped thay vì always.
  2. Docker Sync:

    • Thêm sync_excludes cho các thư mục không cần đồng bộ thường xuyên.
    • Sử dụng sync_userid để khớp với UID của người dùng trong container.
  3. Nginx:

    • Bật gzip compression.
    • Tăng worker_connections.
    • Thêm caching cho static files.
  4. PHP:

    • Bật opcache với cấu hình tối ưu.
    • Sử dụng PHP-FPM pools.
  5. MariaDB:

    • Tinh chỉnh thêm các tham số như innodb_buffer_pool_instances, max_connections.
  6. Volume mounts:

    • Sử dụng :cached cho các volume chỉ đọc.

Đây là một số điều chỉnh cụ thể:

  1. Trong docker-compose.yml:

    services:
    db:
    volumes:
      - ./mariadb-container:/etc/mysql/conf.d:cached
  2. Trong docker-sync.yml:

    syncs:
    app-sync:
    sync_excludes: ['node_modules', 'vendor', '*.log', '*.sql', '*.sqlite']
    sync_userid: '1000'
  3. Trong nginx.conf:

    http {
    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    
    fastcgi_cache_path /tmp/nginx_cache levels=1:2 keys_zone=WORDPRESS:100m inactive=60m;
    fastcgi_cache_key "$scheme$request_method$host$request_uri";
    }
  4. Trong php82.ini và php74.ini:

    opcache.enable=1
    opcache.memory_consumption=128
    opcache.interned_strings_buffer=8
    opcache.max_accelerated_files=4000
    opcache.revalidate_freq=60
    opcache.fast_shutdown=1
    opcache.enable_cli=1
  5. Trong my.cnf:

    innodb_buffer_pool_instances = 4
    max_connections = 200

Hướng dẫn cài đặt môi trường phát triển WordPress với Docker

Mục đích

Hướng dẫn này giúp bạn thiết lập một môi trường phát triển WordPress linh hoạt sử dụng Docker. Môi trường này cho phép bạn:

  • Chạy nhiều phiên bản PHP (7.4 và 8.2) cùng lúc
  • Sử dụng MariaDB làm cơ sở dữ liệu
  • Quản lý cơ sở dữ liệu thông qua phpMyAdmin
  • Cấu hình Nginx làm web server
  • Dễ dàng thêm và quản lý nhiều WordPress site

Cấu trúc dự án

project/
│
├── docker-compose.yml
├── Dockerfile-php74
├── Dockerfile-php82
├── mariadb-container/
│   ├── init.sql
│   ├── my.cnf
│   └── home/
├── nginx-container/
│   ├── nginx.conf
│   └── logs/
├── php-container/
│   ├── php74.ini
│   └── php82.ini
└── sites/
    └── site1/

Cấu hình Docker Compose

File docker-compose.yml định nghĩa và cấu hình các service cần thiết cho môi trường WordPress. Nó bao gồm:

  • Database server (MariaDB)
  • PHP-FPM containers (cho PHP 7.4 và 8.2)
  • phpMyAdmin để quản lý database
  • Nginx web server

Cấu hình này cho phép bạn chạy nhiều phiên bản PHP, giúp kiểm tra tính tương thích của ứng dụng với các phiên bản PHP khác nhau.

version: '3.8'

services:
  db:
    image: mariadb:latest
    volumes:
      - db_data:/var/lib/mysql
      - ./mariadb-container/init.sql:/docker-entrypoint-initdb.d/init.sql
      - ./mariadb-container/my.cnf:/etc/mysql/my.cnf
      - ./mariadb-container/home:/home
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root_password
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress_user
      MYSQL_PASSWORD: wordpress_password
    networks:
      - wp-network

  php74:
    build:
      context: .
      dockerfile: Dockerfile-php74
    volumes:
      - ./sites:/var/www/html
      - ./php-container/php74.ini:/usr/local/etc/php/php.ini
    environment:
      UPLOAD_MAX_FILESIZE: 100M
    expose:
      - "9000"
    restart: always
    networks:
      - wp-network

  php82:
    build:
      context: .
      dockerfile: Dockerfile-php82
    volumes:
      - ./sites:/var/www/html
      - ./php-container/php82.ini:/usr/local/etc/php/php.ini
    environment:
      UPLOAD_MAX_FILESIZE: 100M
    expose:
      - "9000"
    restart: always
    networks:
      - wp-network

  phpmyadmin:
    image: phpmyadmin
    platform: linux/arm64
    environment:
      PMA_HOST: db
      MYSQL_ROOT_PASSWORD: root_password
    ports:
      - "8081:80"
    restart: always
    networks:
      - wp-network

  nginx:
    image: nginx:latest
    ports:
      - "8880:80"
    volumes:
      - ./nginx-container/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./sites:/var/www/html
      - ./nginx-container/logs:/var/log/nginx
    depends_on:
      - php74
      - php82
    networks:
      - wp-network

volumes:
  db_data:

networks:
  wp-network:
    driver: bridge

Cấu hình PHP

Các Dockerfile cho PHP 7.4 và 8.2 cài đặt các extension PHP cần thiết cho WordPress và các ứng dụng web PHP phổ biến khác. Việc sử dụng các container riêng biệt cho mỗi phiên bản PHP cho phép bạn dễ dàng chuyển đổi giữa các phiên bản cho các dự án khác nhau.

PHP 7.4: Tạo file Dockerfile-php74 với nội dung sau

FROM php:7.4-fpm

RUN apt-get update --allow-unauthenticated \
    && apt-get install -y --no-install-recommends --allow-unauthenticated \
       libfreetype6-dev \
       libjpeg62-turbo-dev \
       libpng-dev \
       libonig-dev \
       libzip-dev \
       zip \
    && rm -rf /var/lib/apt/lists/* \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) gd mysqli pdo pdo_mysql mbstring zip opcache

COPY ./php-container/php74.ini /usr/local/etc/php/

RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*

PHP 8.2 - Tạo file Dockerfile-php82 với nội dung sau:

FROM php:8.2-fpm

RUN apt-get update --allow-insecure-repositories \
    && apt-get install -y --no-install-recommends \
    libfreetype6-dev \
    libjpeg62-turbo-dev \
    libpng-dev \
    libonig-dev \
    libzip-dev \
    zip \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) gd mysqli pdo pdo_mysql mbstring zip opcache

COPY ./php-container/php82.ini /usr/local/etc/php/

RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*

Cấu hình PHP.ini

Các file cấu hình PHP.ini tùy chỉnh các giới hạn quan trọng như kích thước upload tối đa và thời gian thực thi, giúp tối ưu hóa hiệu suất và khả năng của PHP cho WordPress.

Cấu hình PHP.ini
Tạo hai file php-container/php74.iniphp-container/php82.ini với nội dung giống nhau:

max_input_vars = 5000
post_max_size = 100M
upload_max_filesize = 100M
max_execution_time = 300
memory_limit = 256M

Cấu hình Nginx

File cấu hình Nginx thiết lập web server để xử lý các request HTTP, định tuyến chúng đến các container PHP phù hợp, và cấu hình các thông số cần thiết cho WordPress. Nó cũng cho phép bạn dễ dàng thêm nhiều WordPress site vào cùng một môi trường.

Cấu hình Nginx - Tạo file nginx-container/nginx.conf với nội dung sau:

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    keepalive_timeout  65;

    upstream php74 {
        server php74:9000;
    }

    upstream php82 {
        server php82:9000;
    }

    client_max_body_size 100M;
    client_header_buffer_size 64k;
    large_client_header_buffers 4 64k;

    fastcgi_buffers 16 16k;
    fastcgi_buffer_size 32k;

    server {
        listen 80;
        server_name site1.local;
        root /var/www/html/site1;
        index index.php;

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

        location ~ \.php$ {
            fastcgi_pass php82;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
    }

    # Thêm các block server khác tương tự ở đây
}

Cấu hình MariaDB

File cấu hình MariaDB tùy chỉnh các thông số quan trọng của database server để tối ưu hóa hiệu suất cho WordPress. Các cài đặt này giúp cải thiện tốc độ truy vấn và độ tin cậy của database.

Tạo file mariadb-container/my.cnf với nội dung sau:

[mysqld]
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT

Thay đổi file hosts

Windows
Mở Notepad với quyền Administrator.
Mở file: C:\Windows\System32\drivers\etc\hosts
Thêm các dòng sau vào cuối file:

127.0.0.1 site1.local
127.0.0.1 site2.local
# Thêm các site khác nếu cần

Lưu file.

macOS và Linux

Mở Terminal.
Chạy lệnh sau để mở file hosts bằng trình soạn thảo nano:

sudo nano /etc/hosts

Thêm các dòng sau vào cuối file:

127.0.0.1 site1.local
127.0.0.1 site2.local
# Thêm các site khác nếu cần

Nhấn Ctrl+X, sau đó nhấn Y và Enter để lưu và thoát.

Khởi động môi trường

Lệnh docker-compose up -d khởi động tất cả các container đã được định nghĩa trong file docker-compose.yml. Tùy chọn -d chạy các container trong chế độ nền (detached mode), cho phép bạn tiếp tục sử dụng terminal.

Để khởi động môi trường, chạy lệnh sau trong thư mục gốc của dự án:

docker-compose up -d

Sau khi hoàn tất, bạn có thể truy cập:

WordPress site1: http://site1.local:8880
WordPress site2: http://site2.local:8880
phpMyAdmin: http://localhost:8081

Bạn có thể thêm nhiều WordPress site khác bằng cách thêm các block server trong file nginx.conf và tạo thư mục tương ứng trong thư mục sites/.

Kết luận

Môi trường này cung cấp một nền tảng linh hoạt và mạnh mẽ để phát triển WordPress. Bạn có thể dễ dàng thêm nhiều site, chuyển đổi giữa các phiên bản PHP, và quản lý cơ sở dữ liệu một cách hiệu quả. Điều này đặc biệt hữu ích cho việc phát triển và kiểm thử các theme và plugin WordPress trong nhiều môi trường khác nhau.

Link github repository: https://github.com/tuannt23065/docker-wp-sites

Bài viết liên quan

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Back to top button
Close