【CloudPanel 权限问题深入分析】双 Nginx 实例导致的上传权限异常与根本解决方案

by

zhipeng

接前文:我们在 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 配置中调整上传临时目录并赋予正确权限,才能根本解决权限拒绝问题。

相关文章

发表评论