NGINX 不提供收集的静态文件

Posted

技术标签:

【中文标题】NGINX 不提供收集的静态文件【英文标题】:NGINX does not serve the collected static files 【发布时间】:2021-05-08 11:11:19 【问题描述】:

我在 AWS EC2 实例上运行 dockerized Django 应用程序,并且页面加载时没有静态文件,即使 nginx 已收集它们。我觉得这很奇怪,因为它直到现在才发生在我身上(至少在我的本地机器上)。如果您能帮我解决这个问题,我们将不胜感激。

这是我的docker-compose.yml 文件:

version: "3"

services:
  web:
    restart: always
    build: .
    command: bash -c "
      python manage.py makemigrations &&
      python manage.py migrate &&
      python manage.py creategroups &&
      python manage.py initializesuperuser &&
      python manage.py collectstatic --noinput &&
      daphne -b 0.0.0.0 -p 80 DL.asgi:application"
    expose:
      - 80
    environment:
      - DJANGO_SETTINGS_MODULE=DL.production_settings
    volumes:
      - static_volume:/usr/src/app/DL/static/
      - media_volume:/usr/src/app/media_cdn

  nginx:
    restart: always
    build: ./nginx
    ports:
      - "80:80"
    volumes:
      - static_volume:/static/
      - media_volume:/media/
    depends_on:
      - web

volumes:
  static_volume:
  media_volume:

这里是production_settings.py

STATIC_URL = '/static/'
STATIC_ROOT = "/usr/src/app/DL/static/"   

web 容器内的文件结构的 sn-p(DL_app 是 Django 应用程序的名称):

usr
|
|──src
   |
   |──app
      |
      |──DL
         |
         |──DL
         |
         |──DL_app
         |  |
         |  |──static
         |
         |──manage.py
         |
         |──static

最后,这是nginx.conf

upstream web 
    server web:80;


server 
    listen 80;
    location / 
        proxy_pass http://web;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_redirect off;
    
    location /static/ 
        alias /usr/src/app/DL/static/;
    
    location /protected/ 
        alias /media/;
    

【问题讨论】:

【参考方案1】:

您已在nginx 容器中的/static 路径中挂载静态文件:

  nginx:
    restart: always
    build: ./nginx
    ports:
      - "80:80"
    volumes:
      - static_volume:/static/  # here

但是您的 NGINX 配置定义它们位于 /usr/src/app/DL/static/

    location /static/ 
        alias /usr/src/app/DL/static/; # there is no such path in NGINX container
        #alias /static/;  # this should work
    

【讨论】:

以上是关于NGINX 不提供收集的静态文件的主要内容,如果未能解决你的问题,请参考以下文章

Nginx 不提供 Django 管理静态文件

Django中静态文件之各个配置详解

带有 ingress-nginx 的 kubernetes 中的 Django 不提供静态文件

使用 Docker、nginx 和 gunicorn 提供 Django 静态文件

Nginx 不提供静态服务

请教nginx是怎么处理静态文件的