记录下迁移主机WordPress笔记



前言

旧的WordPress和VPS版本都太老了,系统还是Centos7,问题越来越多了再加上当年的胡乱捣鼓留下了好多的问题,所以打算迁移一下。新的系统决定更换为Debian12,这个属于笔记不是教程,所以可能会有问题。

前期准备工作

开通服务器

我是使用的Linode的服务器,如果你希望国内能够访问,你在创建完系统以后一定一定一定要先去测试下你的IP地址国内能不能访问,用什么工具你随便,我是用的站长之家的ping测试。如果不正常,你需要 删除这台机器→再开一台新的→测试,直到正常为止。

更换端口

这里提说一下,经验之谈,无证据。最好不要上来就用22端口直接国内访问,大概率过几天你这个IP国内就又无法访问了=、=你可以挂个代理或者自己用Linode官方提供的网页控制台(Glish)来操作。改了端口以后会好非常多。

我这里使用的是xshell来操作的。

在改22端口之前,这里我们先备份一下


cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

编辑sshd_config


nano /etc/ssh/sshd_config

里面会有一行注释


#Port 22

删除#用来取消注释,并将22换成你喜欢的端口号,1024-65535之间,最好选高于10000,的比如23333

防火墙配置

这里我使用的是ufw


apt install -y ufw

ufw allow 23333/tcp

ufw enable #这里会在启动时询问,输入y

ufw status #这里看到 23333/tcp ALLOW 就是配置成功了

可选:

  • 现在下载的都是自动自动打开IPV6的,如果你需要调整

nano /etc/default/ufw

根据自己需求修改进站出站规则,修改是否支持IPV6

重启sshd服务


systemctl restart ssh

不要关闭当前窗口会话,新建一个会话,填你的IP,新端口,测试连接,万一不行的话还能用旧的窗口来救,去官方网页控制台也能救。

密钥登陆

生成ssh密钥,将公钥的内容添加到~/.ssh/authorized_keys内,重启sshd。xshell内用户登录验证选择public key设置好你的私钥。

安装python-is-python3(可选)

Debian自带python3,但是以防万一哪些乱七八糟的东西他用python会直接找不到的


apt install python-is-python3  # 创建 /usr/bin/python -> python3 的软链接

安装docker compose

懒人脚本版:


curl -fsSL https://get.docker.com -o get-docker.sh

sh get-docker.sh

国内访问不了的话增加--mirror Aliyun参数

具体可以参考这里:https://github.com/docker/docker-install/

非脚本版:

请读懂再考虑用哪个命令安装,这个是我按照其它大佬的教程复制的,这不是完全按照官方给的文档安装的。

虽然我写了出来,但最后我还是按照官方文档安装的,我会在下面写出大佬的教程和官方文档的区别,自行选择。

首先,安装一些必要的软件包:


apt update

apt upgrade -y

apt install curl vim wget gnupg dpkg apt-transport-https lsb-release ca-certificates

然后加入 Docker 的 GPG 公钥和 apt 源:

请注意这里将公钥放在了/usr/share/keyrings/目录下,而官方给出的安装方式是放在了/etc/apt/keyrings/


curl -sSL https://download.docker.com/linux/debian/gpg | gpg --dearmor > /usr/share/keyrings/docker-ce.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-ce.gpg] https://download.docker.com/linux/debian $(lsb_release -sc) stable" > /etc/apt/sources.list.d/docker.list

apt-get update

这里给出官方文档提供的设置,公钥的位置不一样(注意写注释的地方和权限问题):


# Add Docker's official GPG key:

sudo apt-get update

sudo apt-get install ca-certificates curl

#从这里开始注意

sudo install -m 0755 -d /etc/apt/keyrings

sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc

sudo chmod a+r /etc/apt/keyrings/docker.asc

  

# Add the repository to Apt sources:

echo \

  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \

  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \

  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update

这里不介绍设置镜像方式了,我的服务器不在国内,懒.jpg

开始安装docker 和docker compose


apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

官方的命令行如下,相比上面的多安装了buildx这个是用来做多平台镜像构建的,按需吧


sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

docker version确认下安装是否成功

docker和ufw防火墙的注意事项

这里我用的ufw防火墙,如果docker容器启动以后,你会发现docker会无视防火墙,公网依旧可以访问docker容器的端口。所以要额外处理。

手动修改版

教程地址,点击跳转

目前新的解决方案只需要修改一个 UFW 配置文件即可,Docker 的所有配置和选项都保持默认。

修改 UFW 的配置文件 /etc/ufw/after.rules,在最后添加上如下规则:


# BEGIN UFW AND DOCKER

*filter

:ufw-user-forward - [0:0]

:ufw-docker-logging-deny - [0:0]

:DOCKER-USER - [0:0]

-A DOCKER-USER -j ufw-user-forward

  

-A DOCKER-USER -j RETURN -s 10.0.0.0/8

-A DOCKER-USER -j RETURN -s 172.16.0.0/12

-A DOCKER-USER -j RETURN -s 192.168.0.0/16

  

-A DOCKER-USER -p udp -m udp --sport 53 --dport 1024:65535 -j RETURN

  

-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 192.168.0.0/16

-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 10.0.0.0/8

-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 172.16.0.0/12

-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 192.168.0.0/16

-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 10.0.0.0/8

-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 172.16.0.0/12

  

-A DOCKER-USER -j RETURN

  

-A ufw-docker-logging-deny -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW DOCKER BLOCK] "

-A ufw-docker-logging-deny -j DROP

  

COMMIT

# END UFW AND DOCKER

然后重启 UFW,sudo systemctl restart ufw。现在外部就已经无法访问 Docker 发布出来的任何端口了,但是容器内部以及私有网络地址上可以正常互相访问,而且容器也可以正常访问外部的网络。可能由于某些未知原因,重启 UFW 之后规则也无法生效,请重启服务器。

如果希望允许外部网络访问 Docker 容器提供的服务,比如有一个容器的服务端口是 80。那就可以用以下命令来允许外部网络访问这个服务:


ufw route allow proto tcp from any to any port 80

这个命令会允许外部网络访问所有用 Docker 发布出来的并且内部服务端口为 80 的所有服务。

请注意,这个端口80是容器的端口,而非使用-p 0.0.0.0:8080:80选项发布在服务器上的8080端口。

如果有多个容器的服务端口为80,但只希望外部网络访问某个特定的容器。比如该容器的私有地址为172.17.0.2,就用类似下面的命令:


ufw route allow proto tcp from any to 172.17.0.2 port 80

如果一个容器的服务是 UDP 协议,假如是 DNS 服务,可以用下面的命令来允许外部网络访问所有发布出来的 DNS 服务:


ufw route allow proto udp from any to any port 53

同样的,如果只针对一个特定的容器,比如 IP 地址为172.17.0.2


ufw route allow proto udp from any to 172.17.0.2 port 53

使用脚本ufw-docker 工具(和手动二选一)

安装:


sudo wget -O /usr/local/bin/ufw-docker \

  https://github.com/chaifeng/ufw-docker/raw/master/ufw-docker

chmod +x /usr/local/bin/ufw-docker

使用下列命令来修改 ufw 的after.rules文件


ufw-docker install

因为我没使用Docker Swarm,所以其它的命令同上面的手动修改。

使用docker compose部署MySQL8和WordPress

这里开始就会是我自己极其混乱的笔记了,因为我还有很多其他的容器要部署,所以不会按照正常的教程安装,我会按照我的需求来写yml文件。

主体思路是WordPress和MySQL的容器分开,MySQL使用MySQL8,这样因为我还要部署其它使用MySQL的项目就可以直接使用这个了,方便我后面修改和维护。数据库分开,使用init.sql创建多个数据库给不同的容器来用。

MySQL

MySQL的官方镜像页面:https://hub.docker.com/_/mysql

根据自己的需求配置好yml文件


services:

  mysql8:

    image: mysql:8.0

    container_name: mysql8

    restart: unless-stopped

    networks:

      - backend

    environment:

      # 这些自己修改

      MYSQL_DATABASE: xxxxxx

      MYSQL_USER: at

      MYSQL_PASSWORD: xxxxxx

      # 统一 root 密码

      MYSQL_ROOT_PASSWORD: xxxxxx

    command: >

      --default-authentication-plugin=mysql_native_password

      --innodb-buffer-pool-size=64M

      --performance_schema=OFF

    volumes:

      - mysql_data:/var/lib/mysql

      - ./init.sql:/docker-entrypoint-initdb.d/init.sql

    healthcheck:

      test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1"]

      interval: 10s

      timeout: 5s

      retries: 3

      start_period: 30s

  

networks:

  backend:

    name: mysql8_net

volumes:

  mysql_data:

因为自己的机器内存很低,所以增加了些额外的参数。

其中的command部分

--default-authentication-plugin=mysql_native_password兼容老客户端

--innodb-buffer-pool-size=64M调小Inn哦DB缓存池,省内存

--performance_schema=OFF关闭性能监控表,省内存

将MySQL的数据目录挂在了mysql_data的命名卷,真实路径在/var/lib/docker/volumes/mysql_data/_data

同时因为我需要两个库,一个给WordPress,一个给gemini-balance,所以使用了初始化脚本init.sql将其挂在在/docker-entrypoint-initdb.d/init.sql这样MySQL启动的时候就会先去执行这个脚本:


CREATE DATABASE IF NOT EXISTS wp;

CREATE DATABASE IF NOT EXISTS gb;

-- 如果只想给特定库授权,可写成

-- GRANT ALL PRIVILEGES ON wp.* TO 'at'@'%';

-- GRANT ALL PRIVILEGES ON gb.* TO 'at'@'%';

-- 下面这句一次性给所有库也行:

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

FLUSH PRIVILEGES;

注意,这个脚本仅仅会在mysql8第一次运行的时候会使用,以后就再也不会调用了,你如果还需要添加数据库,请进入容器手动添加。

WordPress

WordPress的官方镜像页面:https://hub.docker.com/_/wordpress

WP的yml,还是根据自己需求修改:


services:

  wordpress:

    image: wordpress:latest

    container_name: wordpress

    restart: unless-stopped

    networks:

      - mysql8_net

    ports:

      - "8080:80"

    environment:

      WORDPRESS_DB_HOST: mysql8

      WORDPRESS_DB_USER: at

      WORDPRESS_DB_PASSWORD: xxxxxx

      WORDPRESS_DB_NAME: wp

    volumes:

      - wp_data:/var/www/html

  

networks:

  mysql8_net:

    external: true

volumes:

  wp_data:

内部容器通过mysql8_net来连接通信,这里还有注意下restart: 因为MySQL和WP是两个容器我们没办法用depends_on,他们是分开启动的,大概率MySQL启动更慢,所以WP会先启动然后发现没数据库崩了。所以让它崩了继续重启,直到MySQL启动为止。用always或者unless-stopped

进入到你的yml文件的位置,然后使用命令启动容器。


cd mysql8

# 我已经进入到了MySQL的docker compose配置文件所在地了,先启动MySQL的同时再启动WordPress

docker compose up -d && \

cd ../wordpress && \

docker compose up -d

如果使用ufw防火墙想尝试用ip访问,记得按照上面的文章设置好端口的防火墙

然后你可以尝试使用IP+映射的宿主机端口访问,查看是否成功安装

看到能选语言界面就可以了!最好不要注册安装!不要注册安装!不要注册安装!

下面我会说下我碰到的坑。

WordPress安装完成后踩坑

一句话总结:如果用IP+端口登录安装WP会导致后面配置完反代和SSL后不停重定向,我未成功解决这个问题,最后选择了清空容器数据重装。

我是边操作边写的这篇笔记。因为我的WP和数据库版本比较老所以迁移会是非常大的问题,所以我第一次的思路是启动了以后使用IP访问WP,并尝试迁移,确保迁移成功以后我再配置反代,SSL,cloudflare等等。

如果你使用IP+端口的方式登录并且选择安装WP,WP会把你的站点地址写进它的数据库里面,同时你在WP的管理员界面设置→常规→WordPress 地址(URL)和站点地址(URL)这两个,会写成你的IP+端口并且是http的。

当我迁移完,配置完反代,SSL,cloudflare以后我发现使用域名登录会被多次重定向,使用F12看到最后被发了301,并且我会被重定向到域名+端口号。但其它docker容器反代均正常。想到应该是WP设定的博客地址和反代的地址不一样导致的,因为最初我是使用的IP完成最后WP安装的。请注意,最好在无痕浏览状态下测试,并且确保每次测试前你清空了浏览器数据,chrome的话是在无痕浏览下按Ctrl+Shift+Delete。
我尝试了以下方法:

  • 使用IP进入WP的管理员界面设置→常规修改了WordPress 地址(URL)和站点地址(URL)变成https的域名。测试:失败,并且再也无法使用IP进入到WP的管理界面了(悲)

  • 既然如此是不是数据库里面的没改?进入MySQL的容器,查找并替换,提示两处替换。测试:失败,还是会被重定向到域名+端口号。


  UPDATE wp_options SET option_value='https://www.crowsong.xyz' WHERE option_name='home' OR option_name='siteurl';

  • 那我直接在修改wp-config.php文件,强制让他跳转到正确的地址,在/* That's all, stop editing! Happy publishing. */这行的上面写下如下代码:

define('WP_HOME', 'https://crowsong.xyz');

define('WP_SITEURL', 'https://crowsong.xyz');

if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {

    $_SERVER['HTTPS'] = 'on';

}

测试:失败,他还是重定向到域名+端口号

这玩意有毒吧=、=,那我去数据库里面搜搜还有没有这个端口号(因为我映射的不是默认的8080所以很好找),没找到。。。我尝试换了台新设备登录,万一是缓存没删干净呢,结果还是会重定向到域名+端口号。。。。。老实讲我觉得这玩意不是什么大问题啊。。。怎么这么坑。。。。去网上搜了搜也没找到其他解决方法。。无奈,只能清空WP和MySQL的数据。docker compose down -v然后起个新的容器。。。因为这时候我已经配置好了反代,SSL和cloudflare了。所以重启后再次安装WP就都正常了。。就是又迁移了一次数据。。。所以推荐先设置好反代,SSL什么的以后再去登录WordPress完成最后的安装

使用docker compose部署gemini-balance

跟WordPress无关,这是我自己使用的东西,但是他也要依赖MySQL所以也写在这里了。主要是演示下其他容器怎么和MySQL通信。

项目地址:https://github.com/snailyp/gemini-balance

在项目里面有docker compose的文件示例和.env文件示例,根据自己需求修改,我这里需要让其连接到我的MySQL8而不要再启动一个了。

自己的yml文件:


services:

  gemini-balance:

    image: ghcr.io/snailyp/gemini-balance:latest

    container_name: gemini-balance

    restart: unless-stopped

    networks:

      - mysql8_net

    ports:

      - "9999:8000"

    env_file:

      - .env

    environment:

      MYSQL_HOST: ${MYSQL_HOST}

      MYSQL_DATABASE: ${MYSQL_DATABASE}

      MYSQL_USER: ${MYSQL_USER}

      MYSQL_PASSWORD: ${MYSQL_PASSWORD}

    healthcheck:

      test: ["CMD-SHELL", "python -c \"import requests; exit(0) if requests.get('http://localhost:8000/health').status_code == 200 else exit(1)\""]

      interval: 30s

      timeout: 5s

      retries: 3

      start_period: 10s

  

networks:

  mysql8_net:

    external: true

一样的使用mysql18_net通信。.env文件不便展示,自己看官方文档改就好了。唯一要注意的是MYSQL_HOST=mysql8这个地方写service名。没有反代的话,想要测试请记得ufw设置防火墙放行规则。

设置反代|申请SSL|设置cloudflare|切换DNS到新主机

我是边操作边记录的笔记,我实际上是先迁移后做的这个,但最后崩了。所以我把顺序调了一下,但笔记内容懒得检查再改了。

我使用certbot申请通配符SSL证书,同时使用cloudflare DNS插件来验证。

安装Nginx|Certbot|Cloudflare DNS插件


# 1.1 安装官方 Nginx

apt install -y nginx

  

# 1.2 安装 Certbot 及 Cloudflare DNS 插件

apt install -y certbot python3-certbot-nginx python3-certbot-dns-cloudflare

准备Cloudflare API Token

  • 账户主页(不是你的域名主页)→管理账户→帐户 API 令牌→创建令牌

  • 编辑区域 DNS 使用模板→其它不变,区域资源选择包括 特定区域 crowsong.xyz(你的域名) →创建令牌→记下来

  • 回到新主机,写一个新文件放在哪里都行推荐使用/etc/letsencrypt/cloudflare.ini ,权限600,内容:dns_cloudflare_api_token = 你的Token

  • 记得设置权限!chmod 600 /etc/letsencrypt/cloudflare.ini

提前申请通配符证书


(此时Cloudflare还在指向旧主机,不用改 DNS)

Certbot 的 Cloudflare DNS 插件可以「离线」验证 TXT 记录,无需真正把 A 记录指到新主机,也无需关闭橙云。


certbot certonly \

  --dns-cloudflare \

  --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \

  -d crowsong.xyz -d *.crowsong.xyz \

注意域名要写俩,*.crowsong.xyz是不管crowsong.xyz

然后会让你填邮箱(选填,推荐填写),同意条款,订阅邮件啥的,自己选择。

如果成功会看到这样的内容:


Successfully received certificate.

Certificate is saved at: /etc/letsencrypt/live/crowsong.xyz/fullchain.pem

Key is saved at:         /etc/letsencrypt/live/crowsong.xyz/privkey.pem

This certificate expires on 2025-12-13.

These files will be updated when the certificate renews.

Certbot has set up a scheduled task to automatically renew this certificate in the background.

这里写着我们的公钥和私钥放在了哪里。

certbot会自动更新证书,非常省事。

编写nginx配置

统一放在/etc/nginx/conf.d/目录,文件名随便,我用的是域名

小小声,当年用LNMP一键安装的。。所以nginx不在常规目录。。。。导致后面手动更新更换东西什么的都很地狱,所以这次不偷懒了,自己手动全套的。

WordPress:


# /etc/nginx/conf.d/crowsong.conf

server {

    listen 80;

    listen [::]:80;

    server_name crowsong.xyz www.crowsong.xyz;

    # return 301 https://$host$request_uri; #这个根据你的需求来选择

    return 301 https://crowsong.xyz$request_uri; # 这样写的话会统一将所有的网址规范到同一个域名下方便SEO

}

  

server {

    listen 443 ssl http2;

    listen [::]:443 ssl http2;

    server_name crowsong.xyz www.crowsong.xyz;

  

    ssl_certificate     /etc/letsencrypt/live/crowsong.xyz/fullchain.pem;

    ssl_certificate_key /etc/letsencrypt/live/crowsong.xyz/privkey.pem;

    ssl_protocols       TLSv1.2 TLSv1.3;

    ssl_ciphers         ECDHE+AESGCM:ECDHE+CHACHA20:DHE+AESGCM:DHE+CHACHA20:!aNULL:!MD5:!DSS;

  

    # 反代到 Docker 容器

    location / {

        proxy_pass         http://127.0.0.1:8080;

        proxy_set_header   Host $host;

        proxy_set_header   X-Real-IP $remote_addr;

        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_set_header   X-Forwarded-Proto $scheme;

    }

}

gemini-balance跟这个差不多。

这里我做了些额外的操作,我使用git配合私人仓库来管理这些内容,还有docker compose的容器,免得崩了我找不到曾经我改了什么奇怪的东西。所以我们需要创建一下软链接。

首先我们停用nginx


systemctl stop nginx

# 查看下进程是不是 inactive (dead)

systemctl status nginx

备份下(其实里面没东西)


mv /etc/nginx/conf.d/ /etc/nginx/conf.d.bak/

创建软连接,将opt目录下的conf.d链接到nginx下


ln -s /opt/我的私人仓库名/nginx/conf.d /etc/nginx/conf.d

检查下,然后启动nginx


nginx -t

# 确保上面写的是is ok和successful,再启动

systemctl start nginx

# 检查下运行状态

systemctl status nginx

# 确保是active (running)

正式切换 DNS

在 Cloudflare 控制台把crowsong.xyzgemini-balance的 A 记录指向 新主机公网 IP

同时把 橙色云关掉(点成灰色),否则 80/443 会被 Cloudflare 接管,Nginx 无法直接拿到源站流量,确认正常以后打开橙色云就算完工了。

还要记得查看下cloudflare中的SSL/TLS选项卡,如果是自动的话可能会被配置到关闭(不安全)要手动改成完全(严格)或者 完全

迁移旧主机WordPress数据到新主机

这是我最头疼的部分了,我的旧WP版本是4.9.26,MySQL也是5.5.60。新版WP直接变成了6.8,MySQL8,只能说尝试下。先打算尝试用插件来自动化的迁移数据试试。

备份新主机的WP容器和数据

因为我尝试了很多炸了好几次,所以我还是很推荐备份下,方便回滚,你要是迁移的版本跨度不大或者有信心无所谓。也可以炸了以后直接重装。

备份流程

先备份数据,我们分别将mysql和wp数据挂在了mysql_data和wp_data下,我们将其打包成压缩包并存放在opt/docker-snapshots/目录下


# 卷名就是 compose 里声明的 mysql_data / wp_data

docker run --rm \

  -v mysql_data:/data \

  -v /opt/docker-snapshots:/backup \

  alpine tar czf /backup/mysql_data_$(date +%F_%H-%M).tar.gz -C /data .

  

docker run --rm \

  -v wp_data:/data \

  -v /opt/docker-snapshots:/backup \

  alpine tar czf /backup/wp_data_$(date +%F_%H-%M).tar.gz -C /data .

然后把容器也保存成镜像


docker commit mysql8  mysql8:init

docker commit wordpress  wordpress:init

恢复流程

如果我们需要回滚的话:


cd /opt/docker-apps-linode-us-ca-main/mysql8 && docker compose down -v

cd ../wordpress && docker compose down -v

-v参数把命名卷也删除掉。

恢复卷数据:


# 找到最新的备份文件即可,这里用通配符

docker run --rm \

  -v mysql_data:/data \

  -v /opt/docker-snapshots:/backup \

  alpine sh -c "cd /data && tar xzf /backup/mysql_data_*.tar.gz"

  

docker run --rm \

  -v wp_data:/data \

  -v /opt/docker-snapshots:/backup \

  alpine sh -c "cd /data && tar xzf /backup/wp_data_*.tar.gz"

容器回滚:

修改各自的yml文件把tag换成init即可,例如:


services:

  mysql8:

    image: mysql8:init

...

重启容器就行了。

修改上传文件大小限制(可选)

因为需要上传插件备份过后的文件(虽然最后我没用这条路=、=),所以我们先修改上传文件的大小限制:


# 先看下WordPress的容器ID或者名字

docker ps

# 进入

docker exec -it 容器id或容器名 /bin/shell

先复制一份生产环境的配置模板作为实际生效的配置文件


# 复制配置文件,以便php配置生效

cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini

docker镜像是用的精简过的没有交互式编辑器,所以用sed,可以先cat查看一下。我们需要修改下面这三个参数

注意memory_limit>post_max_size>upload_max_filesize


找到以下三个关键值,修改成你想要的值,

upload_max_filesize = 2M  #文件大小限制

post_max_size = 8M          #post大小限制

memory_limit = 128M       #内存占用限制


cd /usr/local/etc/php

# 查找upload_max_filesize并查看前后五行

cat php.ini | grep "upload_max_filesize " -C 5

修改


sed -i 's/upload_max_filesize.*/upload_max_filesize = 350M/' /usr/local/etc/php/php.ini

sed -i 's/post_max_size.*/post_max_size = 350M/'         /usr/local/etc/php/php.ini

sed -i 's/memory_limit .*/memory_limit = 500M/'         /usr/local/etc/php/php.ini

退出容器

ctrl+d

重启容器


docker restart 容器id

发现还是不够并且我猜还得调整上传超时时间,所以换了一种方法,我们直接把文件复制出来


docker cp <容器名>:/usr/local/etc/php/php.ini ./php.ini

本地修改

再给拷回去然后重启容器


docker cp ./php.ini <容器名>:/usr/local/etc/php/php.ini

docker restart <容器名>

使用插件 All-in-One WP Migration and Backup → 迁移失败

结果发现这个All-in-One WP Migration and Backup插件并不好用,放弃。说下缺点:它的免费版必须要求你从WP的管理界面上传备份后的文件内容到他插件里面才能恢复,其他方法均要付费(99$/1year)我想简化直接将就主机的备份文件传到了新主机的相同位置上,结果发现人家也想到了,必须付费才能恢复=、=

使用插件 UpdraftPlus – Backup/Restore → 迁移成功

换了个插件,先安装UpdraftPlus - Backup/Restore然后备份旧主机,备份内容会放在wp-content/upgrade文件夹内,他是分好多个文件的,所以我将整个upgrade传到了新主机上(scp,ftp随便你)然后用docker cp命令放进WordPress主机里面。或者,因为前面的docker compose我们已经将数据挂在在了wp-data卷下,也可以复制过去,目录在/var/lib/docker/volumes/。你也可以进入WP管理员界面用插件提供的上传功能,但我觉得不好用。

**复制的话完成后务必注意权限问题!**WP官方镜像用的用户是www-data,其UID/GID固定为33:33所以我们需要操作下。如果你是用的WP的管理员界面上传的就没有影响。

修改所有者和权限


chown -R 33:33 wp-content/updraft

chmod -R 755 wp-content/updraft

之后去WP的管理员控制面板,打开UpdraftPlus插件的界面,你可以去设置选项卡看一眼,如果权限不对的话在最底下他会有一个很大的报错提醒。如果是正常的,你点击显示专家设置找备份目录,会提示指定的备份目录是可写的,这很好。

如果没有问题的话,你在备份还原选项卡里面应该已经能看到上传过来的备份文件了。这里注意下如果你的旧主机的MySQL比较老,要记得升级这个插件到最新版点恢复进入恢复界面,选择你想恢复的部分。如果你的插件崩了,有一种可能是因为你的MySQL比较老,你需要更新UpdraftPlus插件到最新版

这里着重说一下这个问题,因为旧版MySQL使用的字符集是3字节的utf8MySQL8已经没有了,所以需要转换才能将其导入到新的数据库里面。但是早一点的UpdraftPlus插件没有做这方面的识别,插件会直接崩溃。如果是最新版的插件会进入一个提醒页面此 WordPress 站点运行的数据库服务器不支持您尝试导入的字符集 ( utf8)。 您可以选择另一个合适的字符集, 并自行承担风险继续恢复这里我们选择utf8mb4。这个转换不是百分百能成功的,如果失败了的话可以尝试下utf8mb3,然后再备份,再恢复,再转换utf8mb4。还不行就百度吧。。。。我这里选择utf8mb4成功将数据导入了。

小小声,新版在WP管理员页面的工具栏里面有个站点健康的选项卡,可以查看问题和站点的具体信息。。。我都弄完了才发现。。。旧版没有这玩意。。。

后面开始就是更加地狱的更换主题,更换插件了。


参考资料:

https://u.sb/debian-install-docker/

感谢各位大佬的教程

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注