在 1Panel 面板中部署 PHP 项目(如 ThinkPHP),访问
.php
文件时页面显示 404 Not Found 或 File Not Found 或 502。Nginx 错误日志出现
FastCGI sent in stderr: "Primary script unknown"
,且 PHP-FPM 容器无相关错误日志。
核心原因是 Linux 文件系统权限链断裂。
namei -l /path/to/file.php
检查权限链。/www/sites
)权限为
drwxr-x--- (750)
,属主为
root
。www-data
用户(即使 UID 相同)属于“其他人(Others)”,因父目录无
x
(执行/进入)权限,导致无法进入目录读取文件,从而报 “Primary script unknown”。打通权限链,确保 PHP-FPM 进程能进入并读取文件。
将
/www/sites
的属主改为与 PHP 容器内一致的用户(通常为
www-data
),无需开放全局权限。
# 查看容器内 www-data 的 UID(通常为 1000) docker exec -it <php-container> id www-data # 在宿主机修改目录属主为 UID 1000 chown -R 1000:1000 /www/sites |
若不想变更属主,可单独给父目录增加“其他人”的执行权限,允许进入目录。
修复后,再次使用
namei -l
检查,确保每一级目录对 PHP 进程用户均可见。
namei -l /www/sites/your-site/index.php # 预期结果:sites 目录属主变为 www-data 或权限包含 --x |
Docker 环境下,宿主机文件权限与容器内用户 UID 的映射是关键。遇到 PHP 404 时,优先使用
namei -l
检查整个路径链的权限,而非仅关注文件本身。