WordPress docker升级调整记录
不知不觉博客已经搭建了6年有余,18年到现在,当时使用的WP版本早已过时,虽然可以自动更新到最新版,但是使用的PHP版本较旧,终于到了连自动更新都更不上的时候了。因此萌生了一下重新升级安装一下WP的想法。由于原本的博客就是运行在docker里,因此升级的方法也依赖于容器的重新部署,以下内容仅为个人折腾的记录,并不作为可分享的高质量内容。
零、原始博客内容备份
一开始博客通过WordPress建站笔记(1)方法搭建,现在需要顺着继续。
原始博客内容可以通过Updraft备份插件可以很方便的进行备份。备份完后产生的文件在/wp-content/updraft/文件夹中。使用docker复制命令复制出来保存:
docker cp 容器id:/var/www/html/wp-content/updraft/ updraft/
一、重新设置容器
这一步其实与当年如出一辙,只需要拉取最新的wordpress和mariadb的镜像即可。需要注意的是,原始的博客容器都需要停止之后再启动新的,否则端口就冲突了。
启动wordpress容器:
docker run --name wp2024 -p 80:80 -p 443:443 -e WORDPRESS_DB_HOST=内网IP:3306 -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=密码 -d --restart=always wordpress:latest
启动数据库容器:
docker run --name mdb2024 -p 内网IP:3306:3306 -e MYSQL_ROOT_PASSWORD=密码 -d --restart=always mariadb:latest
然后需要初始化wp的数据库。
1、进数据库docker:
docker exec -it id bash
2、然后登录数据库执行:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
create database wordpress;
执行完毕后,需要重启wordpress容器,否则无法访问。(神秘bug+1)
二、博客数据恢复
这时候,wordpress就成功初始化了。通过IP访问网站,可以看到wordpress的初始安装页面。设置完成后,就可以登入后台安装updraft插件了。
这时候,同样的通过docker命令,再把之前备份的数据复制回新的容器内:
docker cp updraft/ 容器id:/var/www/html/wp-content/updraft/
在updraft插件中先恢复数据库,再恢复其他的。(因为恢复完数据库之后需要点击升级数据库,或许会对其他信息有影响。另外恢复完数据库之后原有的账号数据会被覆盖,需要使用旧有的账号密码登录后台之后再做下一步操作。)
不出意外的话,数据就都回来了。但是插件与主题只是恢复了,但不会自动启用,还需要自己手动将主题改回来和启动插件。
三、重设HTTPS证书
此时复原完成后,默认还是http访问,关联的网站站点也是IP访问,还需要重新设置为https域名访问。
既然都升级了,那么把https的证书也好好搞一搞。之前一直用的是cloudflare的服务,实现了客户端到CDN之间的HTTPS连接,但是CDN到服务器之间的连接却没有有效保证。因此顺便把服务器端的证书认证也给解决了。
在cloudflare中,新建一个源服务器证书,可以看到对应的PEM和KEY证书的文本框,分别将其保存为pem文件证书和key文件私钥即可。需要注意的是,由于windows和linux常见的\R和\R\N的差异问题,手动保存完证书之后还需要验证证书文件的有效性,以防复制进去格式错误导致docker起不来。
随机找一个test.txt文件,使用私钥签名,生成sig签名文件:
openssl dgst -sha256 -sign ssl-cert-snakeoil.key -out test.sig test.txt
从pem证书中提取公钥:
openssl x509 -in ssl-cert-snakeoil.pem -noout -pubkey > test.pub.cer
对test.txt验签:
openssl dgst -sha256 -verify test.pub.cer -signature test.sig test.txt
提示Verified OK则成功
然后进入docker容器中,导入证书:
1、加载Apache SSL模块
在wordpress容器中输入a2enmod ssl,
a2enmod ssl
第一次会加载,并且提示重启Apache,直接重启容器即可
docker restart wordpress容器id
2、绑定SSL证书
Apache 加载 SSL 模块后,会在 /etc/apache2/sites-available 下生成 default-ssl.conf 文件,编辑该文件,可以看到
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
上述两行配置就是证书的存放位置,我们只需要把第三方可信CA签发的证书相应的文件上传至对应位置即可。需要注意的是证书格式正确
docker cp ssl-cert-snakeoil.key 容器id:/etc/ssl/private/ssl-cert-snakeoil.key
docker cp ssl-cert-snakeoil.pem 容器id:/etc/ssl/certs/ssl-cert-snakeoil.pem
然后重启wordpress容器,不报错即成功。
四、后续配置与CDN设定
在wordpress后台设定中,将Worspress地址和站点地址都改为现在使用的https域名并保存。此时不出意外的话,站点就是以https的形式访问的了。
设置完后,检查文章会发现有些之前的图片会因为初始化的原因,链接至原始的IP,从而导致无法加载。安装Update URLs插件即可解决。不过最好的方法还是在引用图片的时候均使用相对地址而不是携带域名的绝对地址。
最后,因为在服务器上已经安装了cf的证书,因此将cloudflare的SSL/TLS设置改为完全(严格)模式,以保证安全性。
szhshp
2024年8月23日 下午10:08
哦哈哈哈我最近也在改博客,说来也很好笑,十年前开始大家从服务端渲染转为了spa客户端渲染,现在开始大家又从客户端转为服务端。😂
dexter
2024年9月13日 上午12:27
请问内网IP应该怎么填写?我填写的本机IP并按照步骤配置mariadb并重启wordpress后仍旧不能通过访问本机公网IP来打开wordpress界面
gt4404gb
2024年9月25日 下午9:46
我的配置是用了一个172网段的内网IP。如果使用127.0.0.1的话会指向docker容器内的IP而不是物理机,从而导致出问题。如果没有合适的内网IP的话,也可以直接写公网IP,然后用防火墙限制这个端口只能本机访问
Alliot
2024年10月14日 下午3:48
数据库连接的话,如果docker使用同一个network, 可以直接用container名作为hostname. 就不用写IP了