Ubuntu 20.04下PHP无权限写入/var/www/html目录文件的问题求助
看起来你已经做了不少基础的权限排查工作,但还是卡在这里了,我来帮你梳理几个容易被忽略的排查方向:
确认文件路径与目录存在性
先在PHP代码里加一行echo $path;,输出实际的文件路径,确认是不是你预期的/var/www/html/files/l.log——有时候__DIR__的实际位置可能和你想的不一样(比如file.php不在files目录下的话,路径就会出错)。另外可以用var_dump(file_exists(dirname($path)));检查目标目录是否存在,偶尔目录不存在也会抛出类似权限拒绝的错误。核实PHP实际运行的用户
你用ps aux查了Apache和PHP进程,但要注意:如果服务器用了PHP-FPM,PHP的运行用户可能和Apache不一样!你可以查看PHP-FPM的配置文件(比如/etc/php/7.4/fpm/pool.d/www.conf,版本根据你的实际情况调整),找到user和group配置项,确认PHP真正的运行用户是谁。如果是php-fpm或者其他用户,那你之前给www-data设置权限就没用了,需要把文件和目录的所有权改成这个用户:sudo chown [PHP运行用户]:[PHP运行用户组] /var/www/html/files/l.log sudo chown [PHP运行用户]:[PHP运行用户组] /var/www/html/files/检查整个路径的权限链
权限问题不止看目标文件和目录,上层目录的权限也会影响。比如/var/www、/var/www/html这些目录,必须允许PHP运行用户进入(目录的执行权限x就是允许进入的意思)。你可以用这个命令查看整个路径的权限链:namei -l /var/www/html/files/l.log确保每一层目录都对PHP运行用户开放了执行权限。
排查AppArmor限制
Ubuntu默认用AppArmor代替SELinux,它也可能限制PHP的写入操作。先查看AppArmor的状态:aa-status如果看到针对Apache或PHP-FPM的profile处于强制模式(enforced),可以先临时切换到投诉模式测试:
# 针对Apache sudo aa-complain /etc/apparmor.d/usr.sbin.apache2 # 针对PHP-FPM(版本按需调整) sudo aa-complain /etc/apparmor.d/usr.sbin.php-fpm7.4然后重启服务:
sudo systemctl restart apache2 sudo systemctl restart php7.4-fpm如果问题解决了,再修改对应的AppArmor配置文件,添加允许写入
/var/www/html/files/目录的规则。测试系统用户的写入权限
切换到PHP运行用户,手动尝试创建文件,验证是否是系统权限问题:sudo -u [PHP运行用户] touch /var/www/html/files/test.log如果这个命令失败,说明是系统层面的权限问题;如果成功,那要检查PHP的
open_basedir配置——查看php.ini里的open_basedir项,确认/var/www/html/files在允许访问的目录列表中,可以通过phpinfo()查看当前生效的配置。
你可以按这个顺序一步步排查,应该能找到问题根源。如果还是不行,把排查过程中的输出信息(比如namei -l的结果、PHP-FPM的用户配置)贴出来,能更精准地帮你定位问题。
备注:内容来源于stack exchange,提问作者Mixtuur

