Kali Linux下Docker+Nginx部署双独立静态卷Django应用求助
我来帮你搞定这个问题,核心是要让两个Django应用的静态/媒体资源完全独立,同时在Nginx里做好对应路由配置,这样它们就能各自正常运行不冲突了。下面分步骤给你修正方案:
第一步:修正Docker Compose的卷配置
你现在的问题是两个应用共用了相同的static_volume和media_volume,导致静态文件混在一起。我们要给每个应用分配独立的卷:
修改你的docker-compose.yml文件:
version: '3' services: appone: build: ./appone volumes: - .:/opt/services/appone/src - static_volume_one:/opt/services/appone/static # 用专属静态卷 - media_volume_one:/opt/services/appone/media # 用专属媒体卷 networks: - nginx_network - database1_network depends_on: - database1 apptwo: build: ./apptwo volumes: - .:/opt/services/apptwo/src - static_volume_two:/opt/services/apptwo/static # 用专属静态卷 - media_volume_two:/opt/services/apptwo/media # 用专属媒体卷 networks: - nginx_network - database2_network depends_on: - database2 nginx: image: nginx:1.13 ports: - 8000:80 # 映射到appone的server - 8001:81 # 映射到apptwo的server volumes: - ./config/nginx/conf.d:/etc/nginx/conf.d - static_volume_one:/opt/services/appone/static # 挂载appone的静态卷 - media_volume_one:/opt/services/appone/media # 挂载appone的媒体卷 - static_volume_two:/opt/services/apptwo/static # 挂载apptwo的静态卷 - media_volume_two:/opt/services/apptwo/media # 挂载apptwo的媒体卷 depends_on: - appone - apptwo networks: - nginx_network database1: image: postgres:10 env_file: - config/db/env networks: - database1_network volumes: - database1_volume:/var/lib/postgresql/data database2: image: postgres:10 ports: - "5433:5432" env_file: - config/db/env2 networks: - database2_network volumes: - database2_volume:/var/lib/postgresql/data networks: nginx_network: driver: bridge database1_network: driver: bridge database2_network: driver: bridge volumes: database1_volume: database2_volume: static_volume_one: # 声明appone的静态卷 media_volume_one: # 声明appone的媒体卷 static_volume_two: # 声明apptwo的静态卷 media_volume_two: # 声明apptwo的媒体卷
第二步:调整Nginx配置,为两个应用分别路由
这里推荐用不同端口区分两个应用的方案,逻辑更清晰,不需要修改Django的路径配置:
替换你的Nginx配置文件(比如config/nginx/conf.d/django.conf):
# 分别定义两个应用的上游服务 upstream appone_server { server appone:8000; # 对应appone容器的Gunicorn端口 } upstream apptwo_server { server apptwo:8000; # 容器内端口不冲突,apptwo也可以用8000 } # AppOne的独立server,通过localhost:8000访问 server { listen 80; server_name localhost; location / { proxy_pass http://appone_server; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_redirect off; } # 匹配appone的静态资源 location /static/ { alias /opt/services/appone/static/; } # 匹配appone的媒体资源 location /media/ { alias /opt/services/appone/media/; } } # AppTwo的独立server,通过localhost:8001访问 server { listen 81; server_name localhost; location / { proxy_pass http://apptwo_server; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_redirect off; } # 匹配apptwo的静态资源 location /static/ { alias /opt/services/apptwo/static/; } # 匹配apptwo的媒体资源 location /media/ { alias /opt/services/apptwo/media/; } }
第三步:确保Django应用的静态/媒体路径配置正确
每个Django应用的settings.py里要指定正确的静态/媒体文件根目录,对应容器内的路径:
AppOne的settings.py:
STATIC_URL = '/static/' STATIC_ROOT = '/opt/services/appone/static' # 和Docker卷映射路径一致 MEDIA_URL = '/media/' MEDIA_ROOT = '/opt/services/appone/media' # 和Docker卷映射路径一致
AppTwo的settings.py:
STATIC_URL = '/static/' STATIC_ROOT = '/opt/services/apptwo/static' # 和Docker卷映射路径一致 MEDIA_URL = '/media/' MEDIA_ROOT = '/opt/services/apptwo/media' # 和Docker卷映射路径一致
第四步:收集静态文件并验证
- 先停止现有容器:
docker-compose down - 重新构建镜像:
docker-compose build - 启动所有服务:
docker-compose up -d - 给每个应用收集静态文件:
docker-compose exec appone python manage.py collectstatic --noinput docker-compose exec apptwo python manage.py collectstatic --noinput - 验证访问:
- AppOne:
http://localhost:8000 - AppTwo:
http://localhost:8001
检查页面上的静态资源(比如admin后台的CSS)是否正常加载,就说明配置成功了。
- AppOne:
内容的提问来源于stack exchange,提问作者oulai kenny
相关产品推荐
相关产品推荐

