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

Для установки всего комплекса ПО мы будем использовать репозитории самого Ubuntu и стандартный менеджер пакетов apt
Откроем консоль в Ubuntu и установим 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.