Nginx+Django使用X-Accel-Redirect下载大文件返回403错误如何解决?
问题原因
你的报错Permission denied是Nginx运行用户没有访问目标文件及父目录的权限,或者SELinux限制了Nginx访问/home目录内容,按以下步骤排查修复:
步骤1:排查目录层级权限
Nginx需要对路径上所有父目录有执行权限(x),对目标文件有读取权限(r),用以下命令查看完整路径的权限情况:
namei -l /home/myuser/direct/example.txt
重点检查/home、/home/myuser、/home/myuser/direct三个目录的权限,绝大多数Linux发行版默认普通用户家目录/home/myuser权限是700,仅所有者可访问,Nginx用户无权进入。
修复权限
先查看nginx.conf首行user配置确认Nginx运行用户(CentOS/RHEL系默认是nginx,Debian/Ubuntu默认是www-data),以运行用户为nginx为例,执行以下命令授权:
# 给Nginx用户组授予目录执行权限 chgrp nginx /home/myuser /home/myuser/direct chmod g+x /home/myuser /home/myuser/direct # 给Nginx用户组授予文件读取权限 chgrp nginx /home/myuser/direct/example.txt chmod g+r /home/myuser/direct/example.txt
如果不想修改组权限,也可以直接给其他用户添加对应权限:
chmod o+x /home/myuser /home/myuser/direct chmod o+r /home/myuser/direct/example.txt
步骤2:排查SELinux限制
CentOS/RHEL/AlmaLinux等发行版默认开启SELinux,默认禁止Nginx访问/home目录下的内容,先临时关闭SELinux测试:
setenforce 0
如果测试下载正常,说明是SELinux限制,执行以下命令添加永久规则:
# 允许HTTP服务读取用户家目录内容 setsebool -P httpd_read_user_content 1 # 给下载目录打上Nginx可访问的SELinux标签 semanage fcontext -a -t httpd_sys_content_t "/home/myuser/direct(/.*)?" restorecon -Rv /home/myuser/direct
步骤3:修复Nginx配置小问题
你当前的location /download配置缺末尾斜杠,可能导致后续路径拼接错误,修改为:
location /download/ { internal; alias /home/myuser/direct/; proxy_max_temp_file_size 0; }
修改后重启Nginx生效:
systemctl restart nginx
内容的提问来源于stack exchange,提问作者qwerty
相关产品推荐
相关产品推荐

