Статические файлы не найдены (gunicorn)

Я знаю, что этот вопрос уже часто задавался. Но предполагаемые решения, похоже, не помогают мне.

Вот мое определение Nginx для статических файлов

    location /static/ {
        alias /data/atsi_webapp/ATSi_WebApp/static;
    }

Вот мои настройки Django

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = '/static/'
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

Я уже бежал

python manage.py collectstatic

Однако, я получаю

Не найдено: /static/js/xxx.js

.

Я думаю, что ваша декларация nginx вызывает проблему.

Попробуйте, пожалуйста, следующее:

location /static/ {
    # static files
    autoindex on;
    autoindex_exact_size off;
    # /data/atsi_webapp/ATSi_WebApp <-- may be in your case
    root /exact/path/to/project/folder;
}

Вместо этого:

location /static/ {
    alias /data/atsi_webapp/ATSi_WebApp/static;
}

Эта ошибка, связанная с неправильным использованием директивы alias nginx, снова и снова обсуждается на SO. Предположим, у вас есть запрос http://example.com/static/js/script.js. Нормализованный URI этого запроса, который обрабатывается директивой nginx location /static/ { ... }, равен /static/js/script.js. Когда у вас есть директива alias /data/atsi_webapp/ATSi_WebApp/static; внутри этого места, nginx удаляет из URI префикс /static/, используемый в директиве location, и добавляет оставшуюся часть к пути, указанному в директиве asias. В результате происходит конкатенация строк /data/atsi_webapp/ATSi_WebApp/static и js/script.js, что дает неправильный путь/имя файла /data/atsi_webapp/ATSi_WebApp/staticjs/script.js. Поэтому общее правило написания пути при использовании директивы alias заключается в том, чтобы использовать косую черту в пути, если она была в директиве location, и не использовать ее в противном случае. Это означает, что когда вы используете директиву alias, вы должны использовать либо

location /static {
    alias /data/atsi_webapp/ATSi_WebApp/static;
}

или

location /static/ {
    alias /data/atsi_webapp/ATSi_WebApp/static/;
}

блоки размещения для ваших статических файлов (я думаю, что второй вариант предпочтительнее).

<<<С другой стороны, директива

добавляет свой путь к полному URI запроса. Согласно документации nginx rootstates,

Когда местоположение совпадает с последней частью значения директивы:

location /images/ {
    alias /data/w3/images/;
}

вместо нее лучше использовать директиву root:

location /images/ {
    root /data/w3;
}

Так что @Sabil ответ правильный (хотя в нем отсутствует объяснение) и лучше использовать

location /static/ {
    root /data/atsi_webapp/ATSi_WebApp;
}

Таким образом, для запроса http://example.com/static/js/script.js путь /data/atsi_webapp/ATSi_WebApp будет конкатенирован с нормализованным URI /static/js/script.js, что даст вам правильное имя/путь к файлу /data/atsi_webapp/ATSi_WebApp/static/js/script.js. Поскольку каждый нормализованный URI начинается со слэша, вы не обязаны добавлять этот слэш в конец аргумента директивы root, хотя его добавление не причинит столько вреда, сколько отсутствие необходимого слэша в конце аргумента директивы alias.

Вернуться на верх