В статье рассматривается развертывание приложений написанных с использование Django web framework. Для запуска приложения мы будем использовать интерфейс WSGI (Web Server Gateway Interface), который поддерживается в django. В качестве web-сервера будет использован nginx, а взаимодействие между nginx и WSGI будет осуществлено при помощи модуля uwsgi. 

Python будем собирать  из исходников. Причины этому по карйней мере две: во-первых, python3 из репозитариев ARM ubuntu собран без опции Py_ENABLE_SHARED, что при использовании uwsgi приводит к ошибке Fatal Python error: exceptions bootstrapping error.

Во-вторых в репозитарии python3 имеет версию 3.3, а в ней еще нет некоторых прикольных штук, например встроенного виртуального окружения venv.

Изменение размера tmp

По дефолту в lubuntu-server на cubietruck размер /tmp задан фиксированно на 20 МБ. Для дальнейшей работы этого маловато, так как мы будем собирать программы и модули для python из исходников. Для увеличения размера tmp в /etc/fstab указываем size=<размер>, вот так :

# UNCONFIGURED FSTAB FOR BASE SYSTEM
tmpfs            /tmp           tmpfs    size=200m 0       0

Я задал 200 МБ.

Теперь перемонтируем его:

sudo mount -o remount,noexec /tmp

Теперь приступаем к работе.

Сначала удалим python3 из репозитариев, если он вдруг установлен:

sudo apt-get remove python3 python3-pip python3-dev

Устанавливаем пакеты для сборки и начинаем её. Пакеты libpcre3 libpcre3-dev потом понадобятся при компиляции uswsgi (при выполнении pip3 install)

su
apt-get install libpcre3 libpcre3-dev build-essential libssl-dev libbz2-dev libsqlite3-dev sqlite3
wget https://www.python.org/ftp/python/3.4.2/Python-3.4.2.tar.xz
tar xf Python-3.4.2.tar.xz 
cd Python-3.4.2
./configure --enable-shared; make; make install;
ldconfig

Если все ок, устанавливаем uswcgi и django:

pip3 install uwsgi django

Создаем тестовый проект django_test:

cd /var/www/web
sudo django-admin.py startproject django_test
sudo chown -R linaro /var/www/web/django_test/
cd django_test

Создаём конфиг для nginx:

sudo vim /etc/nginx/sites-available/django_test

Туда добавляем следующее:

upstream django {
    server unix:///var/www/web/django_test/uwsgi.sock;
}
server {
    listen      80;
    server_name ваш.домен.com; #можете указать ваш айпи, если домена нет 
    charset     utf-8;
    client_max_body_size 75M;   
    # медиа-файлы и статику будем отдавать nginx-ом, для этого просто делаем алиасы ваш.домен.com/media - на папку с медиа-файлами и аналогично для ваш.домен.com/static
    location /media  {
        alias /var/www/web/django_test/media;  
    }
    location /static {
        alias /var/www/web/django_test/static; 
    }
    # ну а все остальное отдаем обрабатывать uwsgi
    location / { 
        uwsgi_pass django;
        include /var/www/web/django_test/wsgi_params;
    }
}

Сразу включаем сайт:

sudo ln -s /etc/nginx/sites-available/django_test /etc/nginx/sites-enabled/django_test

Создаём файл с параметрами wsgi:

vim /var/www/web/django_test/wsgi_params

Туда вписываем:

uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param HTTPS $https if_not_empty;
uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;

Теперь создадим конфиг для uwsgi. СНачала узнаем как определено WSGI-имя приложения:

cat /var/www/web/django_test/django_test/settings.py | grep WSGI

Как видим это:

WSGI_APPLICATION = 'django_test.wsgi.application'

Создаем конфиг:

vim /var/www/web/django_test/uwsgi.ini

Пишем туда:

[uwsgi]
; Starting path
chdir = /var/www/web/django_test
; uWSGI will be accessible through a file socket:
socket = /var/www/web/django_test/uwsgi.sock
; 664 or 644 offers better security...
chmod-socket = 667
; Set logging file
logto = /var/www/web/django_Test/uwsgi.log
; То что в WSGI_APPLICATION без .application
module = django_test.wsgi
; Ensure logging is enabled.
disable-logging = false

Запускаем uwsgi (пока вручную)

 

uwsgi --ini /var/www/web/django_test/uwsgi.ini

И запускаем nginx (если вы используете apache или еще что-то, что слушает 80ый порт, его нужно остановить)

sudo service nginx start

Если вы хотите что-бы другие домены обслуживались apache-ем, придется настроить в nginx редирект.

Заходим, проверяем.

Для запука uwsgi при старте ситстемы создаём файл:

sudo vim /etc/init/uwsgi.conf

и добавляем туда:

description "uwsgi tiny instance"
start on runlevel [2345]
stop on runlevel [06]
exec uwsgi --ini /var/www/web/django_test/uwsgi.ini