编写docker-compose.yml
version: '3'
services:
mysql:
image: mariadb
volumes:
- ./data/mysql:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: mysql_root_pass
MYSQL_DATABASE: db_name
MYSQL_USER: user_name
MYSQL_PASSWORD: user_pass
restart: always
wordpress:
image: wordpress:php7.3-fpm-alpine
volumes:
- ./data/html:/var/www/html
depends_on:
- mysql
environment:
WORDPRESS_DB_HOST: mysql
MYSQL_ROOT_PASSWORD: mysql_root_pass
WORDPRESS_DB_NAME: db_name
WORDPRESS_DB_USER: user_name
WORDPRESS_DB_PASSWORD: user_pass
WORDPRESS_TABLE_PREFIX: wp_
links:
- mysql
restart: always
nginx:
image: nginx
volumes:
- ./nginx:/etc/nginx/conf.d
- ./data/html:/var/www/html
- /etc/ssl:/etc/ssl
ports:
- 80:80
- 443:443
links:
- wordpress
其中,你需要在docker-compose.yml的同级目录创建nginx文件夹,在其中添加nginx.conf文件,文件内容如下:
server {
listen 80;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name yourdomain.com;
root /var/www/html;
index index.php;
access_log /var/log/nginx/hakase-access.log;
error_log /var/log/nginx/hakase-error.log;
# 下面这两行是部署的ssl证书,接下来一篇文章会教大家如何申请免费的ssl证书
ssl_certificate /etc/ssl/fullchain.pem;
ssl_certificate_key /etc/ssl/private.pem;
ssl on;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
ssl_prefer_server_ciphers on;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass wordpress:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}
location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
expires max;
log_not_found off;
}
}
启动docker-compose
docker-compose down
docker-compose up -d
运行上述命令之后,就可以通过访问http://localhost 或 https://localhost 来访问你的Wordpress网站了。
PHP-FPM 配置
在运行该镜像的容器实例后,通过 docker exec -ti <WordPress容器名称>/bin/sh 进入容器的 Shell,查看 PHP-FPM 的配置。
在/usr/local/etc/php-fpm.conf文件的最后一行,可以看到下面这行配置。
include=etc/php-fpm.d/*.conf
即 PHP-FPM 配置中会自动包含 /usr/local/etc/php-fpm.d 目录下所有以 .conf 结尾文件的内容。镜像中该目录下包含 3 个 .conf 文件:docker.conf、www.conf 和 zz-docker.conf,其中有两个文件需要特别关注。
一是 www.conf 中配置了一个名为 www 的 PHP-FPM 进程池,运行进程的用户和组均为 www-data。用 id 命令可以看出,www-data 的 UID 为 82。
$ id www-data
uid=82(www-data) gid=82(www-data) groups=82(www-data),82(www-data)
因此,如果需要修改 WordPress 中的文件,就需要按上述 UID 配置 /somewhere/wordpress 中的相应目录或文件的写权限。
二是 zz-docker.conf 中指定了 www 进程池监听 9000 端口,与 Dockerfile 中 EXPOSE 语句对应。
[www]
listen = 9000
那么,之后配置 Nginx 反向代理就要指向这个端口。
Nginx 配置
这一步,先与大多数 LNMP 套件配置一样,通过 FastCGI 连接到 PHP-FPM,让 Nginx 作为反向代理。在 Nginx 的配置中添加一个 upstream 节,把 WordPress 容器的 9000 端口作为上游。
upstream wordpress {
server 127.0.0.1:9000;
}
修改 server 节的根目录为 /somewhere/wordpress。
server {
<...>
root /somewhere/wordpress;
}
然后在 server 节中做如下配置,匹配 WordPress 的 URL 重写机制,让 Nginx 直接提供静态文件,并代理 URL 以 .php 结尾的请求,提供给作为上游的 PHP-FPM。
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass wordpress;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
更改上传文件大小限制
需要对两个地方进行更改:
NGINX
在服务器块中像这样设置client_max_body_size
server {
listen 443 ssl;
server_name '"$COMMON_NAME"';
ssl_certificate /home/server.crt;
ssl_certificate_key /home/server.key;
root /var/www/html;
client_max_body_size 100M;
此设置控制在 wordpress 出现之前 Web 服务器本身将允许多少。
php7.4-fpm-alpine
如果它不存在,则创建以下文件/usr/local/etc/php/conf.d/uploads.ini并像这样编辑它:
file_uploads = On
memory_limit = 500M
upload_max_filesize = 100M
post_max_size = 100M
max_execution_time = 600
max_file_uploads = 50000
max_execution_time = 5000
max_input_time = 5000
对于多站点安装,还有一件事要做,那就是更新MySQL 中的fileupload_maxk设置。可以使用以下 wp cli 命令完成:
bash-5.0# wp site option update fileupload_maxk 10000 --allow-root
Success: Updated 'fileupload_maxk' site option.