Django: обслуживание статических файлов через nginx
Я использую apache + mod_wsgi для django.
И все css/js/images
подаются через nginx
.
По какой-то нечетной причине, когда others/friends/colleagues
пытается получить доступ к сайту, jquery/css
есть not getting loaded
для них, поэтому страница выглядит перепутанной.
В моих html файлах используется такой код -
<link rel="stylesheet" type="text/css" href="#" onclick="location.href='http://x.x.x.x:8000/css/custom.css'; return false;"/>
<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.
Любые указатели будут замечательными.
Ответы
Ответ 1
-
server_name
должно соответствовать имени хоста в URL link
/script
. Либо объявите конфигурацию по умолчанию для этого интерфейса: пара портов (listen 8000 default
)
- Nginx должен прослушивать интерфейс, на котором привязан ваш IP-адрес хоста (в вашем случае он выглядит нормально)
Ответ 2
Я думаю, что использование root
в блоке местоположения неверно. Я использую alias
, и он работает нормально, даже без повторной настройки django.
# django settings.py
MEDIA_URL = '/static/'
# nginx server config
server {
...
location /static {
autoindex on;
alias /opt/aa/webroot/;
}
}
Надеюсь, это упростит ситуацию.
Ответ 3
MEDIA_URL не используется для обслуживания статического контента, такого как js и т.д. Django предоставляет отдельный параметр STATIC_URL, который можно использовать.
Таким образом, это можно изменить как
<script type="text/javascript" src="{{STATIC_URL}}js/jquery-1.3.2.min.js"></script>
Кроме того, его более стандартный вариант использования templatetag приложения staticfile:
{% load static from staticfiles %}
<script type="text/javascript" src="{% static 'js/jquery-1.3.2.min.js' %}"></script>
Документы здесь
Ответ 4
Фим и Александр - Спасибо за подсказки, которые им помогли.
Вот как я решил это для тех, кто застрял в одной лодке -
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
Перезапущенный apache
Ответ 5
Я также боролся с этим. Однако следующий трюк работал у меня:
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 как regex с ^
, а nginx начал обслуживать статические файлы. Никаких изменений на стороне Django не было.