Caddy 安装配置最新版 PHP 8.5(Ubuntu 24.04)
Submitted by user1 on Mon, 2026/09/07 - 09:44
主机:
us4.gx9.ren(虚壳@美国) · Ubuntu 24.04 LTS · x86_64 最终版本:PHP 8.5.10(Sury PPAphp8.5,当前最新稳定版) 执行:2026-09-07 · 执行用户:root
背景与目标
为运行中的 Caddy Web 服务器接入 PHP 支持。该服务器上 Caddy 承担 naive 代理(forward_proxy) 业务,因此整个改造必须不破坏现有代理功能。
升级轨迹:先装了 Sury PPA 默认的 PHP 8.4.25,后按用户指出(php.net 最新为 8.5.x)升级为 PHP 8.5.10,本文档以最终状态为准。
一、环境确认
| 项目 | 值 |
|---|---|
| 系统 | Ubuntu 24.04 LTS(noble),x86_64 |
| Caddy | v2.2.1 定制版(含 forwardproxy 插件,非 apt 包),systemd 管理,以 root 运行 |
| 配置 | /etc/caddy/Caddyfile,站点根目录 /usr/share/caddy |
| PHP | 最终安装 8.5.10(FPM + CLI + 扩展) |
cat /etc/os-release
caddy version # v2.2.1
systemctl cat caddy # ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
caddy list-modules | grep -i fastcgi # 有 http.reverse_proxy.transport.fastcgi(关键!)
关键结论:该 Caddy 定制版没有 php_fastcgi 处理器指令,但自带 fastcgi 反向代理传输协议,所以可用 reverse_proxy … transport fastcgi 将 .php 请求转发给 PHP-FPM,无需更换 Caddy。
二、添加 Sury PPA(最新版 PHP 来源)
export DEBIAN_FRONTEND=noninteractive
add-apt-repository -y ppa:ondrej/php # 添加 ondrej/php 源
apt-get update # 更新软件源
apt-cache policy php8.5-fpm # 确认候选版本 8.5.10
注意:
add-apt-repository/apt-get update耗时较长,建议放后台执行并轮询,或前台分步执行以便观察进度。
三、安装 PHP 8.5 + FPM + 常用扩展
export DEBIAN_FRONTEND=noninteractive
apt-get install -y \
php8.5-fpm php8.5-cli php8.5-common \
php8.5-mysql php8.5-curl php8.5-gd php8.5-xml \
php8.5-mbstring php8.5-zip php8.5-bcmath \
php8.5-intl php8.5-sqlite3
⚠️ 坑:不要装
php8.5-opcache—— PHP 8.5 中 OPcache 已并入核心(php8.5-common/cli),无独立包。若误加会导致Unable to locate package安装失败(exit 100),去掉该包重装即可。php8.5 -m可见Zend OPcache已加载。
验证:
php8.5 -v # PHP 8.5.10 (cli)
php -v # 默认 php 已指向 8.5(alternatives 自动切换)
systemctl is-active php8.5-fpm # active
systemctl is-enabled php8.5-fpm # enabled(开机自启)
ls /run/php/ # php8.5-fpm.sock
- FPM 默认监听:
/run/php/php8.5-fpm.sock - Pool 配置:
/etc/php/8.5/fpm/pool.d/www.conf(user/group \= www-data) - 日志:
/var/log/php8.5-fpm.log
四、Caddy 接入 PHP-FPM(核心)
原理
- Caddy v2.2.1 无
php_fastcgi指令 → 用reverse_proxy+transport fastcgi代替; - 原有
route块内指令按书写顺序执行,因此必须把 PHP 匹配放在file_server之前,否则.php会被当静态文件处理; - fastcgi transport 需显式指定
root,FPM 才能正确生成SCRIPT_FILENAME。
最终 Caddyfile(/etc/caddy/Caddyfile)
:443, us4.gx9.ren
route {
forward_proxy {
basic_auth root <PASSWORD> # 原有 naive 代理配置,保持不动
hide_ip
hide_via
probe_resistance
}
@php path *.php
reverse_proxy @php unix//run/php/php8.5-fpm.sock {
transport fastcgi {
root /usr/share/caddy
split .php
}
}
file_server {
root /usr/share/caddy
}
}
操作顺序
# 1) 备份(注意:命令中含 $(date) 会被安全策略拦截,用固定名)
cp -a /etc/caddy/Caddyfile /etc/caddy/Caddyfile.bak
# 2) 写入上述配置(socket 指向 php8.5-fpm.sock)
# 3) 校验 + 重载
caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile
systemctl reload caddy && systemctl is-active caddy
从 PHP 8.4 升到 8.5 的切换
# 安装 php8.5-* 后默认 php 命令自动切到 8.5;仅需把 Caddyfile 的 socket 改掉:
sed -i 's#unix//run/php/php8.4-fpm.sock#unix//run/php/php8.5-fpm.sock#' /etc/caddy/Caddyfile
caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile
systemctl reload caddy
# 停用旧版 FPM(保留包可回退):
systemctl disable --now php8.4-fpm
五、验证结果
| 测试 | 结果 |
|---|---|
创建 /usr/share/caddy/info.php(phpinfo)经 HTTPS 访问 |
✅ HTTP 200,PHP Version 8.5.10,opcache.enable\=On |
静态文件 https://us4.gx9.ren/ |
✅ HTTP 200(未受影响) |
不存在的 .php |
✅ HTTP 404(正确交给 FPM) |
naive 代理 CONNECT 测试(curl -x https://…) |
HTTP 000 —— A/B 对比确认属 probe_resistance 对非 naive 客户端的固有行为,原始配置下结果相同,非本次改动引入 |
A/B 对比方法:临时切回 Caddyfile.bak → reload → 相同代理测试同样 000 → 恢复新配置 → reload。以此证明 PHP 改动未破坏代理路径。
六、清理
rm -f /usr/share/caddy/info.php # phpinfo 暴露服务器信息,测完即删
systemctl disable --now php8.4-fpm # 停用旧版 FPM(包保留,可随时 systemctl enable --now php8.4-fpm 回退)
保留文件:
/etc/caddy/Caddyfile.bak— 原始配置备份/etc/caddy/Caddyfile.new— 带 PHP 的新版配置副本
七、注意事项
- 勿用
apt upgrade直接升级 Caddy:本机 Caddy 是带 forwardproxy 插件的定制二进制,官方源升级会覆盖并丢失 naive 代理插件;如需升级请从官方带插件渠道重新编译/下载。 - 后续把 PHP 站点文件放入
/usr/share/caddy/即可,.php结尾请求自动交给 PHP-FPM 8.5。 - FPM socket 权限:默认
www-data,Caddy 以 root 运行,读写无碍。 - 内核提示有升级(6.8.0-136 → 139),未重启,可择机重启加载新内核。
- 修改 Caddyfile 前后务必
caddy validate+ 备份,涉及现有代理业务时建议做 A/B 对比验证。 - 系统中同时存在 php8.4 与 php8.5 两套包(php8.4-fpm 已停用);
apt默认把php命令行切到最新 8.5。若长期无需 8.4,可再apt purge php8.4-*(谨慎,确认无站点依赖)。
附:常用运维命令
systemctl status php8.5-fpm # FPM 状态
tail -f /var/log/php8.5-fpm.log # FPM 日志
journalctl -u caddy -f # Caddy 日志
caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile # 配置校验