django: подача статических файлов через nginx
Я использую apache+mod_wsgi для Django.
И все CSS / JS / изображения обслуживаются через nginx
,
По какой-то странной причине, когда другие / друзья / коллеги пытаются получить доступ к сайту, jquery/css не загружается для них, поэтому страница выглядит запутанной.
Мои HTML-файлы используют такой код -
<link rel="stylesheet" type="text/css" href="http://x.x.x.x:8000/css/custom.css"/>
<script type="text/javascript" src="http://1x.x.x.x:8000/js/custom.js"></script>
Моя конфигурация nginx в sites-available
это так -
server {
listen 8000;
server_name localhost;
access_log /var/log/nginx/aa8000.access.log;
error_log /var/log/nginx/aa8000.error.log;
location / {
index index.html index.htm;
}
location /static/ {
autoindex on;
root /opt/aa/webroot/;
}
}
Есть каталог /opt/aa/webroot/static/
которые имеют соответствующие css
& js
каталоги.
Странно то, что страницы отображаются нормально, когда я к ним обращаюсь.
Я очистил свой кэш / и т. Д., Но страница загружается нормально для меня из разных браузеров.
Кроме того, я не вижу 404 ошибок в файлах журнала nginx.
Любые указатели были бы великолепны.
5 ответов
server_name
должен совпадать с именем хоста вlink
/script
URL-адрес. Либо объявите вашу конфигурацию по умолчанию для этого интерфейса: пара портов (listen 8000 default
)- Nginx должен прослушивать интерфейс, к которому привязан IP вашего хоста (в вашем случае это нормально)
Я думаю, используя root
в блоке местоположения неверно. я использую alias
и работает нормально, даже без переконфигурирования django.
# django settings.py
MEDIA_URL = '/static/'
# nginx server config
server {
...
location /static {
autoindex on;
alias /opt/aa/webroot/;
}
}
Надеюсь, что это делает вещи проще.
Я тоже боролся с этим. Однако у меня сработал следующий трюк:
server {
listen 8000;
server_name localhost;
access_log /var/log/nginx/aa8000.access.log;
error_log /var/log/nginx/aa8000.error.log;
location / {
index index.html index.htm;
}
location ^/static/ {
autoindex on;
root /opt/aa/webroot/;
}
}
Я просто пометил статические как регулярное выражение с ^
и nginx начал обслуживать статические файлы. Никаких изменений на стороне Django не требовалось.
MEDIA_URL не должен использоваться для обслуживания статического контента, такого как js и т. Д. Django предоставляет отдельную опцию настроек STATIC_URL, которую можно использовать.
Так что это можно изменить как
<script type="text/javascript" src="{{STATIC_URL}}js/jquery-1.3.2.min.js"></script>
Кроме того, более стандартно использовать тег шаблона приложения staticfile следующим образом:
{% load static from staticfiles %}
<script type="text/javascript" src="{% static 'js/jquery-1.3.2.min.js' %}"></script>
Fim & Alexander - Спасибо за подсказки, которые помогли.
Вот как я решил это для всех, кто застрял в одной лодке -
settings.py -
>MEDIA_ROOT = ''
MEDIA_URL = 'http://x.x.x.x:8000/static/'
В моем HTML -
<script type="text/javascript" src="{{MEDIA_URL}}js/jquery-1.3.2.min.js"></script>
В моем views.py -
return render_to_response('templates/login-register.html', {},
context_instance=RequestContext(request));
nginx внутри конфигурационного файла с сайтами -
listen x.x.x.x:8000;
server_name x.x.x.x.;
Перезапустил nginx
Перезапущенный апач