接前文:我们在 CloudPanel 中遇到 File Manager 上传文件时报错Permission denied,手动修复 /var/lib/nginx/body 权限后可用,
但每次重启又被重置。
在上两篇文章中,我尝试通过 systemd 的 ExecStartPost 机制修复权限,
但问题依旧反复出现。
这一次,我终于找到了真正的根因。
关键发现:CloudPanel 运行独立的 Nginx 实例
通过以下命令查看当前系统中运行的 Nginx 进程:
pgrep -a nginx
输出示例:
nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
126702 nginx: master process /usr/sbin/nginx -g daemon on; master_process on; -c /home/clp/services/nginx/nginx.conf
可以确认:
- 系统中运行着 两个独立的 Nginx 实例;
- 系统级实例使用配置文件
/etc/nginx/nginx.conf; - CloudPanel 自带实例使用配置文件
/home/clp/services/nginx/nginx.conf。
结论:
CloudPanel 的 File Manager、PHP-FPM 等功能使用的是其私有 Nginx 实例,与系统 Nginx 完全独立。
因此,systemd 的 ExecStartPost 修改不会影响 CloudPanel 自带的 Nginx。
配置文件分析与问题根源
查看 CloudPanel 专属配置文件:
cat /home/clp/services/nginx/nginx.conf
文件开头内容如下:
user clp;
worker_processes auto;
pid /run/clp-nginx.pid;
worker_rlimit_nofile 8192;
CloudPanel 的 Nginx 使用 clp 用户运行,但上传临时目录仍为系统默认路径 /var/lib/nginx/body,
该目录属主为 root,即出现权限问题。
配置正确的 client_body_temp_path
user clp;
worker_processes auto;
pid /run/clp-nginx.pid;
worker_rlimit_nofile 8192;
events {
worker_connections 2000;
}
http {
client_body_temp_path /home/clp/services/nginx/tmp/body;
real_ip_recursive on;
sendfile on;
tcp_nodelay on;
client_max_body_size 64M;
keepalive_timeout 65;
...
}
目录初始化与权限设置
创建独立的上传临时目录并设置适当权限:
sudo mkdir -p /home/clp/services/nginx/tmp/body
sudo chown -R clp:clp /home/clp/services/nginx/tmp
sudo chmod 750 /home/clp/services/nginx/tmp/body
验证与重载
验证配置语法:
sudo nginx -t -c /home/clp/services/nginx/nginx.conf
输出:
nginx: configuration file /home/clp/services/nginx/nginx.conf test is successful
然后重载 CloudPanel 的 Nginx 实例:
sudo nginx -s reload -c /home/clp/services/nginx/nginx.conf
验证结果
执行上传操作后,文件可正常写入。
查看目录权限:
ls -ld /home/clp/services/nginx/tmp/body
结果:
drwxr-x--- 2 clp clp 4096 Oct 31 16:38 /home/clp/services/nginx/tmp/body
问题得到完全解决,Nginx 重启后权限亦不会被重置。
CloudPanel 使用独立的 Nginx 实例,其配置文件、运行用户及运行机制与系统 Nginx 相互独立。
只有在 CloudPanel 自身的 Nginx 配置中调整上传临时目录并赋予正确权限,才能根本解决权限拒绝问题。









