frankenphp线上必须用systemd托管,核心是保障崩溃自动拉起、内存超限柔性回收(memorymax=1g+memorylow=256m)、日志按天轮转归档;禁用--worker,改用--server,默认type=simple,日志路径需提前创建并赋权。

FrankenPHP 线上必须用 systemd 托管,不是为了“能跑起来”,而是确保进程崩溃后自动拉起、内存爆了不被内核静默杀掉、日志写满磁盘前能轮转归档。直接执行 ./frankenphp 只适合本地验证,生产环境会丢服务、无监控、无恢复。
service 文件核心配置项
新建 /etc/systemd/system/frankenphp.service,内容如下(关键字段已加粗说明):
[Unit] Description=FrankenPHP Web Server After=network.target <p>[Service] Type=simple Restart=always RestartSec=5 StartLimitIntervalSec=60 StartLimitBurst=3 Environment=FRANKENPHP_DEBUG=1</p><h1>必须用绝对路径,systemd 不解析 ~ 或 .</h1><p>ExecStart=/opt/frankenphp/frankenphp --server --addr :8000</p><h1>内存限制:硬上限 + 柔性回收,防止 OOM Killer 直接杀进程</h1><p>MemoryMax=1G MemoryLow=256M</p><h1>日志重定向到文件(避免刷爆 journal)</h1><p>StandardOutput=append:/var/log/frankenphp/access.log StandardError=append:/var/log/frankenphp/error.log</p><h1>安全与工作目录</h1><p>User=www-data Group=www-data WorkingDirectory=/var/www/myapp ProtectSystem=strict ProtectHome=true</p><p>[Install] WantedBy=multi-user.target </p>
- Type=simple:FrankenPHP 没实现 notify 协议,设为 notify 会导致 systemd 误判启动失败
- --server 是默认行为,别加 --worker:Web 服务必须用 --server;--worker 是后台脚本模式,和 Caddy HTTP 路由不兼容
- MemoryLow 必须配:只设 MemoryMax 会导致进程被 abrupt kill;MemoryLow 让内核优先回收 page cache,服务变慢但不挂
-
日志路径需提前创建并赋权:运行
sudo mkdir -p /var/log/frankenphp && sudo chown www-data:www-data /var/log/frankenphp
启用并验证服务状态
保存后执行以下命令激活服务:
yuanfang-skills 的共享设计系统,提供 token CSS 变量、12+ 主题以及可复用的布局类型 HTML 块,供 yuanfang-html-image(以及 fu...)使用。
sudo systemctl daemon-reload sudo systemctl enable frankenphp sudo systemctl start frankenphp
检查是否正常运行:
-
sudo systemctl status frankenphp:看 Active 是否为 active (running) -
sudo journalctl -u frankenphp -n 50 --no-pager:查最近日志,注意是否有 bind error 或 permission denied -
curl -I http://localhost:8000:确认端口可响应 -
sudo systemctl cat frankenphp:核对加载的 service 文件内容是否最新
日志轮转与磁盘防护
FrankenPHP 自身不切分日志,需靠 systemd-journald 或 logrotate 配合。推荐用 logrotate 管理文件日志:
新建 /etc/logrotate.d/frankenphp:
/var/log/frankenphp/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 644 www-data www-data
sharedscripts
postrotate
systemctl kill --signal=SIGHUP frankenphp
endscript
}
- 每天轮转,保留 30 天压缩归档
-
postrotate中发送 SIGHUP,触发 FrankenPHP 重新打开日志文件(需应用支持,否则可删该段) - 确保
logrotate已启用定时任务:sudo systemctl is-enabled logrotate
常见启动失败排查点
如果 systemctl start 后立即退出,重点检查这几项:
-
端口被占用:
sudo ss -tulpn | grep ':8000',换端口或停冲突服务 -
权限不足:
WorkingDirectory或日志路径属主不是User=www-data,或目录不可读 -
PHP 扩展缺失:如未装 pdo_mysql,启动时会报错退出,查
journalctl -u frankenphp -n 100最前几行 -
Caddyfile 路径错误:若用 Caddy 集成,确保
CADDYFILE环境变量指向正确路径,且文件可读 -
内存超限被 kill:
dmesg -T | grep -i "killed process",确认是否因 MemoryMax 触发,适当调高并补 MemoryLow
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










