django 和 gunicorn 在 docker 容器内运行时,无法在 ec2 上使用 nginx 提供静态文件

Posted

技术标签:

【中文标题】django 和 gunicorn 在 docker 容器内运行时,无法在 ec2 上使用 nginx 提供静态文件【英文标题】:not able to serve static files with nginx on ec2 with django and gunicorn running inside docker container 【发布时间】:2022-01-18 17:11:17 【问题描述】:

我正在使用下面的 docker compose 'local.yml' 在 ec2 服务器上运行 django

services:
  django: &django
    build:
      context: .
      dockerfile: ./compose/local/django/Dockerfile
    image: name_docker
    container_name: django
    depends_on:
      - mariadb
      - mailhog
    volumes:
      - .:/app:z
    env_file:
      - ./.envs/.local/.django
      - ./.envs/.local/.mariadb
    oom_kill_disable: True
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: '3G'
    ports:
      - "8000:8000"
    command: /start

它以 start.sh 脚本开头,写成

#!/bin/bash

set -o errexit
set -o pipefail
set -o nounset


# python /app/manage.py collectstatic --noinput


/usr/local/bin/gunicorn config.wsgi --bind 0.0.0.0:8000 --timeout 10000 --workers 5 --threads 5 --chdir=/app

在部署后的 ec2 上,服务器使用 gunicorn 运行良好。

现在我添加了 nginx 配置为

server 
    listen 3000;
    server_name domain_name.in;
    access_log /var/log/nginx/django_project-access.log;
    error_log /var/log/nginx/django_project-error.log info;
    add_header 'Access-Control-Allow-Origin' '*';

    keepalive_timeout 5;

    # path for staticfiles
    location /static 
            autoindex on;
            alias /static;
    

    location / 
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://0.0.0.0:8000;
    



此配置也运行良好,我可以在 example.in:3000 上本地访问它。

但是当我尝试打开管理页面时,我无法在那里看到静态文件。

我还尝试使用以下命令收集静态数据

docker-compose -f local.yml run --rm django python manange.py collectstatic --no-input

文件收集成功。

我应该怎么做才能提供静态文件?

【问题讨论】:

【参考方案1】:

将您的 /app/static/ 文件夹从容器映射到主机上的文件夹中,例如:/home/ec2/static/ 并确保您的 nginx 可以访问那里。

volumes:
  - /home/ec2/static/:/app/static

nginx.conf

...
location /home/ec2/static/ 
        autoindex on;
        alias /static/;
    
...

【讨论】:

你能提一下我应该在我的 docker-compose 文件和 nginx 配置中写什么吗? 我也应该更改 nginx 配置吗? 是的,您需要它指向您的新文件夹(首先确认文件显示在主机上) 如果你不介意你能告诉我我应该在 nginx 配置中添加什么吗?指向哪个文件夹? 现在显示 403 Forbidden with nginx 页面?

以上是关于django 和 gunicorn 在 docker 容器内运行时,无法在 ec2 上使用 nginx 提供静态文件的主要内容,如果未能解决你的问题,请参考以下文章

为啥 nginx 不会用 django 和 gunicorn 显示静态内容?

Nginx Django 和 Gunicorn。 Gunicorn 袜子文件丢失?

在 gunicorn 和 Tornado 上使用 Django 项目

如何让 Django 使用 Gunicorn 提供静态文件?

django、gunicorn 和 Nginx 的 502 错误

使用 Gunicorn 和 nginx 部署 Django 项目