You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

生产环境Debug关闭时,Apache部署的Django媒体文件无法访问的解决

解决Django生产环境(Debug=False)下媒体文件404的问题

首先咱们得明确核心逻辑:当DEBUG=False时,Django本身不会处理媒体文件的请求,必须让Web服务器(这里是Apache)直接接管这类请求,所以问题大概率出在Apache配置细节或者文件权限上,咱们一步步排查解决:

一、修正Apache的媒体文件配置

你原来的site.conf里的媒体配置可能有路径匹配的小问题,调整成下面的写法更稳妥:

Alias /media/ /www/site/media/
<Directory /www/site/media>
    Options Indexes FollowSymLinks
    Require all granted
    AllowOverride None
</Directory>

重点注意:Alias的两端路径都要带末尾斜杠,这能避免请求路径拼接时出现错误(比如把/media/imgs匹配成/www/site/mediimgs这种乌龙)。

修改完配置后,一定要重启Apache让配置生效:

sudo systemctl restart apache2

如果是旧版本系统,也可以用:

sudo service apache2 restart

二、检查媒体目录的文件系统权限

就算Apache配置对了,如果媒体目录和文件的权限不对,Apache进程也读不到文件:

  1. 先确认Apache的运行用户(通常是www-data):
ps aux | grep apache2
  1. 给媒体目录设置正确的权限:
# 把目录所有者改成Apache用户,确保能读写
sudo chown -R www-data:www-data /www/site/media
# 设置目录权限为755(允许Apache访问),文件权限为644(保证可读)
sudo chmod -R 755 /www/site/media
sudo find /www/site/media -type f -exec chmod 644 {} \;

三、再次验证Django的MEDIA配置

确认settings.py里的媒体配置没有路径拼接错误:

import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')  # 这里不用加末尾斜杠,os.path.join会自动处理

四、通过日志排查剩余问题

如果还是不行,去看Apache的错误日志,里面会有明确的报错提示:

tail -f /var/log/apache2/error.log

比如日志里如果出现“Permission denied”,就是权限没调好;如果出现“File does not exist”,就是路径匹配有问题,照着提示调整就行。

内容的提问来源于stack exchange,提问作者Ritambhara Chauhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:16:30