使用容器搭建 WordPress

1. 前言

作为一个程序员,大家都有一个使用自己域名搭建一个网站的心愿,哪怕这个网站是一个 WordPress。

从 2015 年第一篇博客算起,写了五年了。当初搭建的时候为了图便宜(每年 60 人民币)使用了万网的云虚拟主机,彼时万网还没有被阿里收购。

现在,万网的云虚拟主机虽然还能接着续,但是时不时就因为资源消耗超标被关闭。恰好,为了一些不知名的原因,我在 Vultr 购买了 VPS。我决定充分利用这个 VPS,把我的 WordPress 迁移到这个 VPS 上。

2. 迁移过程

五年前我安装 WordPress 的时候容器技术还没有成熟,我还特意写了一个脚本进行安装。

今天,我决定使用 WordPress 官方镜像来快速搭建,然后迁移数据。

2.1 安装 Docker

有意思的是按照我的理解 Vultr 的 VPS 就是一个单独的容器。也就是说,接下来我们要在容器里面跑容器,就是容器的套娃。

首先我们按照官方文档安装 Docker:

apt-get update
apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
apt-key fingerprint 0EBFCD88
add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io

2.2 安装数据库

# 安装数据库
apt-get install mariadb-server

# 启动数据库
systemctl start mariadb

2.3 创建用户和授权

接下来我们要为 WordPress 创建数据库以及专属的用户并分配权限。

create database wordpress;
grant all privileges on wordpress.* to '<user>'@'172.17.0.2'  identified by '<password>';
flush privileges;

这里要注意的是 IP 部分写死了 172.17.0.2,这是 WordPress 容器访问所用的地址。

2.4 启动服务

docker run --name wordpress -e WORDPRESS_DB_HOST=172.17.0.1 -e WORDPRESS_DB_USER=wordpress -e WORDPRESS_DB_PASSWORD=wordpress -p 8000:80 -d wordpress

注意,我们把 WordPress 暴露的 80 端口映射到了宿主机(容器)的 8000 端口。

然后我们访问 VPS 的 8000 端口初始化 WordPress。

选择语言:

image-20200306004951786

基本设置:

image-20200306005123378

然后就结束了:

image-20200306005150137

2.5 数据迁移

2.5.1 安装插件

这里我们要介绍一个 WordPress 的插件来做迁移,名字叫做:All-in-One WP Migration

image-20200306005323777

这个插件的新版本在导入备份的时候会卡在 100% 的进度,大家可以先先下载,然后上传压缩包进行安装,下载地址可以点这里

2.5.2 备份和下载

然后使用导出功能:

image-20200306005445188

导出完成后下载到本地:

image-20200306005518211

2.5.3 修改上传文件的大小限制

在向新站点恢复数据之前,我们要修改 WordPress 上传文件的大小上限。参考这篇文章:How to Increase Maximum Upload File Size in WordPress

具体的执行方法:

root@MyHost:~# docker exec -it wordpress /bin/bash
root@ded70a3e6cab:/var/www/html# echo 'php_value upload_max_filesize 128M
php_value post_max_size 128M
php_value memory_limit 256M
php_value max_execution_time 300
php_value max_input_time 300' >> /var/www/html/.htaccess

2.5.4 恢复数据

下面在新站点导入备份数据,注意这里上传文件的大小,上面的修改生效了。

image-20200306154815174

中间会有提示,继续就好:

image-20200306154958077

显示完成:

image-20200306155034388

用原来的账号重新登录,提示要升级数据库:

image-20200306155154449

反正选择升级就好了。

至此,迁移完毕。

3. 后记

建议大家在初始化新站点之前先配置好域名,否则初始化会把当时的访问地址记下来,这个就容易悲剧了!

告别万网的云虚拟主机,可以起飞了!

Supervisor 极简入门

1. 前言

最近收到防疫的影响,闷在家里闲的发慌,就想在 VPS 上造一两个轮子。

造完轮子要作为后台进程部署,避免在终端退出后应用也顺带退出,这里一般可以考虑以下几种方法:

  • tmux 或者 screen
  • nohup
  • setsid
  • supervisor

这里我就不一一介绍了,反正选了 supervisor 作为最后的方案。

 

2. 安装与配置

通过 pip 安装:

sudo pip install supervisor

supervisor 的配置文件命名为 supervisord.conf,它为 supervisord(supervisor 的主服务命令) 和 supervisorctl(Supervisor 的监控管理命令)提供配置选项设置。 supervisor 并不规定配置文件 supervisord.conf 的存放位置,Supervisor 服务启动的时候默认会在:

  • $CWD/supervisord.conf
  • $CWD/etc/supervisord.conf
  • /etc/supervisord.conf

这几个目录位置查找配置文件 supervisord.conf

supervisor 也提供参数 -c 来指定配置文件的目录路径。

2.1 服务的配置文件

在终端输入 echo_supervisord_conf 命令可查看 supervisor 的默认配置的内容。

生成一份默认的配置文件:

echo_supervisord_conf > /path/to/supervisord.conf

或者直接使用下面给出的一份配置,保存为 /path/to/supervisord.conf

[unix_http_server]
file=/tmp/supervisor.sock

[inet_http_server]
port=0.0.0.0:9001
username=<user>
password=<password>

[supervisord]
logfile=/tmp/supervisord.log
logfile_maxbytes=50MB
logfile_backups=10
loglevel=info
pidfile=/tmp/supervisord.pid
nodaemon=false
minfds=1024
minprocs=200

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock

[include]
files = supervisord.d/*.ini

改动主要体现为两点:

  • [inet_http_server] 标签指定了可以通过 web 访问 supervisor 的地址以及账户认证信息。
  • [include] 标签来指定应用的配置信息的目录。要在建立 /path/to/supervisord.d 目录来保存应用的配置文件,与 supervisord.conf 文件同层级。

2.2 应用配置模版

配置文件的文件路径为:/path/to/supervisord.d/<APP_NAME>.ini

[program:<APP_NAME>]
autorestart = true
autostart = true
command = <command>
directory = <path_to_program>
environment = <key>="<value>"[,<key>="<value>"...]
killasgroup = true
loglevel = info
numprocs = 1
startsecs = 1
stderr_logfile = <path_to_err_log_file>
stdout_capture_backups = 1MB
stdout_events_enabled = false
stdout_logfile = <path_to_out_log_file>
stdout_logfile_backups = 5
stdout_logfile_maxbytes = 50MB
stopasgroup = false
stopwaitsecs = 10

3. 常用命令

# 启动 supervisor
python /usr/local/bin/supervisorctl -c /path/to/supervisord.conf

# 查看状态
supervisorctl -u <user> -p <password> status [<APP_NAME>]

# 重载配置文件
supervisorctl -u <user> -p <password> reload [<APP_NAME>]

# 重启、关闭应用
supervisorctl -u <user> -p <password> restart <APP_NAME>
supervisorctl -u <user> -p <password> stop <APP_NAME>

# tail 日志
supervisorctl -u <user> -p <password> tail <APP_NAME>