使用容器搭建 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. 后记

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

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

将WordPress安装或者迁移到万网虚拟机上

万网虚拟机

前一阵子在远景论坛上看到万网的虚拟主机免费,果断申请了一个来使用。使用期间也第一次领教了备案带来的麻烦,好在万网的备案服务还是很好很迅速的,幕布的快递也很给力,就是工信部的审核花了十几天时间。从后台的显示来看,万网的虚拟机可以免费使用两年。这个域名note4code.com也是在万网上购买的,49元/年的价格还算公道。

WordPress的安装

万网的虚拟机使用的操作系统是 CentOS,支持 MySQL和 PHP5.3。WordPress 在该虚拟机上的安装比在 Ubuntu 上安装简单多了(参见上一篇博客在 Ubuntu 上安装 WordPress),不需要安装和设置 Apache2、MySQL 和 PHP,不需要为了修改 URL 而进行的大量操作。安装步骤简单概括就是:

  • 下载 WordPress 源代码。
  • 解压缩文件,创建uploads(wp-content/uploads)文件夹。
  • 复制 wp-config-sample.php,重命名为 wp-config.php 并修改其内容。
/** The name of the database for WordPress */
define('DB_NAME', 'database_name_here');

/** MySQL database username */
define('DB_USER', 'username_here');

/** MySQL database password */
define('DB_PASSWORD', 'password_here');

/** MySQL hostname */
define('DB_HOST', 'localhost');

修改为:

/** The name of the database for WordPress */
define('DB_NAME', 'qdmxxxxxxxxx_db');

/** MySQL database username */
define('DB_USER', 'qdmxxxxxxxxx');

/** MySQL database password */
define('DB_PASSWORD', 'xxxxxxxx');

/** MySQL hostname */
define('DB_HOST', 'qdmxxxxxxxxx.my3w.com');
  • 将所有文件复制到 FTP 服务器的 htdocs 目录下。
  • 登录你的域名(审核已通过的情况下),跟随界面操作。

关于WordPress的迁移

可能不少 WordPress 的用户和我一样,在审核期间就现在本地的 WordPress 上写起了博客,打算在审核通过后再将数据迁移到网上,由于网上相关的经验比较少,我也是花了好几天才摸索出了一套方法。

1.导出上传的图片

在写博客的时候不可避免会用到一些图片,这些图片应该都存在我们建立的 uploads 文件夹里,在向 FTP 服务器复制文件的时候记得将原来的 uploads 文件夹合并到 FTP 上去。

2.导出数据库

我们的文章都存在数据库中,所以 WordPress 的迁移本质上是数据库的迁移,我们首先导出数据库:

mysqldump -u wpuser -p wordpress > wordpress.sql

输入该用户的密码后我们得到一个名为 wordpress.sql 的文件,打开文件删除所有类似 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; 的语句和注释,仅保留创建表和插入数据的语句。然后使用 Vim(没错,我支持 Vim)的全局替换字符串功能,将 localhost/wordpress 替换为你的域名。

3.导入数据库

进入虚拟主机数据库的管理界面,导入我们修改好的脚本即可。至此大功告成!

注意:在导入数据前最好将本地WordPress使用的插件在虚拟主机上提前装好,避免数据出现错误或者不一致的情况!

在Ubuntu上安装WordPress(附脚本)

WordPress简介

WordPress是一种使用PHP和MySQL开发的博客平台,其实对个人来说也可以当做一个像印象笔记一样的个人知识、内容管理平台。同时各种第三方的插件、主题也让WordPress具备了独特的个性化选择。

手动安装WordPress

安装WordPress相对来说是一个比较简单的过程,只要按照以下步骤执行,一般都可以顺利安装。

1.安装依赖的软件包

第一步要在Ubuntu上安装WordPress所依赖的MySQL、Apache2、PHP等软件包,具体安装方法如下:

sudo apt-get install apache2
sudo apt-get install libapache2-mod-php5 php5
sudo apt-get install mysql-server-5.0  mysql-common mysql-admin
sudo apt-get install php5-mysql

2.配置MySQL

在上一步中安装完MySQL之后记住MySQL的root用户的密码,在这一步中将会使用。使用如下命令来进入MySQL数据库:

mysql -u root -p

然后输入密码进入MySQL。接着我们创建WordPress所使用的数据库:

create database wordpress;

接着为WordPress创建用户并将数据库wordpress的所有权限赋予这个用户:

create user wpuser@localhost identified by 'wppasswd';
grant all privileges on wordpress.* to wpuser@localhost;
flush privileges;

3.下载并安装WordPress

WordPress的安装文件既可以访问中文官方网站进行下载,也可以使用wget命令下载:

wget -c http://wordpress.org/latest.tar.gz

下载完成后解压文件,复制 wp-config-sample.php 文件并重命名为 wp-config.php,并将相关参数进行替换,将

/** The name of the database for WordPress */
define('DB_NAME', 'database_name_here');

/** MySQL database username */
define('DB_USER', 'username_here');

/** MySQL database password */
define('DB_PASSWORD', 'password_here');

/** MySQL hostname */
define('DB_HOST', 'localhost');

修改为:

/** The name of the database for WordPress */
define('DB_NAME', 'wordpress');

/** MySQL database username */
define('DB_USER', 'wpuser');

/** MySQL database password */
define('DB_PASSWORD', 'wppasswd');

/** MySQL hostname */
define('DB_HOST', 'localhost');

其中’DB_HOST’因为MySQL就在本地所以就不用修改localhost,如果数据库位于其他服务器那么就应该填写相应域名或者IP地址。

4.拷贝WordPress解压文件至Apache2服务器目录下

我们要将解压出来的wordpress文件夹拷贝至/var/www/html/下面,为其创建uploads文件夹(保存上传的图片)并修改文件的拥有者为www-data。

sudo rsync -avP ./wordpress /var/www/html/
sudo mkdir /var/www/html/wordpress/wp-content/uploads
sudo chown -R www-data:www-data /var/www/html/wordpress/*

5.安装MySQL扩展

如果遇到“ Your PHP installation appears to be missing the MySQL extension which is required by WordPress ”的情况,一般在 /etc/php5/apache2/php.ini 中将“ extension=/path/to/extension/mysql.so ”改为“ extension=mysql.so ”就可以了。

6.修改apache2的配置文件来允许URL的重写

本步骤的目的是为了允许WordPress能够自定义固定链接的格式。在/etc/apache2/sites-available/000-default.conf中添加下文星号包括的部分:

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
    *ServerName 127.0.0.1*
    *<Directory /var/www/html/>*
        *AllowOverride All*
    *</Directory>*
    . . .

然后使用如下命令来允许URL的重写以及Apache2的重启:

sudo a2enmod rewrite
sudo service apache2 restart

最后创建 .htaccess 文件并修改其权限与所有者:

touch /var/www/html/wordpress/.htaccess
sudo chown :www-data /var/www/html/wordpress/.htaccess
chmod 664 /var/www/html/wordpress/.htaccess

7.著名的5分钟安装

打开浏览器登录 http://localhost/wordpress 按照图形界面的提示操作即可。

Shell脚本

以下的脚本本人亲测,使用了expect命令来简化设置过程,并添加了几个步骤来修正可能出现的问题.

#!/bin/sh

if [ $# -ne 4 ]; then
    echo "Usage: sudo sh $0 db_name user_name user_passwd mysql_root_passwd"
    exit 1
fi

db_name=$1
user_name=$2
user_passwd=$3
mysql_root_passwd=$4

install_dependency(){
    #1. install the dependency of wordpress
    sudo apt-get install apache2
    sudo apt-get install libapache2-mod-php5 php5
    sudo apt-get install mysql-server mysql-common
    sudo apt-get install php5-mysql
}

config_mysql(){
    #2. configure mysql
sudo apt-get install expect
expect << EOF
set timeout 100
spawn mysql -u root -p
expect {
    "Enter password:" {send "$mysql_root_passwd\r"}
}
expect "mysql>"
send "create database $db_name;\r"
expect "mysql>"
send "create user $user_name@localhost identified by '$user_passwd';\r"
expect "mysql>"
send "grant all privileges on $db_name.* to $user_name@localhost;\r"
expect "mysql>"
send "flush privileges;\r"
expect "mysql>"
send "exit\r"
EOF
}

install_wordpress(){
    #3. install wordpress
    #3.1 download the wordpress
    wget -c http://wordpress.org/latest.tar.gz
    #3.2 extract the files to rebuild wordpress
    tar xvfz latest.tar.gz
    sudo rm -f latest.tar.gz
    #3.3 install some packages to allow you to work with images, install plugins and update portions of your site using ssh.
    sudo apt-get install php5-gd libssh2-php
}

config_wordpress(){
    #4. configure wordpress
    sed "s/database_name_here/$db_name/" ./wordpress/wp-config-sample.php | sed "s/username_here/$user_name/" | sed "s/password_here/$user_passwd/" >> ./wordpress/wp-config.php
}

copy_files(){
    #5. copy files to the document root
    sudo rsync -avP ./wordpress /var/www/html/
    sudo rm -rf ./wordpress
    sudo mkdir /var/www/html/wordpress/wp-content/uploads
    sudo chown -R www-data:www-data /var/www/html/wordpress/*
}

install_mysql_extension(){
    #6. when the problem "Your PHP installation appears to be missing the MySQL extension which is required by WordPress" occurs, you need this.
    sudo sed -i "s/extension=\/path\/to\/extension\/msql.so/extension=mysql.so/" /etc/php5/apache2/php.ini
}

modify_apache_to_allow_url_rewrites(){
    date_time=$(date +%y%m%d%H%M)
    sudo cp /etc/apache2/sites-available/000-default.conf "/etc/apache2/sites-available/000-default.conf.$date_time.bak"
    sudo sed -i "/<\/VirtualHost>/i \        ServerName 127.0.0.1\n        <Directory \/var\/www\/html\/wordpress\/>\n            AllowOverride All\n        <\/Directory>" /etc/apache2/sites-available/000-default.conf
    sudo a2enmod rewrite
    sudo echo 'ServerName localhost' >> /etc/apache2/apache2.conf
    sudo service apache2 restart
}

create_htaccess_file(){
    touch /var/www/html/wordpress/.htaccess
    sudo chown :www-data /var/www/html/wordpress/.htaccess
    chmod 664 /var/www/html/wordpress/.htaccess
}

#install_dependency
config_mysql
install_wordpress
config_wordpress
copy_files
install_mysql_extension
modify_apache_to_allow_url_rewrites
create_htaccess_file

exit 0

参考资料