Caddy 安装配置最新版 PHP 8.5(Ubuntu 24.04)

主机:us4.gx9.ren(虚壳@美国) · Ubuntu 24.04 LTS · x86_64 最终版本:PHP 8.5.10(Sury PPA php8.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(核心)

原理

  1. Caddy v2.2.1 无 php_fastcgi 指令 → 用 reverse_proxy + transport fastcgi 代替;
  2. 原有 route 块内指令按书写顺序执行,因此必须把 PHP 匹配放在 file_server 之前,否则 .php 会被当静态文件处理;
  3. 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 的新版配置副本

七、注意事项

  1. 勿用 apt upgrade 直接升级 Caddy:本机 Caddy 是带 forwardproxy 插件的定制二进制,官方源升级会覆盖并丢失 naive 代理插件;如需升级请从官方带插件渠道重新编译/下载。
  2. 后续把 PHP 站点文件放入 /usr/share/caddy/ 即可,.php 结尾请求自动交给 PHP-FPM 8.5。
  3. FPM socket 权限:默认 www-data,Caddy 以 root 运行,读写无碍。
  4. 内核提示有升级(6.8.0-136 → 139),未重启,可择机重启加载新内核。
  5. 修改 Caddyfile 前后务必 caddy validate + 备份,涉及现有代理业务时建议做 A/B 对比验证。
  6. 系统中同时存在 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  # 配置校验