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 /", и если ваши настройки были в порядке, попробуйте перезагрузить сервер на локальном компьютере и попробуйте перезагрузить компьютер на удаленном компьютере. Я сталкивался с подобным, но после перезагрузки машины исправил проблему.

Используйте STATIC_URL с доменом. Это важно!

Другие вопросы по тегам