caddy 调适 PHP8.1

今天在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,问题解决!

发表评论