为什么要迁移?
主要是想试着玩, 因为昨天已经把 CZL图床 从PHP-FPM迁移到 FrankenPHP了, 一个容器内自动处理运行和定时任务, 进程守护等, 很方便, 并且感觉性能也有所提升.
还有, 减少和1panel的绑定, 后续迁移也方便.
FrankenPHP介绍
FrankenPHP 是一个基于 Caddy Web Server 的现代化 PHP 应用服务器,使用 Go 语言编写。相比传统的 Nginx + PHP-FPM 架构,它更简单(单一二进制)、支持 HTTP/3,并且可以通过 Worker 模式显著提升性能。
核心架构变化
-
旧架构:1Panel OpenResty (Nginx) -> FastCGI 协议 (9000端口) -> PHP-FPM 容器
-
新架构:1Panel OpenResty (Nginx) -> HTTP 反向代理 (自定义端口) -> FrankenPHP 容器 (内部 80端口)
重要提醒
以下所有操作, 我都是新建一个 /opt/1panel/docker/compose/目录下的子目录进行操作, 并且在检查新的没问题之后, 再把旧的删掉. 一开始测试, 建议使用 端口映射先测试首页访问.
并且, 不要在原网站目录下操作, 我把原来的/www/sites/网站代号里的所有文件, 复制到 上面新建目录的/site子目录下, 避免影响旧的.
步骤一:准备 Dockerfile (解决扩展缺失问题)
FrankenPHP 官方镜像非常纯净,默认不包含 WordPress 运行必须的 mysqli、gd 等扩展。我们需要手动构建镜像。
在目录下,新建一个文件名为 Dockerfile:
Dockerfile
FROM dunglas/frankenphp:php8.3
RUN install-php-extensions \
bcmath \
exif \
gd \
intl \
mysqli \
opcache \
pdo_mysql \
zip \
imagick
步骤二:创建 docker-compose.yml
你需要调整编排文件,从“拉取镜像”改为“构建镜像”,并调整端口和挂载路径。
networks:
1panel-network:
external: true
services:
php:
build: .
container_name: wordpress-franken
restart: always
networks:
- 1panel-network
ports:
- "1019:80"
environment:
- SERVER_NAME=:80
- TZ=Asia/Shanghai
volumes:
- ./site:/app/public
步骤三:测试访问和怎么共存
访问服务器IP:1019看看能不能访问
你可以添加反向代理, 但是需要先把rewrite那一行给注释掉(在前面加个#号)
然后添加一个反向代理, ^~代理根目录到 127.0.0.1:1019即可.
步骤五:构建与启动
在终端进入目录,执行以下命令重构并启动:
docker-compose build
docker-compose up -d
排查命令:
-
查看日志:
docker logs -f wordpress-franken -
检查文件是否存在:
docker exec -it wordpress-franken ls -la /app/public
其他问题修复: 解决https无限重定向和上传目录
修改 wp-config.php (解决 HTTPS 无限重定向)
由于 Nginx 通过 HTTP 转发请求给 FrankenPHP,WordPress 会误以为当前是非安全连接,从而尝试跳转 HTTPS,导致死循环。
编辑 WordPress 根目录下的 wp-config.php,在文件最顶部(<?php 下方)添加:
PHP
<?php
/**
* 处理反向代理后的 HTTPS 识别问题
*/
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$_SERVER['HTTPS'] = 'on';
}
// 建议同时锁定站点地址,防止数据库配置错误
define('WP_HOME', 'https://你的域名.com');
define('WP_SITEURL', 'https://你的域名.com');
// ... 下面是原有的代码 ...
修改上传目录
登录后, 确保这里没问题, 否则无法上传.
总结
通过以上步骤,我们成功将 WordPress 迁移到了 FrankenPHP。现在的架构不仅更现代化,而且未来你可以进一步通过在 Dockerfile 或环境变量中启用 Worker 模式,让 WordPress 常驻内存,获得数倍的性能提升。

