Bạn đang muốn tạo một môi trường webserver cho WordPress là php-fpm + nginx nhanh bằng Docker Compose trên tất cả các hệ điều hành Windows, MacOS, Linux tham khảo bài viết mình nhé
Yêu cầu cần tạo môi trường như sau:
- Domain cho môi trường dev local là: localhost.com:5000
- Webserver là nginx
- Dùng php-fpm
- Source code wordpress
- Datbase Mysql
- Tất cả đều được ánh xạ tới nơi chứa project ví dụ như source code wordpress được lưu trữ trong project mình và có thể thêm, sửa, xóa.
Các bước thực hiện như sau:
Tạo file docker-compose.yml cho WordPress + Nginx + Mysql
Trước khi tạo file docker-compose.yml bạn chắc chắn con trỏ mình đang ở thư mục project bạn mong muốn tạo. Ví dụ ở đây mình sẽ dùng thư mục có tên là project-demo
Khai báo service database
version: '3'
services:
db:
image: mysql:5.7
container_name: db-demo
restart: unless-stopped
env_file: ./app/.env
environment:
- MYSQL_DATABASE=db-demo
volumes:
- ./dbdata:/var/lib/mysql
networks:
- app-network
Mình giải thích chút:
Database ở đây mình sẽ sử dụng image mysql:5.7
Container name sẽ là đặt là db-demo
File .env khai báo biến môi trường trong thư mục app (ví dụ như MYSQL_ROOT_PASSWORD(mật khẩu root của mysql), MYSQL_USER, MYSQL_PASSWORD,…)
Biến môi trường environment: MYSQL_DATABASE=db-demo (tên database là db-demo)
Ánh xạ mysql tới folder dbdata ./dbdata:/var/lib/mysql
Khai báo service wordpress
wordpress:
depends_on:
- db
image: wordpress:5.1.1-fpm-alpine
container_name: wp-demo
restart: unless-stopped
env_file: ./app/.env
environment:
- WORDPRESS_DB_HOST=db:3306
- WORDPRESS_DB_USER=root
- WORDPRESS_DB_PASSWORD=root
- WORDPRESS_DB_NAME=db-demo
volumes:
- ./app:/var/www/html
networks:
- app-network
Service wordpress:
– Liên kết tới db depends_on: db
– Image mình sẽ sử dụng wordpress:5.5.1-fpm-alpine
– Container mình đặt là: wp-demo
– Khai báo biến môi trường trong file ./app/.env
– Khai báo biến môi trường trực tiếp: (WORDPRESS_DB_HOST, WORDPRESS_DB_USER, WORDPRESS_DB_PASSWORD, WORDPRESS_DB_NAME)
– Ánh xạ source code wordpress tới thư mục app: ./app:/var/www/html
Khai báo service webserver
webserver:
depends_on:
- wordpress
image: nginx:1.15.12-alpine
container_name: webserver-example
restart: unless-stopped
ports:
- "5000:80"
volumes:
- ./app:/var/www/html
- ./nginx-conf:/etc/nginx/conf.d
networks:
- app-network
Service webserver Nginx:
– Lệ thuộc buộc phải có sẵn wordpress: depends_on: – wordpress
Image sử dụng là: nginx:1.15.12-alpine
– Đăt tên container webserver là webserver-demo
– Port sử dụng trên máy host là 80 container là 5000: 5000:80
– Ánh xạ webroot tại thư mục app: ./app:/var/www/html
– Ánh xạ thư mục config nginx /etc/nginx/conf.d tới thư mục nginx-conf: ./nginx-conf:/etc/nginx/conf.d. Trong thư mục nginx-conf cần phải có file nginx.conf, mình sẽ hướng dẫn tạo file nginx.conf bên dưới
File docker-compose.yml hoàn thiện
version: '3'
services:
db:
image: mysql:5.7
container_name: db-demo
restart: unless-stopped
env_file: ./app/.env
environment:
- MYSQL_DATABASE=db-demo
volumes:
- ./dbdata:/var/lib/mysql
networks:
- app-network
wordpress:
depends_on:
- db
image: wordpress:5.1.1-fpm-alpine
container_name: wp-demo
restart: unless-stopped
env_file: ./app/.env
environment:
- WORDPRESS_DB_HOST=db:3306
- WORDPRESS_DB_USER=root
- WORDPRESS_DB_PASSWORD=root
- WORDPRESS_DB_NAME=db-demo
volumes:
- ./app:/var/www/html
networks:
- app-network
webserver:
depends_on:
- wordpress
image: nginx:1.15.12-alpine
container_name: webserver-example
restart: unless-stopped
ports:
- "5000:80"
volumes:
- ./app:/var/www/html
- ./nginx-conf:/etc/nginx/conf.d
networks:
- app-network
networks:
app-network:
driver: bridge
Tạo file nginx.conf
Tạo file config trong thư mục nginx-conf/nginx.conf
Mục đích tạo file này để config webser theo ý muốn mình:
Domain sẽ là localhost.com
Port host là 80
Thực hiện chạy backend php-fpm port 9000
server {
listen 80;
#listen [::]:80;
server_name example.co www.localhost.com;
index index.php index.html index.htm;
root /var/www/html;
server_tokens off;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Content-Security-Policy "default-src * data: 'unsafe-eval' 'unsafe-inline'" always;
# add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# enable strict transport security only if you understand the implications
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass wp-example:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location ~ /\.ht {
deny all;
}
location = /favicon.ico {
log_not_found off; access_log off;
}
location = /robots.txt {
log_not_found off; access_log off; allow all;
}
location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
expires max;
log_not_found off;
}
}
Giải thích ở dòng fastcgi_pass wp-demo:9000; có nghĩa là nginx sẽ thực hiện run backend wordpress-fpm thông qua port 9000 với container name đặt ở trên là wp-demo
Mở terminal
Chạy lệnh docker-compose up -d để khởi tạo.
Truy cập http://localshot.com:5000 để xem kết quả.
Lời kết
Như vậy, qua bài viết này mình đã hướng dẫn các bạn tạo ra một môi trường webserver cho WordPress là php-fpm + nginx nhanh bằng Docker Compose trên tất cả các hệ điều hành Windows, MacOS, Linux.
Chúc các bạn thành công!