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

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卷映射路径一致
第四步:收集静态文件并验证
  1. 先停止现有容器:docker-compose down
  2. 重新构建镜像:docker-compose build
  3. 启动所有服务:docker-compose up -d
  4. 给每个应用收集静态文件:
    docker-compose exec appone python manage.py collectstatic --noinput
    docker-compose exec apptwo python manage.py collectstatic --noinput
    
  5. 验证访问:
    • AppOne:http://localhost:8000
    • AppTwo:http://localhost:8001
      检查页面上的静态资源(比如admin后台的CSS)是否正常加载,就说明配置成功了。

内容的提问来源于stack exchange,提问作者oulai kenny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 20:07:29