Обслуживание статических файлов Django в среде Elasticbeanstalk Docker - PullRequest
0 голосов
/ 01 мая 2018

При развертывании приложения Django в EB с использованием среды докера статические файлы возвращают 404.

Я использую gunicorn в док-контейнере, и поскольку не рекомендуется / невозможно (?) Подавать статические файлы через gunicorn, я хочу настроить EB nginx для их обслуживания с использованием файловой системы хоста.

Dockerfile

FROM python:3
....
....
# Expose listen ports
EXPOSE 8002

RUN chmod +x ./docker/container_start.sh

CMD ["sh", "./docker/container_start.sh"]

Dockerrun.aws.json

{
  "AWSEBDockerrunVersion": "1",
  "Ports": [
    {
      "ContainerPort": "8002"
    }
  ],
  "Volumes": [
    {
      "ContainerDirectory": "/app/assets",
      "HostDirectory": "/var/app/current/assets"
    }
  ]
}

Как я могу сказать EB nginx обслужить /assets/* с /var/app/current/assets и передать остальное в докер-контейнер?

Нечто подобное ниже не работает из-за среды докера.

option_settings:
  "aws:elasticbeanstalk:container:python:staticfiles":
    "/static/": "www/static/"

1 Ответ

0 голосов
/ 15 февраля 2019

У меня была точно такая же проблема! Решение состоит в том, чтобы настроить конфигурацию nginx в /etc/sites-enabled/elasticbeanstalk-nginx-docker-proxy.conf на сервере.

По сути, я скопировал содержимое этого файла в файл конфигурации .ebextension и добавил директиву местоположения для статической папки.

То же самое с вашим Dockerrun.aws.json

{
  "AWSEBDockerrunVersion": "1",
  "Ports": [
    {
      "ContainerPort": "8002"
    }
  ],
  "Volumes": [
    {
      "ContainerDirectory": "/app/assets",
      "HostDirectory": "/var/app/current/assets"
    }
  ]
}

Вы бы создали .ebextension / 01_nginx.config

files:
  "/etc/nginx/sites-enabled/elasticbeanstalk-nginx-docker-proxy.conf":
  mode: 000644
  owner: root
  group: root
  content: |
    map $http_upgrade $connection_upgrade {
        default        "upgrade";
        ""            "";
    }

    server {
        listen 80;

        gzip on;
        gzip_comp_level 4;
        gzip_types text/html text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2})") {
            set $year $1;
            set $month $2;
            set $day $3;
            set $hour $4;
        }
        access_log /var/log/nginx/healthd/application.log.$year-$month-$day-$hour healthd;

        access_log    /var/log/nginx/access.log;

        location /assets/ {
          root /var/current;
        }

        location / {
            proxy_pass            http://docker;
            proxy_http_version    1.1;

            proxy_set_header    Connection          $connection_upgrade;
            proxy_set_header    Upgrade             $http_upgrade;
            proxy_set_header    Host                $host;
            proxy_set_header    X-Real-IP           $remote_addr;
            proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
        }
    }

Это работает для меня!

...