1Panel 将 WordPress 从传统 PHP-FPM 迁移至 FrankenPHP

为什么要迁移?

主要是想试着玩, 因为昨天已经把 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 运行必须的 mysqligd 等扩展。我们需要手动构建镜像。

在目录下,新建一个文件名为 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 常驻内存,获得数倍的性能提升。

补充一个问题

如果上传的文件大于2M, 可能是上传不了的, 因为frankenphp默认限制了2m

可以下面这样改

你需要自定义 php.ini

  1. 创建 php.ini 文件 在你存放 docker-compose.yml 的目录下,新建一个 php.ini 文件,写入以下内容:
    file_uploads = On
    memory_limit = 512M
    upload_max_filesize = 64M
    post_max_size = 64M
    max_execution_time = 600
    
  2. 挂载到容器 修改 docker-compose.yml,把这个文件挂载进去:
    services:
      php:
        # ... 其他配置 ...
        volumes:
          - ./site:/app/public
          # 新增这一行,覆盖默认配置
          - ./php.ini:/usr/local/etc/php/php.ini
    
  3. 重启容器