在使用 CloudPanel 时,我们在 File Manager 上传文件时遇到了 Permission denied
错误。经过深入排查和多次测试,成功找到了解决方法。为帮助其他遇到类似问题的用户,这里整理了详细的分析与解决方案。
问题描述
在 CloudPanel 面板中上传文件时,会出现 500 错误,通过查看相关日志 error.log 会有以下提示:
[crit] open() "/var/lib/nginx/body/0000000001" failed (13: Permission denied)
环境信息
- 操作系统:Debian
- Web Server:Nginx
- 控制面板:CloudPanel
- PHP 版本:多版本 PHP-FPM(7.1 ~ 8.4)
问题分析
1. Nginx 的上传临时目录
Nginx 默认会将上传文件临时存储在 /var/lib/nginx/body/
目录内,除非在配置中明确指定 client_body_temp_path
。
在本次问题中,client_body_temp_path
未显式配置,因此 Nginx 使用了默认的 /var/lib/nginx/body/
目录。
2. 发现的权限异常
执行以下命令检查该目录的权限:
ls -ld /var/lib/nginx/body/
结果为:
drwxr-x--- 2 root clp 4096 Mar 24 15:06 /var/lib/nginx/body/
发现问题:
- 该目录的 所有者 为
root
,而非 Nginxworker
进程的用户clp
。 - 由于
clp
只属于群组,没有写入权限,导致 Nginx 无法写入该临时文件夹。
解决方法
1. 修改 /var/lib/nginx/body/
的所有者
将目录的所有者更改为 Nginx worker
进程用户(在本次案例中为 clp
):
sudo chown clp:clp /var/lib/nginx/body/
sudo chmod 750 /var/lib/nginx/body/
解释:
chown clp:clp
— 更改该目录的所有者和群组为clp
(确保 Nginx 可写入)chmod 750
— 授予clp
用户写入权限,群组clp
仅读权限,其他用户无权限(✅安全)
2. 上传文件测试
再次通过 CloudPanel 的 File Manager 上传文件,成功