django nginx статические файлы 404
Вот мои настройки:
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),
)
STATIC_ROOT = '/home/django-projects/tshirtnation/staticfiles'
Вот моя конфигурация nginx:
server {
server_name 77.241.197.95;
access_log off;
location /static/ {
alias /home/django-projects/tshirtnation/staticfiles/;
}
location / {
proxy_pass http://127.0.0.1:8001;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;
add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
}
}
Я бегал python manage.py collectstatic
и он скопировал все статические файлы. Я запускаю свой сервер с gunicorn_django --bind:my-ip:8001, и кажется, что все работает, за исключением статических файлов.
РЕДАКТИРОВАТЬ: я бегу
sudo tail /var/log/nginx/error.log
и, похоже, нет ошибок статических файлов не найдено:/
13 ответов
Я столкнулся с той же проблемой и смог исправить мою конфигурацию nginx, удалив завершающий /
от /static/
место нахождения.
location /static { # "/static" NOT "/static/"
# ...
}
Попробуйте добавить ^~
префикс модификатор вашего статического местоположения, чтобы пропустить проверку регулярных выражений:
location ^~ /static/ {
alias /home/django-projects/tshirtnation/staticfiles/;
}
В вашем settings.py, поместите это:
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder'
)
STATIC_ROOT = "/home/django-projects/tshirtnation/staticfiles/"
STATIC_URL = '/static/'
Вам не нужно это:
STATICFILES_DIRS = ...
settings.py:
ALLOWED_HOSTS = ['*']
STATIC_URL = '/static/'
STATIC_ROOT = '/home/calosh/PycharmProjects/Proyecto_AES/static/'
MEDIA_ROOT = '/home/calosh/PycharmProjects/Proyecto_AES/media/'
MEDIA_URL = '/media/'
В конфигурациях nginx (/etc/nginx/sites-enabled/default)
server {
server_name localhost;
access_log off;
location /static/ {
alias /home/calosh/PycharmProjects/Proyecto_AES/static/;
}
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;
add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
}
}
Затем перезапустите сервер nginx:
sudo service nginx restart
И запустить Gunicorn:
gunicorn PFT.wsgi
Обслуживает приложение на локальном хосте или по всей локальной сети (на порту 80).
http://127.0.0.1/
Ваша проблема в том, что location /
блок всегда используется, даже после location /static/
один, так что все будет proxy_pass
редактор
Решение здесь заключается в использовании некоторых try_files
магия.
server {
server_name 77.241.197.95;
access_log off;
location / {
try_files $uri @django;
}
location /static/ {
alias /home/django-projects/tshirtnation/staticfiles/;
try_files $uri =404;
# here we use =404 because there is no need to pass it to gunicorn.
}
location @djago {
proxy_pass http://127.0.0.1:8001;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;
add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
}
}
Я столкнулся с этой проблемой и решил ее, добавив эти строки в проект
urls.py
файл:
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns = [
...
] += staticfiles_urlpatterns()
Также есть еще одна причина, по которой возникают такие проблемы, и она находится в основном файле конфигурации nginx по адресу
/etc/nginx/nginx.conf
. Убедитесь, что этот файл содержит следующие строки:
include /etc/nginx/mime.types;
default_type application/octet-stream;
Я думаю, что браузер пытается найти вашу статическую в:
http://127.0.0.1:8001/static/
Пока nginx по умолчанию работает на 80 порту.
Вам нужно определить порт 8001 в конфигурации nginx или запустить сервер django на 80 порту.
Попробуйте это в settings.py:
import os
ROOT_PATH = os.path.dirname(__file__)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(ROOT_PATH,'static/')
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),]
и файл конфигурации в nginx(или настройки вашего сервера):
location /static {
alias /home/djangohome/static; # your Django project's static files - amend as required
}
Моя выглядит так, и это сработало:
STATICFILES_DIRS = (
os.path.join(os.path.dirname(__file__), '..', 'static'),
)
И в конфигурации nginx мое местоположение / статическое / выше местоположения / вот так,
location /static {
//
}
# Finally, send all non-media requests to the Django server.
location / {
//
}
И еще одна вещь, я не знаю, имеет ли это значение, но у меня есть "прослушивание" на сервере {}. Я не уверен, может ли это помочь.
Проверь это
1 Имеется ли у nginx доступ к статической версии, я имею в виду разрешение папки.
2 Или сделай это
Заменить это:
STATIC_ROOT = '/home/django-projects/tshirtnation/staticfiles'
с этим
STATIC_ROOT = ''
И добавить это в настройках
STATICFILES_DIRS = (
'/home/django-projects/tshirtnation/staticfiles/',
)
Не забудьте перезагрузить сервер nginx.
Надеюсь, это работает.
Еще одна проблема, на которую следует обратить внимание: обязательно сопоставьте конечные косые черты. В примере ниже обаlocation
иalias
иметь конечные косые черты. Это также сработало бы, если бы ни один из них не работал, но они должны совпадать.
location /static/ {
alias /home/you/django/gtd/staticfiles/;
}
Местоположение имеет завершающую косую черту, а полный путь является псевдонимом, поэтому им обоим нужны завершающие косые черты, чтобы оставаться эквивалентными. Или вы можете удалить косую черту в конце обоих.
Попробуйте удалить косую черту в настройках nginx с последующим статическим, например, это должно быть "/ static", а не "/ static /", и если ваши настройки были в порядке, попробуйте перезагрузить сервер на локальном компьютере и попробуйте перезагрузить компьютер на удаленном компьютере. Я сталкивался с подобным, но после перезагрузки машины исправил проблему.