Ubuntu下Apache与PHP/PHP-CLI访问权限异常问题求助
问题分析:Apache下PHP无法访问NFS挂载目录,但CLI正常
环境与问题概述
- 系统环境:Ubuntu,运行搭载PHP7.4的Apache服务器,Apache默认运行用户为
www-data - 权限配置:
- 网站目录
/var/www/html/contract-request:递归权限drwxrwxr--,所有者及组均为www-data,个人用户属于www-data组 - 文件存储目录
/var/www/data/contract-request及其子目录:权限完整,所有者/组为www-data,该目录为谷歌云环境下NFS挂载的外部存储
- 网站目录
- 异常现象:PHP应用抛出错误:
Exception information: Message: FritIdentifierDocumentStructure: the path /var/www/data/contract-request/application_file doesn't exist.
- 测试验证:
编写PHP测试脚本:if(!is_dir('/var/www/data/contract-request/application_file')) { echo 'Nope. Nothing!'.PHP_EOL; } else { echo 'Found it!'.PHP_EOL; }- 通过PHP-CLI执行:输出
Found it!,可正常识别目录 - 通过浏览器访问(Apache运行该脚本):输出
Nope. Nothing!,提示路径不存在
- 通过PHP-CLI执行:输出
fstab挂载配置
$ cat /etc/fstab LABEL=cloudimg-rootfs / ext4 discard,errors=remount-ro 0 1 LABEL=UEFI /boot/efi vfat umask=0077 0 1 10.xx.xx.xx:/vol-d-shared-host-201/zzz-d-iadm-intra/gl-d-xxx-xxintra7/opt /opt nfs rw,hard,rsize=65536,wsize=65536,vers=3,tcp 0 0 10.xx.xx.xx:/vol-d-shared-host-201/zzz-d-iadm-intra/gl-d-xxx-xxintra7/var-www/data /var/www/data nfs rw,hard,rsize=65536,wsize=65536,vers=3,tcp 0 0 //nas002.zzz-mobile.de/projects /home/System/web-prj cifs vers=1.0,dir_mode=0777,file_mode=0777,uid=www-data,gid=www-data,noserverino,nounix,rw,mfsymlinks,x-systemd.requires=/opt/zzz/cifs,credentials=/opt/zzz/cifs/cifs-credentials.nas002 0 0
可能的原因及排查方向
1. AppArmor访问限制
Ubuntu默认启用AppArmor,可能阻止Apache进程访问NFS挂载目录:
- 查看AppArmor状态:
sudo aa-status,确认Apache的profile处于enforce模式 - 检查Apache的AppArmor配置文件
/etc/apparmor.d/usr.sbin.apache2,确认是否包含允许访问/var/www/data/**的规则;若缺失,添加规则后重新加载AppArmor:sudo systemctl reload apparmor
2. NFS服务器端权限或挂载参数问题
- NFS服务器端权限:即使客户端显示权限正确,NFS服务器可能限制了对应UID/GID的访问。检查服务器端
/vol-d-shared-host-201/zzz-d-iadm-intra/gl-d-xxx-xxintra7/var-www/data/contract-request/application_file的权限,以及/etc/exports中的导出规则,确保允许客户端的www-data用户(对应UID)访问 - 挂载参数缺失:当前NFS挂载项未指定
uid=www-data,gid=www-data,可能导致Apache的www-data用户被映射为NFS端的匿名用户,无访问权限。修改fstab中的NFS挂载行,添加该参数后重新挂载:sudo mount -o remount /var/www/data
3. Apache chroot限制
若Apache配置了chroot环境,进程会被限制在指定目录内,无法访问/var/www/data(不在chroot根目录下)。检查Apache配置文件(如apache2.conf或站点配置)中是否存在ChrootDir相关设置。
4. 模拟Apache用户访问验证
通过sudo -u www-data ls -ld /var/www/data/contract-request/application_file模拟Apache运行用户的访问,查看是否能正常列出目录。如果该命令报错,说明www-data用户实际无访问权限,需排查权限或挂载问题;如果能正常列出,则重点排查AppArmor或Apache配置限制。
内容的提问来源于stack exchange,提问作者Calamity Jane
相关产品推荐
相关产品推荐

