Развертывание приложения Django через ECS с uWSGI и nginx не может найти некоторые файлы

#django #docker #nginx #amazon-ecs

#django #docker #nginx #amazon-ecs

Вопрос:

В настоящее время я развертываю контейнерное приложение Django на Amazon ECS с использованием uWSGI и nginx, но у меня возникли некоторые проблемы с тем, что мой прокси-сервер находит часть статического содержимого. Когда я тестирую развертывание локального прокси-сервера с помощью docker-compose, он работает нормально, но не тогда, когда он развернут через ECS. Вот мой settings.py :

 # Static files (CSS, JavaScript, Images)
STATIC_URL = '/static/static/'
MEDIA_URL = '/static/media/'

STATIC_ROOT = '/vol/web/static'
MEDIA_ROOT = '/vol/web/media'

STATICFILES_DIRS = [
    # '/var/www/static/',
    os.path.join(BASE_DIR, 'core/static'),
]
 

Вот моя конфигурация прокси:

 server {
    listen ${LISTEN_PORT};

    location /static {
        alias /vol/static;
    }

    location / {
        uwsgi_pass              ${APP_HOST}:${APP_PORT};
        include                 /etc/nginx/uwsgi_params;
        client_max_body_size    10M;
    }
}
 

Определение контейнера для ECS:

 [
    {
        "name": "app",
        "image": "${app_image}",
        "essential": true,
        "memoryReservation": 256,
        "environment": [
            {"name": "DJANGO_SECRET_KEY", "value": "${django_secret_key}"},
            {"name": "DB_HOST", "value": "${db_host}"},
            {"name": "DB_NAME", "value": "${db_name}"},
            {"name": "DB_USER", "value": "${db_user}"},
            {"name": "DB_PASS", "value": "${db_pass}"},
            {"name": "ALLOWED_HOSTS", "value": "${allowed_hosts}"}
        ],
        "logConfiguration": {
            "logDriver": "awslogs",
            "options": {
                "awslogs-group": "${log_group_name}",
                "awslogs-region": "${log_group_region}",
                "awslogs-stream-prefix": "app"
            }
        },
        "portMappings": [
            {
                "containerPort": 9000,
                "hostPort": 9000
            }
        ],
        "mountPoints": [
            {
                "readOnly": false,
                "containerPath": "/vol/web",
                "sourceVolume": "static"
            }
        ]
    },
    {
        "name": "proxy",
        "image": "${proxy_image}",
        "essential": true,
        "portMappings": [
            {
                "containerPort": 8000,
                "hostPort": 8000
            }
        ],
        "memoryReservation": 256,
        "environment": [
            {"name": "APP_HOST", "value": "127.0.0.1"},
            {"name": "APP_PORT", "value": "9000"},
            {"name": "LISTEN_PORT", "value": "8000"}
        ],
        "logConfiguration": {
            "logDriver": "awslogs",
            "options": {
                "awslogs-group": "${log_group_name}",
                "awslogs-region": "${log_group_region}",
                "awslogs-stream-prefix": "proxy"
            }
        },
        "mountPoints": [
            {
                "readOnly": true,
                "containerPath": "/vol/static",
                "sourceVolume": "static"
            }
        ]
    }
]
 

Некоторые образцы журналов при локальном развертывании:

 proxy_1  | 172.18.0.1 - - [24/Nov/2020:15:58:01  0000] "POST /reader/<removed name>-readings/S87ktUMTff8/import HTTP/1.1" 302 0 "http://127.0.0.1:8000/reader/<removed name>-readings/S87ktUMTff8" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "-"
app_1    | [pid: 14|app: 0|req: 2/10] 172.18.0.1 () {60 vars in 1830 bytes} [Tue Nov 24 15:58:01 2020] POST /reader/<removed name>-readings/S87ktUMTff8/import => generated 0 bytes in 492 msecs (HTTP/1.1 302) 7 headers in 231 bytes (1 switches on core 0)
app_1    | [pid: 13|app: 0|req: 7/11] 172.18.0.1 () {54 vars in 1591 bytes} [Tue Nov 24 15:58:01 2020] GET /reader/<removed name>-readings/S87ktUMTff8 => generated 16879 bytes in 54 msecs (HTTP/1.1 200) 7 headers in 350 bytes (1 switches on core 0)
proxy_1  | 172.18.0.1 - - [24/Nov/2020:15:58:01  0000] "GET /reader/<removed name>-readings/S87ktUMTff8 HTTP/1.1" 200 16879 "http://127.0.0.1:8000/reader/<removed name>-readings/S87ktUMTff8" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "-"
proxy_1  | 172.18.0.1 - - [24/Nov/2020:15:58:01  0000] "GET /static/static/core/css/core.css HTTP/1.1" 304 0 "http://127.0.0.1:8000/reader/<removed name>-readings/S87ktUMTff8" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "-"
proxy_1  | 172.18.0.1 - - [24/Nov/2020:15:58:02  0000] "GET /static/static/assets/css/bootstrap.min.css HTTP/1.1" 304 0 "http://127.0.0.1:8000/reader/<removed name>-readings/S87ktUMTff8" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "-"
 

Примеры журналов из CloudWatch:

 2020-11-23T14:45:41.920-05:00

2020/11/23 19:45:41 [error] 10#10: *224 open() "/vol/static/static/core/images/homepageLogo.png" failed (2: No such file or directory), client: <removed IP>, server: , request: "GET /static/static/core/images/homepageLogo.png HTTP/1.1", host: "<removed IP>:8000", referrer: "http://<removed IP>:8000/"
2020/11/23 19:45:41 [error] 10#10: *224 open() "/vol/static/static/core/images/homepageLogo.png" failed (2: No such file or directory), client: <removed IP>, server: , request: "GET /static/static/core/images/homepageLogo.png HTTP/1.1", host: "<removed IP>:8000", referrer: "http://<removed IP>:8000/"

2020-11-23T14:45:41.920-05:00

<removed IP> - - [23/Nov/2020:19:45:41  0000] "GET /static/static/core/images/homepageLogo.png HTTP/1.1" 404 555 "http://<removed IP>:8000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "-"
<removed IP> - - [23/Nov/2020:19:45:41  0000] "GET /static/static/core/images/homepageLogo.png HTTP/1.1" 404 555 "http://<removed IP>:8000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "-"

2020-11-23T14:45:41.970-05:00

2020/11/23 19:45:41 [error] 10#10: *224 open() "/vol/static/static/core/css/homepage.css" failed (2: No such file or directory), client: <removed IP>, server: , request: "GET /static/static/core/css/homepage.css HTTP/1.1", host: "<removed IP>:8000", referrer: "http://<removed IP>:8000/"
2020/11/23 19:45:41 [error] 10#10: *224 open() "/vol/static/static/core/css/homepage.css" failed (2: No such file or directory), client: <removed IP>, server: , request: "GET /static/static/core/css/homepage.css HTTP/1.1", host: "<removed IP>:8000", referrer: "http://<removed IP>:8000/"

2020-11-23T14:45:41.970-05:00

<removed IP> - - [23/Nov/2020:19:45:41  0000] "GET /static/static/core/css/homepage.css HTTP/1.1" 404 555 "http://<removed IP>:8000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "-"
<removed IP> - - [23/Nov/2020:19:45:41  0000] "GET /static/static/core/css/homepage.css HTTP/1.1" 404 555 "http://<removed IP>:8000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "-"
 

Дайте мне знать, если есть какая-либо дополнительная информация, которую я мог бы предоставить.
Любая помощь будет с благодарностью! Заранее спасибо 🙂

Комментарии:

1.Похоже, что настройка монтирования тома требует некоторого внимания. Если вы можете проверить, что файлы (png, css) доступны на /vol/static/static/core/images /vol/static/static/core/css .

Ответ №1:

итак, я наконец понял, что было не так. Для тех, кто испытывает нечто подобное, это было потому, что я не установил в своем ALLOWED_HOSTS в Django разрешение локального IP-адреса запущенной задачи, и, следовательно, он продолжал отклонять запрос на проверку работоспособности балансировщиков нагрузки.

Я добавил это в свой settings.py :

 from socket import gethostname, gethostbyname

if os.environ.get('AWS_EXECUTION_ENV'):
    ALLOWED_HOSTS.append(gethostbyname(gethostname()))