docker安装wordpress

编写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.
上一篇
下一篇