文件权限导致的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会认为是容器层触发了防盗链/或者后端业务代码报权限不足,如今多了一种可能即容器本身获取服务器存储资源时权限不足。