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
справочники.
странно, что страницы показывают хорошо, когда я обращаюсь к ним.
Я очистил свой кэш / etc, но страница загружается нормально для меня, из разных браузеров.
кроме того, я не вижу 404 никаких ошибок в файлах журнала nginx.
любой указатели было бы здорово.
5 ответов
-
server_name
должно совпадать имя хоста вlink
/script
URL-адреса. Либо объявите свою конфигурацию по умолчанию для этого интерфейса: Port pair (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/;
}
}
надеюсь, это упрощает дело.
MEDIA_URL не должен использоваться для обслуживания статического контента, такого как js и т. д. Django предоставляет отдельный параметр настроек STATIC_URL, который можно использовать.
Так что это можно изменить как
<script type="text/javascript" src="{{STATIC_URL}}js/jquery-1.3.2.min.js"></script>
кроме того, его более стандартным для использования staticfile App templatetag, как это:
{% 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 и внутри сайтов-доступен файл config -
listen x.x.x.x:8000;
server_name x.x.x.x.;
перезапустить nginx и
перезапущен apache
Я тоже боролся с этим. Однако следующий трюк сработал для меня:
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/;
}
}
Я просто отметил static как регулярное выражение с ^
и nginx начал обслуживать статические файлы. Никаких изменений на стороне Django не требовалось.