背景
最近入手了一台阿里云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的转换程序,这当然是后话了。