前言
旧的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.xyz
和gemini-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字节的utf8
MySQL8已经没有了,所以需要转换才能将其导入到新的数据库里面。但是早一点的UpdraftPlus插件没有做这方面的识别,插件会直接崩溃。如果是最新版的插件会进入一个提醒页面此 WordPress 站点运行的数据库服务器不支持您尝试导入的字符集 ( utf8)。 您可以选择另一个合适的字符集, 并自行承担风险继续恢复
这里我们选择utf8mb4
。这个转换不是百分百能成功的,如果失败了的话可以尝试下utf8mb3
,然后再备份,再恢复,再转换utf8mb4
。还不行就百度吧。。。。我这里选择utf8mb4
成功将数据导入了。
小小声,新版在WP管理员页面的工具栏里面有个站点健康的选项卡,可以查看问题和站点的具体信息。。。我都弄完了才发现。。。旧版没有这玩意。。。
后面开始就是更加地狱的更换主题,更换插件了。
参考资料:
https://u.sb/debian-install-docker/
感谢各位大佬的教程