2016-11-13 6 views
0

я не знаю, как Nginx обслуживает статические файлыДжанго + Nginx + Gunicorn - 404 для статического файла при отладке является ложным

/и т.д./Nginx/сайт доступный/по умолчанию:

upstream example.com { 
    server unix:/home/www/example/env/run/gunicorn.sock fail_timeout=0; 
} 

server { 
    listen 80; 
    server_name example.com; 
    client_max_body_size 4G; 

    access_log /home/www/example/logs/nginx-access.log; 
    error_log //home/www/example/logs/nginx-error.log; 

    location /static/ { 
     alias /home/www/example/codeab/static/; 
    } 

    location /uploads/ { 
     alias /home/www/example/codeab/uploads/; 
    } 
    location/{ 
     include proxy_params; 
     proxy_pass http://unix:/home/www/example/env/run/gunicorn.sock; 
    } 
    # Error pages 
    error_page 500 502 503 504 /500.html; 
    location = /500.html { 
     root /home/www/example/templates/; 
    } 
    error_page 404 /401.html; 
    location = /401.html { 
     root /home/www/example/codeab/templates/; 
     internal; 
    } 
} 

установка Django .py

STATIC_URL = '/static/' 
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static_content/'), 
) 
STATIC_ROOT = os.path.join(BASE_DIR,'static/') 

Кроме того, я сделал collectstatic до того DEBUG = False

кажется, что Nginx является не рассматривая вышеуказанный конфигурационный файл, так как для страницы 404 он не показывает мою пользовательскую страницу 401.html.

После редактирования конфигурации, я связал его с сайта-поддержкой по

sudo ln -s /etc/site-available/default /etc/site-enabled/default 
service nginx reload 
sudo service nginx restart 

Пожалуйста, помогите или дайте мне знать, если я пропускаю какие-то вещи.

+0

Добро пожаловать в переполнение стека! Благодарим вас за публикацию такого подробного описания вашей проблемы, это очень помогает. Несколько вещей, прежде чем мы перейдем к сути вашей проблемы. Если NGINX не видит файл конфигурации, как он возвращает 404 для ваших статических файлов? Связывание, которое вы указали в конце, является правильным, но вам нужно проверить 'nginx.conf', если он использует' include/etc/site-enabled/*; 'или' include/etc/site-enabled/* .conf; 'Если это' * .conf', вам нужно переименовать 'default' в' default.conf'. Кроме того, немного странно, что ваши 'site-enabled' и' site-available' находятся в '/ etc /' –

+0

Это не стандартная установка. В случае вашего пользовательского шаблона 4xx: Если NGINX служит для этого, он должен быть статическим HTML-файлом. У него не может быть никаких templatetags, поскольку он не обрабатывается Django.Мое предложение состояло в том, чтобы использовать внутреннюю схему ошибок Django для этого. Наконец, о ваших статических файлах, конфиг прав. Единственное, что я бы изменил, это 'location^~/static/{', так что NGINX знает, что он должен выполнять регулярное совпадение, а не прямое сравнение строк. –

+0

Привет Кинан, спасибо за быстрый ответ. Я проверил в своем nginx.conf, это 'include/etc/site-enabled/*;' поэтому имя файла верное, т.е. 'default' – anuj249

ответ

0

Просто измените конфигурацию в блоке Nginx сервера от

location /static/ { 
     alias /home/www/example/codeab/static/; 
    } 

К

location /static/ { 
     alias /home/www/example/codeab/static_content/; 
    } 

Причина, после команды python manage.py collectstatic исполнил статические файлы будут размещены внутри папки static_content ,

+0

Пробовал, все еще не работал. после выполнения collectstatic все файлы из static_content помещены в статическую папку. Вот почему вы проголосовали. – anuj249

+0

, так что вы нашли решение – pitaside

1

Я не знаю точное решение, но он начал работать над меняю gunicorn связывания с xxx.xxx.xx.xx:80 к xxx.xx.xx.xx:8000 и редактирование конфигурации, как -

location/{ 
     include proxy_params; 
     #proxy_pass http://unix:/home/www/example/env/run/gunicorn.sock; 
     proxy_pass http://xxx.xxx.xx.xx:8000; 
    } 

Я прокомментировал proxy_pass носка файл и добавил новую строку, как вы может видеть выше.

0

Nginx служит для хранения статических файлов из каталога, установленного в файле конфигурации nginx, под номером location /static/ и перенаправляет на пользовательскую страницу 404 html, определенную в конфигурации nginx, если вы не найдете такой статический ресурс в определенном каталоге.

Django отображает HTML-страницу 404, когда он не находит данный URL в любой из urls.py файлов Джанго, если вы установите Debug = False в settings.py, а также указать 'TEMPLATES'-'DIRS' установку в директорию, содержащую ваш 404 html, как описано в Django documentation.

Таким образом, эффективно, что nginx и Django отображают одну и ту же страницу 404 html, отличаются друг от друга и независимы друг от друга.