Статические файлы не найдены (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 root
states,
Когда местоположение совпадает с последней частью значения директивы:
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
.