文件权限导致的nginx访问报错

最近个人图片上传工具上传后的图片,当进行HTTP访问失败,均报403,一开始以为是nginx防盗链设定等,最后确定了直接原因是文件权限不够导致。

这里记录下这个问题

关于403

状态码 403 Forbidden 代表客户端错误,指的是服务器端有能力处理该请求,但是拒绝授权访问。

这个状态类似于 401,但进入该状态后不能再继续进行验证。该访问是长期禁止的,并且与应用逻辑密切相关(例如不正确的密码)。

  • 401,403很像,但还是有所区分,401是没登陆成功,而403是具备登陆身份,只是部分权限不足。

FS-ACL

经过分析,定位到这里的403是因为nginx容器访问文件资源权限不足导致。如图SCP到服务器的文件权限显示为600,即只有所有者root具备读写权限。而nginx请求访问图片静态资源是以nginx用户进行访问因此不具备读权限。

解决办法即赋予文件所属组/其他用户读权限即可。比如644

SCP,Rsync

我这里的图片上传是使用的自己写的上传工具,因此需要对症下药。

针对上传工具,我使用的SCP命令,查询发现SCP不支持修改文件权限,因此只能换成Rsync,具体代码如下

1
rsync -p --chmod=Du=rwx,Dgo=rx,Fu=rw,Fog=r ./temp/{query} $user@$server:$destination/$year

注意点

  • scp的参数-p保留文件的权限模式,并不是指的文件的ACL,因此不行
  • rsync的-p可以保留文件权限,因此可以使用,但这里因为我还需要最终修改文件权限,因此增加了chmod
  • 如上配置的chmod作用是文件夹755,文件644

写在最后

  • 如上修改后,重新上传资源,fixed

  • 但凡遇到SCP上传文件,同时文件权限需要调整时可考虑切换到Rsync

  • 一直以来nginx报403会认为是容器层触发了防盗链/或者后端业务代码报权限不足,如今多了一种可能即容器本身获取服务器存储资源时权限不足。