如何解决Nginx DAV PUT请求rename()报(13: Permission denied)权限错误?
解决Nginx DAV PUT请求rename()权限拒绝(13: Permission denied)错误
先拆解下你遇到的问题:当往已存在的文件夹根目录PUT index.html时,Nginx执行rename()操作失败报权限拒绝,这其实和两个核心权限层面有关——Nginx运行用户对目标文件夹的底层文件系统权限,以及Padavan固件的分区权限限制,结合你的环境(Padavan+Entware nginx-extras 1.13.6-1),具体修复点如下:
1. 修正Nginx运行用户对目标文件夹的写入权限
你的配置里Nginx以nobody nogroup运行,但dav_access只是控制WebDAV的访问权限,真正决定文件操作能否执行的是文件系统的目录权限:
- 先检查目标文件夹的所有者与组:执行命令
如果输出的所有者不是ls -ld /path/to/your/target/foldernobody、组不是nogroup,那Nginx的nobody用户就没有修改目录内文件的权限(PUT操作流程是先上传临时文件,再rename到目标路径,这两步都需要目录的写入权限)。 - 修复方式二选一:
- 直接将目标文件夹的所有者改为
nobody:nogroup:chown -R nobody:nogroup /path/to/your/target/folder - 给文件夹的组添加写入权限(若文件夹组已为
nogroup):chmod -R g+w /path/to/your/target/folder
- 直接将目标文件夹的所有者改为
2. 检查Padavan固件的分区权限限制
Padavan的系统分区(比如/www)可能默认有只读或特殊权限管控,而Entware安装的Nginx更适合在/opt分区下操作:
- 确认你的WebDAV目标目录是否在
/opt下(Entware默认可写分区),如果在系统分区,建议将WebDAV根目录迁移到/opt,或者修改系统分区的挂载参数为可写(需谨慎操作,避免影响固件稳定性)。 - 另外你提到切换客户端用户为
admin仍无效,这是因为WebDAV请求最终是由Nginx的运行用户(nobody)执行文件操作,和客户端登录用户无关——除非你配置了用户与文件系统权限的映射规则,显然你当前没做这个配置。
3. 验证Nginx临时文件目录的权限
Nginx处理PUT请求时会先将文件写入临时目录(默认是/tmp),需确保nobody用户对该目录有写入权限:
- 检查
/tmp权限:
正常权限应为ls -ld /tmpdrwxrwxrwt,确保nobody能在此创建临时文件。 - 若权限异常,执行命令恢复:
chmod 1777 /tmp
最后验证
修改完所有权限后,重启Nginx生效:
/opt/etc/init.d/S80nginx restart
再用Cyberduck测试PUT操作,rename()权限拒绝的问题应该就能解决了。
内容的提问来源于stack exchange,提问作者Pro Backup
相关产品推荐
相关产品推荐

