今天在caddy 适配 PHP8.1 过程中,遇到三个问题,记录一下解决方案。
一、502错误
按官方说明,在Caddyfile中加入下面一行
php_fastcgi unix//run/php/php8.1-fpm.sock
重启Caddy后,访问PHP页面,出现502错误,查看caddy的日志,发现下面错误信息
dialing backend: dial unix /run/php/php8.1-fpm.sock: connect: permission denied
很显然是caddy没有访问 /run/php/php8.1-fpm.sock 文件的权限。
解决方法就是,将php8.1-fpm的启动用户由缺省的www-data,修改为与caddy的相同,我这里是www。也就是,将/etc/php/8.1/fpm/pool.d/www.conf 文件中的
user = www-data
group = www-data
listen.owner = www-data
listen.group = www-data
修改为
user = www-data
group = www-data
listen.owner = www-data
listen.group = www-data
一般情况下,使用下面命令重启php8.1-fpm就好了
sudo systemctl restart php8.1-fpm
二、File not found 错误
但是,我这里出现了新的一个问题。访问PHP出现“File not found”错误

之前,也碰到过此错误,原因是php-fpm没有访问这些PHP文件的权限,但是这次情况不一样了。因为,反复检查发现,这些目录和文件的拥有者都是php8.1-fpm的执行用户www。显然,不是文件权限问题。
会是什么问题?百思不得其解。后来,突然想起来,另一个网站是正常运行的,去看看两者有啥不同。
打开两者的Caddyfile,终于发现配置内容的些许不同了。
有问题的网站的Caddyfile里,配置是这样子的
php_fastcgi unix//run/php/php8.1-fpm.sock
file_server {
root * /home/wwwroot/default
}
运行正常的网站的Caddyfile里,配置是这样的
root * /home/wwwroot/default
php_fastcgi unix//run/php/php8.1-fpm.sock
file_server
把有问题的Caddyfile内容按正常运行的进行修改。
太好了,问题解决了。久违的PHP网页终于出现了。
估计是在第一种配置里没有给PHP-fpm配置根目录,导致真实的文件找不到。
三、403错误
因业务需要,将根目录换到了另外一个目录下。悲剧出现了,又不正常了。用wget 显示是“403 Forbidden”。查看caddy 日志,显示是“permission denied”。明显是文件权限不对。但是,奇怪的是,反复确认了该目录和目录下的文件,所有者都是www,按道理应该caddy和PHP-fpm都有访问权限呀,怎么会出现此问题呢?
最终,发现是该目录的上级目录权限设置出了问题。该目录处于home的某个用户目录下,因此这个用户目录的权限中,其他用户是禁止存取的,从而导致其下级目录虽然所有者是www,但www依然无权访问。
将该用户目录的所有者组换成www,问题解决!