Запускаем Django на uwsgi + nginx

Written by

in

Число проектов на сервере росло, а оперативная память не добавлялось так получилось что старый метод на большом числе проектов поедает много оперативной памяти. и вот пришло время разобраться с uwsgi — это WSGI сервер с некоторыми фенями, сам умеет пере запускаться когда обновляется код проекта (как в devserver) умеет сам убивать потомком если они начинают «тупить».

Теперь по порядку

aptitude install python-pip build-essential python-dev libxml2-dev
easy_install install uwsgiCode language: Bash (bash)

Для виртуал хоста используем примерно вот такой конфг, найденный на просторах тырнета

server {
    listen        80;
    listen        443;

    # указываем свой домен
    server_name   odmin4eg.org www.odmin4eg.org;

    # здесь мы задаем абсолютные пути к логам.
    # как я упоминал уже выше, каталог с логами у меня хранится в каталоге
    # с проектом, поэтому пути следующие:
    access_log    /home/odmin4eg.org/logs/nginx_access.log;
    error_log     /home/odmin4eg.org/logs/nginx_error.log;

    # ниже указывается каталог с django-проектом. как я указывал выше,
    # я храню его в подкаталоге www, поэтому путь такой:
    root          /home/odmin4eg.org/www/;

    location /
    {
        # ниже надо указать путь к socket'у, при помощи которого
        # nginx и uwsgi будут сообщаться.
        # в данном случае путь это '/var/tmp/odmin4eg_uwsgi.sock'
        uwsgi_pass unix:///var/tmp/odmin4eg_uwsgi.sock;
        include uwsgi_params;

        # 8 -- число буфферов
        # 128k -- размер буфера
        # фактически, мы сможем передать от Django в nginx только 1 мб информации.
        # играйтесь с этим значением при поднятии своего проекта
        uwsgi_buffers 8 128k;
    }

    # ниже описывается директория со статическими файлами проекта (css,js,etc)
    # /static/ -- это STATIC_URL, который вы должны посмотреть в 
    # в settings.py своего django проекта.
    location /static/ {
        # а вот здесь указываем абсолютный путь к директории со
        # статическими файлами
        alias /home/odmin4eg.org/www/static/;
        expires 30d;
    }
    # Это уже у кого как статика для админки
    location /media_admin {
        alias /usr/local/lib/python2.6/dist-packages/django/contrib/admin/media;
        }

}Code language: Bash (bash)

Дальше конфигурируем uwsgi — создаём файл
/home/odmin4eg.org/www/uwsgi.yaml

uwsgi:
    # указываем socket, при помощи которого будет происходить
    # взаимодействие между nginx и uwsgi
    socket: /var/tmp/odmin4eg_uwsgi.sock
    # здесь указываем путь к django-проекту
    pythonpath: /home/odmin4eg.org/www
    # устанавливаем переменную окружения, которая хранит имя settings файла
    env: DJANGO_SETTINGS_MODULE=settings
    # это имя модуля, который будет запускаться на выполнение
    # в такой постановке, будет запускаться wsgi.py из директории
    # указанной выше в 'pythonpath'
    module: wsgi
    # путь к лог файлу
    daemonize: /home/odmin4eg.org/logs/uwsgi.log
    # прочие настройки, значения который можно посмотреть на сайте uWSGI
    max-requests: 5000
    buffer-size: 32768
    harakiri: 30
    reload-mercy: 8
    master: 1
    no-orphans: 1
    # если выполнить команду "touch <имя ниже указанного файла>",
    # то произойдет перезапуск uwsgi демона.
    touch-reload: /home/odmin4eg.org/uwsgiCode language: Bash (bash)

ну и создаём файлик который будем пинать для перезагрузки демона

touch /home/odmin4eg.org/uwsgiCode language: Bash (bash)

ну и последнее осталось написать wsgi.py и положить его в каталог указанный в pythonpath (i.g., в /home/odmin4eg.org/www). wsgi.py выглядит до безумия просто:

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()Code language: Python (python)

запускаем

service nginx restart
uwsgi -y /home/odmin4eg.org/conf/uwsgi.yamlCode language: Bash (bash)

У меня всё поехало после этого.
по мативам kalnitsky.org

Comments

4 ответа для «Запускаем Django на uwsgi + nginx»

  1. Аватар пользователя _sined_
    _sined_

    а как такой вариант: gunicorn + nginx + supervisord 😛

  2. Аватар пользователя swefwsfsd
    swefwsfsd

    нехватает
    virtualenv и python-mysql/psycopg

    для nginx лучше/быстрее
    service nginx reload

    touch-reload экономичнее ставить на сам файл конфига

    а вообще лучше начать с самой установки — там больше проблем встречается, в особенности когда начинаются пляски с версиями софта изза несовместимости библиотек

  3. Аватар пользователя _sined_
    _sined_

    это смотря откуда ставить, если оф сайтов, то да…проблемы будут…а если тянуть с реп, то без проблем 🙂

  4. Аватар пользователя vak
    vak

    typo:
    easy_install uwsgi
    not
    easy_install install uwsgi

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *