Настройка nginx, uwsgi и django с django CMS на ubuntu 12.04 LTS

Записываю свой типовой шаблон настройки сервера с Ubuntu 12.04 LTS с нуля для раздачи django-проектов с помощью nginx, uwsgi и с изоляцией окружений с помощью virtualenv.

Для начала установка собственно ПО:

sudo apt-get install nginx uwsgi uwsgi-plugin-python \
python-virtualenv libjpeg62-dev

Используемая структура каталогов:

  • /var/lib/django/projects: для окружений virtualenv, соответствующих проектам
  • /web/: для статичных файлов проектов

nginx

Создаём файл настроек для своего сервера в /etc/nging/sites-available:

server {
    listen  80;
    server_name example.com;
    access_log /var/log/nginx/example.com_access.log;
    error_log /var/log/nginx/example.com_error.log;

    location / {
        uwsgi_pass  unix:///var/run/uwsgi/app/example-com/socket;
        include     uwsgi_params;
    }

    location /media/  {
        alias /web/example.com/media/;
    }

    location  /static/ {
        alias  /home/example.com/static/;
    }
}

uwsgi

И здесь создаём файл с настройками своего проекта. На этот раз в /etc/uwsgi/apps-available (обязательно с расширением .ini):

[uwsgi]
vhost = true
plugins = python
master = true
enable-threads = true
processes = 2
wsgi-file = /var/lib/django/projects/example-com/project/example/wsgi.py
virtualenv = /var/lib/django/projects/example-com
chdir = /var/lib/django/projects/example-com/project
touch-reload = /var/lib/django/projects/example-com/project/reload

Скрипт wsgi-file.py будет создан автоматически, когда вы создадите проект с django более-менее свежей версии. Я привожу пример для django 1.4, а для более ранних пути могут незначительно отличаться.

virtualenv

  • Создаём структуру каталогов и отдаём их пользователю www-data:
    sudo mkdir -p /var/lib/django/projects
    sudo mkdir -p /web/example.com/static
    sudo mkdir -p /web/example.com/media
    cd /var/lib/django/projects/
    sudo chown -R www-data:www-data /var/lib/django
    sudo chown -R www-data:www-data /web
    sudo su www-data -c /bin/bash
    
  • Инициализируем окружение (уже под пользователем www-data):
    virtualenv example-com
    cd example-com
    source bin/activate
    pip install django-cms south
    

PIL

В django CMS есть возможность использовать модуль sorl-thumbnail для автоматического масштабирования изображений под шаблон. Этот модуль требует для работы PIL а для поддержки большего числа форматов изображений перед установкой PIL рекомендуется сделать следующее (отсюда):

  • Установка зависимостей:
    sudo apt-get build-dep python-imaging
    
  • Линковка библиотек туда, где их найдёт установщик 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/
    
  • И устанавливаем сам PIL (предварительно активировав virtualenv):
    pip install --upgrade PIL
    

Развёртывание проекта

Для установки проекта в нужное окружение я использую простой скрипт вроде этого (т.к. для контроля версий использую git, нет необходимости делать отдельно экспорт, чтобы избавиться от мусора):

#! /bin/bash
sudo -u www-data cp -R project /var/lib/django/projects/example-com/
cd /var/lib/django/projects/example-com/project
source ../bin/activate
sudo -u www-data ../bin/python manage.py collectstatic
deactivate
sudo /etc/init.d/uwsgi restart

P.S.: См. также Шаблон для debian-пакетов, использующих virtualenv

3 thoughts on “Настройка nginx, uwsgi и django с django CMS на ubuntu 12.04 LTS”

  1. А как я попаду в дирректорию с django-cms? (0.0.0.0:80/bla?) И где вообще можно более подробно на эту тему почитать? А то вроже как все сделал, но почти ничего не понял?

    1. Не очень понял вопрос – по идее после настройки у вас будет веб-сервер (nginx), раздающий ваш django-проект посредством wsgi, Т.е. тот адрес (хост), который вы настроете в nginx и надо использовать для доступа к проекту.

Leave a Reply