Я помещаю это здесь на случай, если кто-то захочет получить пример того, как это сделать для Apache и WSGI.Название вопроса сформулировано так, что оно охватывает не только nginx.
Apache / WSGI Daemon
В своем развертывании я решил сохранить информацию о подключении к базе данных из файла settings.py
.Вместо этого у меня есть путь /etc/django
, который содержит файлы с конфигурацией базы данных.Это подробно описано в ответе на другой вопрос .Однако, как побочный эффект, я могу проверить наличие этих файлов и нахождение проекта по определенному пути, чтобы определить, выполняется ли это как развертывание, и в settings.py
я определяю настройки IS_DEV
, IS_BETA
и IS_PROD
как True
или False
.Найти каталог проекта из settings.py
просто:
# Find where we live.
import os
BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir))
Все, что нуждается в пути к проекту, использует BASE_DIR
.Итак, в urls.py
у меня есть в конце:
# Only serve static media if in development (runserver) mode.
if settings.IS_DEV:
urlpatterns += patterns('',
url(r'^static/(?P<path>.*)$', 'django.views.static.serve',
{'document_root': settings.MEDIA_ROOT,
'show_indexes': True}),
)
(у меня также есть другой URL-адрес, который я использую для тестирования пользовательского интерфейса и не хочу в бета-версии или на производстве.)
Это относится к делу сервера разработки.Для производства мне просто нужно настроить конфигурацию Apache для обслуживания статических объектов.(Это приложение для внутренней сети с низкой и средней нагрузкой, поэтому у меня нет легковесного веб-сервера, такого как lighttpd, для обслуживания статических данных, вопреки рекомендации Django docs.) Поскольку я использую Fedora Core, я добавляю *Файл 1026 * в /etc/httpd/conf.d
, который выглядит примерно так:
WSGIDaemonProcess djangoproject threads=15
WSGISocketPrefix /var/run/wsgi/wsgi
Alias /django/static/ /var/www/djangoproject/static/
Alias /django/admin/media/ /usr/lib/python2.6/site-packages/django/contrib/admin/media/
WSGIScriptAlias /django /var/www/djangoproject/django.wsgi
WSGIProcessGroup djangoproject
<Directory /var/www/djangoproject>
Order deny,allow
Allow from all
</Directory>
<Directory /usr/lib/python2.6/site-packages/django/contrib/admin/media>
Order deny,allow
Allow from all
</Directory>
IIRC, ключом здесь является размещение строк Alias
перед строкой WSGIScriptAlias
.Также убедитесь, что у пользователя нет возможности загрузить ваш код;Я сделал это, поместив статический материал в каталог static
, которого нет в моем проекте Django.Вот почему BASE_DIR
дает каталог , содержащий каталог проекта Django.
Вы можете опустить строку WSGISocketPrefix
.У меня это есть, потому что администратор хочет, чтобы сокеты находились не в месте по умолчанию.
Мой файл WSGI находится в /var/www/djangoproject/django.wsgi
(то есть /django.wsgi
в репозитории Mercurial) и содержит что-то вроде:
import os
import sys
os.environ['DJANGO_SETTINGS_MODULE'] = 'djangoproject.settings'
os.environ['DB_CONFIG'] = '/etc/django/db_regular.py'
thisDir = os.path.dirname(__file__)
sys.path.append(thisDir)
sys.path.append(os.path.join(thisDir, 'djangoproject'))
sys.path.append(os.path.join(thisDir, 'lib'))
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
Хорошая особенность демонов WSGI заключается в том, что вам просто нужно touch django.wsgi
перезапустить ваш демон Django WSGI;вам не нужно перезагружать или перезагружать сервер Apache.Это делает администратора счастливым.
Наконец, так как мой /var/www/djangoproject
- это просто репозиторий Mercurial, у меня есть следующее в /var/www/djangoproject/.hg/hgrc
:
[hooks]
changegroup.1=find . -name \*.py[co] -exec rm -f {} \;
changegroup.2=hg update
changegroup.3=chgrp -Rf djangoproject . || true
changegroup.4=chmod -Rf g+w,o-rwx . || true
changegroup.5=find . -type d -exec chmod -f g+xs {} \;
changegroup.6=touch django.wsgi # Reloads the app
Это очищает байт-код Python, обновляетрабочая копия, исправляет все настройки и перезапускает демон всякий раз, когда разработчик запускает развертывание, так что любой пользователь из группы djangoproject
может войти в него, а не только тот, кто добавил файл.Излишне говорить, что будьте осторожны с тем, кого вы включаете в группу djangoproject
.
наборы zeekay STATIC_URL
, STATIC_ROOT
, STATICFILES_DIRS
, STATICFILES_FINDERS
и использует "django.contrib.staticfiles"
и "django.core.context_processors.static"
в его настройках.У меня их нет, поскольку мой код восходит к Django 1.1 и не использует {{ STATIC_ROOT }}
.
Надеюсь, это поможет.