понедельник, 13 августа 2012 г.

Django на uWSGI и nginx

Старые способы запуска сервера, которыми я пользовался обычно, не предполагали, что на сервере больше одного приложения, да и в принципе сейчас уже несколько архаичны. В свете того, что Django с версии 1.4 официально перешла на WSGI, я решил набросать небольшой гайд по разворачиванию приложения на связке nginx+uWSGI.

Для начала разумеется, ставим nginx и uWSGI. Nginx наверняка есть в портах для вашей ОС, а uWSGI можно поставить через pip:
$pip install uwsgi

Сконфигурим сервер nginx:

server {            
        listen       80;                                      
        server_name  localhost;

        location / {
            root   "/path/to/project/www";
            uwsgi_pass unix:///var/tmp/project.sock;   #путь к сокету
            include uwsgi_params;     #маппинг параметров uwsgi 
            uwsgi_buffers 8 128k;     #8 буферов по 128k (для примера)

        }

        location /static/ {
            alias "/path/to/project/www/static/";
            expires 30d;
        }

        location /static/admin/ {
            alias /Library/Python/2.6/site-packages/django/contrib/admin/static/admin/;  #в этом примере для OS X

        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   share/nginx/html;
        }

    }

Теперь создадим конфиг-файл для uWSGI:
[uwsgi]
chdir=/path/to/project/www/ #путь, к рабочей папке проекта
module=project.wsgi:application #точка входа в wsgi-приложение
socket=/var/tmp/project.sock
master=True
home=/path/to/virtualenvs/project #путь к virtualenv
pidfile=/tmp/project-master.pid
vacuum=True
max-requests=5000
daemonize=/var/log/uwsgi/project.log
env=DJANGO_SETTINGS_MODULE=project.settings
max-requests=5000
buffer-size=32768
harakiri=30
reload-mercy=8
master=1
no-orphans=1
touch-reload=/path/to/project/www/uwsgi_reload
Сохраним конфиг в uwsgi.ini
Создадим файл для перезагрузки:
touch /path/to/project/www/uwsgi_reload

Запускается просто:
uwsgi uwsgi.ini

Чтобы убить, делаем
uwsgi --stop /tmp/project-master.pid

Чтобы перезапустить, просто трогаем файл перезагрузки:
touch /path/to/project/www/uwsgi_reload
Важное замечание: запустить сервер без virtualenv у меня под OS X не удалось. Почему-то все thrid-party библиотеки, включая django исчезали из python path при запуске uwsgi. Разбираться, почему так происходит я не стал, т.к. в реальой жизни обычно все запускается через virtualenv.

Комментариев нет:

Отправить комментарий