docker基于源码搭建wordpress个人博客

27次阅读

共计 4079 个字符,预计需要花费 11 分钟才能阅读完成。

背景

最近入手了一台阿里云 ECS,就寻思着搭建个个人博客,记录自己的一些技术研究,技术只有记下来才是属于你的,不记下来只是暂时属于你的。很多时候辛辛苦苦通宵熬夜研究技术解决了难题,如果当时没记下来下次要用的时候又得重新来一遍,永远不会成长。所以好记性不如烂笔头,学到新的东西要及时记下来,不仅对自己是技术积累的过程,也能惠及广大同行,何乐而不为。

一开始并不想把事情搞复杂,安装 docker,运行 wordpress 官方 docker 镜像,一键完成部署。

docker run --name blog -p 80:80 -d wordpress

wordpress 初次启动会有引导界面,通过引导界面输入数据库信息,初始化完数据库后就就完成了安装。

安装是非常方便,但问题也随之而来。

官方 docker 镜像没有中文版,后台管理界面是英文倒也不影响,但博客首页默认变成了英文,非常影响阅读,可以安装中文包,但需要修改 wp-config.php 文件,但由于 wordpress 源码打包在 docker 镜像里,修改起来较为复杂。因此决定放弃 docker 镜像,直接基于源码安装。在 docker 环境下基于源码安装需要以下几个镜像的配合:

  • php cgi docker 镜像的选择
  • 负载均衡服务器的选择
  • 数据库

在 wordpress 中文网站下载最新 wordpress 源码,我下载的是最新版本 WordPress 5.2.4,官网对 WordPress 5.2.4 要求 PHP 7.3 或者更高,MySQL 5.6 或更高,在选择 docker 镜像的时候需要注意下,不然无法运行。

wordpress 所有的官网打开都是 429 错误429 Too Many Requests,起初我以为是我网络的问题,但无论怎么切换网络都是 429,我觉得这个问题已经超出技术范围,技术解决不了政治问题,429 解决的办法只能是多刷新几次,直到刷出来为止。

PHP

PHP 源码需要 php cgi 支持,在 dockerhub 上找到了 php 官方镜像,在 tag 里搜索 fpm,可以查看各个 php-fpm 版本,PHP-FPM(PHP FastCGI Process Manager)是为了更好的管理 php-fastcgi 而实现的一个程序,可以接收 web 服务器请求处理 php 脚本。

我选择了 php:7.3-fpm 作为 wordpress 运行环境。

docker run --name php -v /data/wordpress/src:/var/www/html -d php:7.3-fpm

/data/wordpress/src为 wordpress 源码目录,运行后访问报错

Fatal error: Uncaught Error: Call to undefined function mysql_connect() in /var/www/html/wp-includes/wp-db.php:1645 Stack trace: #0 /var/www/html/wp-includes/wp-db.php(639): wpdb->db_connect() #1 /var/www/html/wp-includes/load.php(427): wpdb->__construct('wordpress', 'helen0226', 'wordpress', 'db:3306') #2 /var/www/html/wp-settings.php(120): require_wp_db() #3 /var/www/html/wp-config.php(88): require_once('/var/www/html/w...') #4 /var/www/html/wp-load.php(37): require_once('/var/www/html/w...') #5 /var/www/html/wp-blog-header.php(13): require_once('/var/www/html/w...') #6 /var/www/html/index.php(17): require('/var/www/html/w...') #7 {main} thrown in /var/www/html/wp-includes/wp-db.php on line 1645

看错误日志是缺少 mysql 相关模块。根据 dockerhub 上相关介绍,需要自行构建包含 mysql 模块的 fpm 镜像,通过工具 docker-php-ext-install 加入 mysql 模块,步骤也很简单,写一个 Dockerfile 文件即可。

FROM php:7.3-fpm
RUN docker-php-ext-install mysqli pdo pdo_mysql

保存为Dockerfile,执行以下命令构建新镜像。

docker build -t php:7.3-fpmx .

这里取了一个名字php:7.3-fpmx.

重新运行

docker run --name php -v /data/wordpress/src:/var/www/html -d php:7.3-fpmx

nginx

解决了 php 运行环境的问题,就要搭建负载均衡服务器,毕竟 php 只是 cgi,还需要一个 web 服务器的支持。这里选择了 nginx 作为 web 服务器。

docker run --name nginx -v /data/nginx/conf.d:/etc/nginx/conf.d -v /data/wordpress/src:/usr/share/nginx/html --link php:php -p 2001:80 -d nginx

目录 /data/nginx/conf.d 下的配置文件 default.conf 如下

server {
    listen       80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index index.php index.html;

    }
    
    location ~ \.php$ {
        fastcgi_pass   php:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/html/$fastcgi_script_name;
        include        fastcgi_params;
    }
}
  • index index.php 设置根目录默认请求文件名。
  • /var/www/html/是 php-fpm 容器内的路径而非文件系统中的路径。

启动 nginx 后就可以通过 nginx 进行访问。

数据库

wordpress 初次启动后需要输入数据库信息,如果没有可以当场搭建一个 mysql 数据库服务器。

# docker run --name mysql -p 2000:3306 -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=password -d mysql

# docker exec -it mysql bash
root@ac169daba7b0:/# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 798
Server version: 8.0.18 MySQL Community Server - GPL

这里用的是 8.0.18 版本的 mysql,可以通过 docker exec 命令进入 mysql 容器内,创建用户和数据库,脚本可以参考如下:

CREATE DATABASE  wordpress default charset utf8 COLLATE utf8_general_ci;

CREATE USER 'wordpress'@'%' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'%';

ALTER USER 'wordpress'@'%' IDENTIFIED WITH mysql_native_password;
alter user 'wordpress'@'%' identified by 'password'

FLUSH   PRIVILEGES;

wordpress 源码提供了一个配置文件的参考代码wp-config-sample.php,可以直接复制并重命名为wp-config.php。修改数据库连接信息

define('DB_NAME', 'wordpress');
define('DB_USER', 'wordpress');
define('DB_PASSWORD', 'password');
define('DB_HOST', 'db:3306');

这里 db:3306 用别名表示数据库,方便记忆和书写,可以通过 docker 命令 –link 设置,link 可以实现 docker 容器内互相通信。安装完 mysql 后重启 php:

docker rm -f php
docker run --name php -v /data/wordpress/src:/var/www/html --link mysql:db -d php:7.3-fpmx

主题

将主题 zip 包复制到源码目录 wp-content/themes 下解压后,在 wordpress 的后台管理界面就可以看到主题。这里推荐一款比较喜欢的主题,coogee,可以直接点击这里进行下载。

插件

将插件 zip 包复制到源码目录 wp-content/plugins 下解压后,在 wordpress 的后台挂你就可以看到插件列表,对于技术博客,离不开的插件就是代码高亮,这里推荐一款代码高亮的插件 Google Syntax Highlighter,点击这里可以直接下载。

写在最后

搭建一个个人博客并不是一件容易的事,还需要有一个域名,有了域名后还需要备案,如果你有过备案的经历你就懂了,还需要解决 markdown 到 wordpress 的转换,目前用了几个插件都不是很理想,主要是代码无法兼容高亮插件,这一点比较头疼,自己有过冲动想自己写一个 markdown 到 wordpress html 的转换程序,这当然是后话了。

正文完
 0