多EC2负载均衡部署下,如何将Django媒体文件存储至独立实例?
多服务器Django媒体文件共享方案(无S3)
方法1:NFS网络文件系统(生产环境首选)
这是最稳定的生产级共享方案,步骤如下:
- 配置第4台EC2(NFS服务器)
- 安装NFS服务:
Ubuntu/Debian:sudo apt install nfs-kernel-server
CentOS/RHEL:sudo yum install nfs-utils - 创建媒体根目录并设置权限:
sudo mkdir -p /mnt/django_media && sudo chown nobody:nogroup /mnt/django_media - 编辑NFS配置文件
/etc/exports,添加内网权限规则(替换为你实际的应用服务器网段):/mnt/django_media 10.0.0.0/24(rw,sync,no_subtree_check) - 重启NFS服务:
Ubuntu:sudo systemctl restart nfs-kernel-server
CentOS:sudo systemctl restart nfs-server
- 安装NFS服务:
- 配置第2、3台EC2(Django应用服务器)
- 安装NFS客户端:
Ubuntu/Debian:sudo apt install nfs-common
CentOS/RHEL:sudo yum install nfs-utils - 创建本地挂载点(替换为你Django项目的媒体目录路径):
sudo mkdir -p /var/www/django_project/media - 挂载NFS共享目录(替换为第4台EC2的内网IP):
sudo mount 10.0.0.4:/mnt/django_media /var/www/django_project/media - 设置开机自动挂载,编辑
/etc/fstab添加:10.0.0.4:/mnt/django_media /var/www/django_project/media nfs defaults 0 0
- 安装NFS客户端:
- 调整Django配置
- 在
settings.py中指定挂载目录为媒体根目录:MEDIA_ROOT = '/var/www/django_project/media' MEDIA_URL保持原有配置即可,例如:MEDIA_URL = '/media/'
- 在
方法2:SSHFS挂载(轻量测试环境)
适合测试或小流量场景,依赖SSH免密登录:
- 第4台EC2准备
- 创建媒体目录:
mkdir -p /home/ubuntu/django_media(替换为实际系统用户) - 确保第2、3台EC2已配置SSH免密登录到第4台
- 创建媒体目录:
- 第2、3台EC2操作
- 安装SSHFS:
Ubuntu/Debian:sudo apt install sshfs
CentOS/RHEL:sudo yum install sshfs - 创建挂载点:
sudo mkdir -p /var/www/django_project/media - 挂载远程目录(替换为第4台的内网IP和用户):
sudo sshfs ubuntu@10.0.0.4:/home/ubuntu/django_media /var/www/django_project/media -o allow_other - 设置开机自动挂载,编辑
/etc/fstab添加:ubuntu@10.0.0.4:/home/ubuntu/django_media /var/www/django_project/media fuse.sshfs defaults,allow_other 0 0
- 安装SSHFS:
方法3:Rsync定时同步+临时存储
如果前两种方案无法实施,可采用同步方案:
- Django临时存储配置
- 在
settings.py中设置本地临时媒体目录:MEDIA_ROOT = '/tmp/django_temp_media'
- 在
- 配置定时同步
- 编辑crontab定时任务:
crontab -e - 添加每5分钟同步一次的命令(替换为实际路径和第4台IP):
*/5 * * * * rsync -avz /tmp/django_temp_media/ ubuntu@10.0.0.4:/mnt/django_media/
- 编辑crontab定时任务:
- Nginx转发配置
- 在第1台Nginx的配置中添加媒体请求转发规则,直接指向第4台的媒体服务:
location /media/ { proxy_pass http://10.0.0.4/media/; proxy_set_header Host $host; } - 第4台EC2需部署Nginx或其他静态文件服务,对外提供媒体文件访问
- 在第1台Nginx的配置中添加媒体请求转发规则,直接指向第4台的媒体服务:
关键注意事项
- 所有EC2需处于同一内网安全组,开放对应端口:NFS开放2049端口,SSHFS开放22端口
- 确保Django运行用户(如
www-data)对挂载/同步目录拥有读写权限 - 测试验证:上传文件到Django后台,检查第4台目录是否同步文件,同时验证Nginx可正常访问该文件
内容的提问来源于stack exchange,提问作者Bhuban ghimire
相关产品推荐
相关产品推荐

