Django CMS 1.8 + Nginx + Postgresql + Ubuntu 14.04. Пошаговое руководство
В данной статье приведен алгоритм установки популярной системы Django CMS на сервер ubuntu 14.04 с веб-сервером Nginx.
Django CMS является свободной и открытой системой управления контентом, использует веб-фреймворк Django, написанный на Python3. На момент написания мануала последняя версия django CMS 3.4
Основной источник информации: http://uwsgi.readthedocs.io/en/latest/tutorials/Django_and_nginx.html
Шаг 1 - установка веб-сервера Nginx
sudo apt-get update
sudo apt-get install nginx
Теперь сервер Nginx установлен.
Проверить его работу, можно открыв браузер и перейдя на IP адрес того компьютера на котором устанавливали Nginx: http://server_domain_name_or_IP
Если это ваш локальный компьютер то достаточно набрать http://localhost
Вы должны увидеть стартовую страницу Nginx:
Шаг 2 - установка сервера баз данных Postgresql
Для установки PostgreSQL выполните следующую команду в терминале:
$ sudo apt-get install postgresql
После установки необходимо создать супер-пользователя, а также базу данных для Django CMS и пользователя для этой базы. Пример настройки Postgresql есть по этой ссылке.
Пользователя для Django CMS и базу я создавал через webmin (очень удобное веб-приложение для управления вашим сайтом). В этом мануале имя пользователя базы данных: dbuser; пароль: dbpassw, имя базы: django-db.
Чтобы установить соединение с базой Postgresql, необходимо кроме сервера баз установить дополнительные программы:
$ sudo apt-get install python-psycopg2 python3-psycopg2 postgresql-server-dev-all
Шаг 3 - Установка необходимых зависимостей для django CMS
Установим необходимые пакеты через терминал:
$ sudo apt-get install -y libtiff5-dev libjpeg8-dev zlib1g-dev libfreetype6-dev
$ sudo apt-get install libjpeg8-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python-tk
$ sudo apt-get install libqd-dev
$ sudo apt-get install libmysqlclient-dev
Установим библиотеку обработки изображений PIL:
$ sudo apt-get install python-pil python3-pil
Если всё же не получилось корректно установить библиотеку PIL:
$ pip install -U --force Pillow
$ pip install --upgrade --force-reinstall --no-deps djangocms-installer
Если не получилось скорректировать PIL тогда попробуйте скорректировать библиотеку:
$ sudo ln -s /usr/lib/`uname -i`-linux-gnu/libfreetype.so /usr/lib/
$ sudo ln -s /usr/lib/`uname -i`-linux-gnu/libjpeg.so /usr/lib/
$ sudo ln -s /usr/lib/`uname -i`-linux-gnu/libz.so /usr/lib/
Шаг 4 - Установка django-cms с помощью мастера
Устанавливаем и запускаем виртуальное окружение:
$ sudo pip install --upgrade virtualenv $ virtualenv env $ source env/bin/activate
Устанавливаем django-cms с помощью мастера:
(env) $ pip install djangocms-installer (env) $ mkdir myproject && cd myproject (env) $ djangocms -f -p . mysite (env) $ python manage.py
Во время установки мастер попросит указать драйвер базы данных в формате uri:
postgresql://имя_пользователя_базы:пароль@localhost/имя_базы
В нашем примере:
postgresql://dbuser:dbpassw@localhost/django-db
В настройках проекта django (файл settings.py) укажем директорию для статики:
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
Убираем вывод диагностических сообщений и разрешаем доступ к сайту с других компьютеров
DEBUG = False ALLOWED_HOSTS = ['*']
Установка Django CMS завершена.
Устанавливаем uWSGI глобально
Веб-сервер может по запросу отдавать пользователям файлы из своей файловой системы, однако он не может напрямую работать с Djangо приложениями. Веб-серверу нужен интерфейс, который будет запускать Django приложение, передавать ему запрос от пользователя и возвращать ответ.
Для выполнения этих задач был разработан Web Server Gateway Interface — WSGI — стандарт взаимодействия Python программ и веб-сервра.
uWSGI — одна из реализаций WSGI.
Полный стек компонентов будет выглядеть следующим образом:
Пользователь <-> Веб-сервер <-> Сокет <-> uwsgi <-> Django
Устанавливаем uwsgi:
$ sudo pip install uwsgi
Конфигурация nginx для работы с Django
Нам понадобится файл uwsgi_params, который можно взять здесь: github.com/nginx/nginx/blob/master/conf/uwsgi_params.
Скачиваем его в корневую папку нашего проекта.
Создаем файл mysite_nginx.conf:
# mysite_nginx.conf
upstream django {
server unix:///path/to/your/mysite/mysite.sock; # взаимодействие с uwsgi через Unix-сокет
# server 127.0.0.1:8001; # взаимодействие с uwsgi через веб-порт
}
# конфигурация веб-сервера
server {
# порт, который будет слушать веб-сервер в ожидании запросов от пользователй
listen 80;
# доменное имя
server_name yourserver.com; # замените на собственный домен или IP адрес
charset utf-8;
# максимальный размер загружаемых на сервер данных
client_max_body_size 75M;
# обслуживание медиа файлов и статики
location /media {
alias /path/to/your/mysite/media; # расположение медиафайлов (при необходимости измените)
}
location /static {
alias /path/to/your/mysite/static; # расположение статики (при необходимости измените)
}
# Остальные запросы перенаправляются в Django приложение
location / {
uwsgi_pass django;
include /path/to/your/mysite/uwsgi_params; # файл uwsgi_params, который мы только что взяли с github
}
}
Этот конфигурационный файл указывает nginx, что он должен отдавать пользователям медиа и статик файлы из файловой системы, а все остальные запросы перенаправлять в Django приложение. В больших проектах лучше использовать два сервера: один для обслуживания статик и медиа файлов, а другой для Django приложения. С небольшими, и тем более с учебными проектами, справится и один сервер.
В папке /etc/nginx/sites-enabled
создаем ссылку на файл mysite_nginx.conf
, чтобы nginx увидел его:
sudo ln -s ~/path/to/your/mysite/mysite_nginx.conf /etc/nginx/sites-enabled/
Статика в одном месте
Перед запуском nginx поместим всю статику в папку static. Для этого добавляем в файл mysite/settings.py следующую строку:
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
И выполняем команду:
$ python manage.py collectstatic
Конфигурация uWSGI через ini файл
Очень удобно все опции, с которыми мы запускаем uWSGI, указать в ini файле, а при запуске передавать только путь к этому файлу.
Создаем файл mysite_uwsgi.ini
:
#mysite_uwsgi.ini
[uwsgi]
# Настройки, связанные с Django
# Корневая папка проекта (полный путь)
chdir = /path/to/your/project
# Django wsgi файл
module = project.wsgi
# полный путь к виртуальному окружению
home = /path/to/virtualenv
# общие настройки
# master
master = true
# максимальное количество процессов
processes = 10
# полный путь к файлу сокета
socket = /path/to/your/project/mysite.sock
# права доступа к файлу сокета
# chmod-socket = 664
# очищать окружение от служебных файлов uwsgi по завершению
vacuum = true
Режим Emperor
Если сервер обслуживает несколько проектов, каждый из которых использует uWSGI, то нужно использовать режим Emperor. В этом режиме uWSGI просматривает папку с конфигурационными файлами и для каждого файла запускает отдельный процесс (вассал).
Если один из конфигурационных файлов будет изменен, uWSGI перезапустит соответствующего вассала.
Создаем папку для конфигурационных файлов:
sudo mkdir /etc/uwsgi
sudo mkdir /etc/uwsgi/vassals
Создаем в ней ссылку на mysite_uwsgi.ini:
sudo ln -s /path/to/your/mysite/mysite_uwsgi.ini /etc/uwsgi/vassals/
Запускаем uWSGI в режиме Emperor:
sudo uwsgi --emperor /etc/uwsgi/vassals --uid www-data --gid user
вместо user написать имя пользователя, под которым открыт сеанс в ubuntu
Опции:
emperor
: папка с конфигурациолнными файламиuid
: id пользователя, от имени которого будет запущен процессgid
: id группы, от имени которой будет запущен процесс
Автоматический запуск uWSGI после загрузки операционной системы
Для автозапуска и самое главное, автоматического перезапуска сайта после сбоя используем системный Upstart:
/etc/init/uwsgi-emperor.conf # Emperor uWSGI script description "uWSGI Emperor" start on runlevel [2345] stop on runlevel [06] respawn exec uwsgi --emperor /etc/uwsgi/vassals --uid www-data --gid www-data
Если сайт работать не будет, поменяйте uid www-data на uid user, где user - имя пользователя, в домашнем каталоге которого находится проект mysite.