frankenphp运行wordpress完全可行,但需满足三前提:wp-config.php存在且配置正确、mysql容器可连、wordpress文件置于/app/public;推荐用docker-compose统一管理。

FrankenPHP 跑 WordPress 完全可行,但默认 Docker 镜像不带 MySQL,必须自己配数据库;直接 frankenphp php-server 启动会报错“无法连接数据库”,这不是 FrankenPHP 的问题,而是 WordPress 运行前提没满足。
为什么 docker run dunglas/frankenphp 启动后访问是空白页或 500
官方镜像 dunglas/frankenphp 是纯 Web + PHP 运行时,不含数据库、不含 Redis、不自动创建 wp-config.php。WordPress 启动前至少要满足三个条件:
-
wp-config.php必须存在且配置了DB_NAME、DB_USER、DB_PASSWORD、DB_HOST -
DB_HOST指向的 MySQL 实例必须可连(默认值mysql是容器内 DNS 名,不是本地127.0.0.1) - WordPress 文件需放在
/app/public目录下(镜像约定路径),否则 Caddy 找不到index.php
常见错误现象:Warning: mysqli_connect(): (HY000/2002): Connection refused 或 wp-config.php not found。别急着换镜像,先检查这三点。
推荐用 docker-compose.yml 一次性拉起 FrankenPHP + MySQL
比单跑容器靠谱,避免网络、挂载、启动顺序问题。以下是最小可用配置(保存为 docker-compose.yml):
services:
db:
image: mysql:8.4
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: wppass
volumes:
- db_data:/var/lib/mysql
restart: unless-stopped
<p>app:
image: dunglas/frankenphp
ports:</p>
- "80:80"
- "443:443"
- "443:443/udp" volumes:
- ./wordpress:/app/public
- ./wp-config.php:/app/public/wp-config.php environment: DB_HOST: db DB_NAME: wordpress DB_USER: wpuser DB_PASSWORD: wppass depends_on:
- db restart: unless-stopped
volumes: db_data:
关键点:
使用tbot机器ID身份文件配合tsh CLI,通过Teleport访问控制SSH登录托管主机或执行远程命令。
-
./wordpress目录放解压好的 WordPress 源码(含wp-admin、wp-includes) -
./wp-config.php需提前生成(可用 WordPress 官网下载包里的wp-config-sample.php改名 + 填参) -
DB_HOST: db是容器名,不是localhost—— Docker 内部 DNS 自动解析 - 不要在
wp-config.php里写死define('DB_HOST', 'localhost');,这会让 PHP 去连容器自己的 127.0.0.1,而 MySQL 在另一个容器里
wp-config.php 中必须改的三处
FrankenPHP 不影响 WordPress 配置逻辑,但容易踩坑的就这三项:
-
define('DB_HOST', $_ENV['DB_HOST'] ?? 'db');—— 强烈建议用环境变量兜底,而不是写死 -
define('WP_HOME', 'https://' . ($_SERVER['HTTP_HOST'] ?? 'localhost'));和define('WP_SITEURL', WP_HOME);—— 避免后台跳转到http://localhost导致资源加载失败 - 如果启用 HTTPS(FrankenPHP 默认开),加
$_SERVER['HTTPS'] = 'on';在文件开头,否则 WordPress 可能误判协议,生成 http 链接
不改这些,可能表现为:后台登录后跳回 http://localhost/wp-admin/、前端 CSS/JS 404、媒体上传失败。
启动后访问白屏或重定向循环?检查 Caddy 的自动 HTTPS 行为
FrankenPHP 内置 Caddy,默认启用 Let’s Encrypt 自动证书(对 localhost 用自签名)。但 WordPress 对 HTTPS 处理很敏感:
- 浏览器访问
https://localhost时,Caddy 返回自签名证书,需手动接受(Chrome 点“高级 → 继续前往”) - 如果
wp-config.php没设WP_HOME为https,WordPress 会把后台地址记成http,导致 Caddy 301 强制跳 https,再被 WordPress 覆盖成 http,死循环 - 临时调试可关掉 Caddy 的自动 HTTPS:在
docker-compose.yml的app服务下加环境变量FRANKENPHP_CONFIG: "http_port 80",只走 HTTP
真正上线时,用域名 + 正式证书更稳。FrankenPHP 会自动申请,前提是 SERVER_NAME 环境变量设对,且 80/443 端口对外可达。
最常被忽略的是:FrankenPHP 的 worker 模式对 WordPress 无效——它依赖每次请求完整初始化,强行开启 worker 会导致 session、全局变量错乱。别为了“性能”去动 worker { file ... },老老实实用 classic 模式就行。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










