AWS Ubuntu环境Docker容器中Django字体文件权限错误求助
嘿,Bharath,我来帮你梳理并解决这个字体权限的问题。先明确下你的场景:在AWS的Ubuntu机器上运行Docker容器,采用Nginx+uWSGI架构部署Django应用,uWSGI配置了www-data的uid/gid,但进入容器执行curl -XGET http://localhost时,出现/admin/fonts/Roboto-Regular-webfont.woff权限被拒绝的错误——虽然字体文件确实存在,错误还触发在base.html的{% stylesheet 'style' %}这一行。
核心原因分析
uWSGI是以www-data用户身份运行的,所以不仅字体文件本身,它所在的整个目录路径都需要让www-data拥有读取/访问权限。很多时候我们只关注文件本身的权限,却忽略了父目录的执行权限(对目录而言,执行权限意味着可以进入该目录),哪怕文件权限配置正确,父目录没有权限也会导致访问失败。
排查与修复步骤
1. 检查权限细节
进入容器后,执行以下命令查看字体文件及父目录的权限情况:
# 查看字体文件的权限和所属用户/组 ls -l /admin/fonts/Roboto-Regular-webfont.woff # 查看fonts目录的权限 ls -ld /admin/fonts # 查看admin根目录的权限 ls -ld /admin
需要确保这些目录的权限至少为755(允许所有用户读取+执行,所有者可写),文件权限至少为644(所有用户可读,所有者可写),且所属用户/组最好包含www-data。
2. 调整权限(若发现不足)
如果权限不符合要求,执行以下命令批量修正:
# 将admin目录下所有文件/目录的所有者改为www-data chown -R www-data:www-data /admin # 递归设置目录权限为755 find /admin -type d -exec chmod 755 {} \; # 递归设置文件权限为644 find /admin -type f -exec chmod 644 {} \;
3. 从Docker构建阶段规避问题
如果你通过Dockerfile构建镜像,建议在构建阶段就设置好权限,避免每次启动容器后手动调整。在Dockerfile中添加以下内容:
# 复制admin相关文件到容器内 COPY ./admin /admin # 立即设置正确的权限 RUN chown -R www-data:www-data /admin && \ find /admin -type d -exec chmod 755 {} \; && \ find /admin -type f -exec chmod 644 {} \;
4. 额外确认:Nginx的运行用户
同时要检查Nginx是否也以www-data用户运行(默认通常是),如果Nginx使用了其他用户,该用户也需要拥有对应路径的访问权限。可以通过以下命令查看Nginx的用户配置:
grep -r "user" /etc/nginx/nginx.conf
额外说明
日志中出现的ECONNREFUSED错误,是React渲染服务尝试访问外部API失败导致的,这和当前的字体权限问题是独立的,你可以在解决权限问题后再单独排查该API访问问题。
附上你提供的权限错误截图:
内容的提问来源于stack exchange,提问作者A K Bharath

