Как запустить nginx, gevent, virtualenv и django - PullRequest
3 голосов
/ 09 сентября 2011

Я не могу найти хорошее руководство о том, как запустить Nginx в качестве обратного прокси-сервера, Gevent в качестве http-сервера и django в virtualenv.

Я нашел похожее учебное пособие , однако его для uWSGI, а не для gevent. Буду признателен за любые указания о том, как сделать это с Gevent.

Спасибо

Ответы [ 2 ]

4 голосов
/ 06 февраля 2013

Это может быть сложно для кого-то вроде меня, который никогда не пробовал nginx, gunicorn и gevent.Я использую Debian Squeeze и предпочитаю pip в virtualenv, а не пакеты deb, потому что некоторые пакеты в стабильной версии устарели, но, конечно, они просто стабильны.Иногда Дебс может помочь в управлении (смотри решение Gunicorn).Я не хочу chroot , но это легко - я просто считаю, что это мне не нужно.

Прежде всего, вы должны создать пользователя с именем webd для лучшей изоляции.Я предполагаю, что группа webd существует.Вы можете проверить его существование с помощью:

root$ cat /etc/group | cut -d: -f1 | grep -E '^webd'

Это печатает webd, если группа существует.Если нет, замените -g webd на -U в приведенной ниже команде.Сначала прочитайте useradd --help.

root$ useradd --home-dir /var/web --create-home --shell /bin/bash -g webd webd

Установите pip и virtualenv из официального репо.

root$ aptitude install python-pip python-virtualenv

В качестве помощника virtualenv вы можетеиспользуйте virtualenvwrapper , но его версия deb очень старая, поэтому я предпочитаю использовать вместо нее pip:

root$ pip install virtualenvwrapper

Добавить следующую строку в конец /var/web/.bashrc:

source /usr/local/bin/virtualenvwrapper.sh

Давайте подготовим virtualenv для производства с помощью gevent и django 1.5c1.Вам может понадобиться установить некоторые dev-пакеты из репозитория Debian, чтобы рассказать о некоторых из нижеприведенных - если у вас есть проблемы, пожалуйста, сообщите мне об этом.

root$ su - webd
webd$ mkvirtualenv --no-site-packages production
(production)webd$ pip install -U distribute
(production)webd$ pip install gunicorn
(production)webd$ pip install gevent
(production)webd$ pip install https://www.djangoproject.com/download/1.5c1/tarball/
(production)webd$ pip install django-gevent-deploy
(production)webd$ cd .virtualenvs/production/bin/
(production)webd$ ln -s django-admin.py django-admin
(production)webd$ exit
root$ su - webd
webd$ workon production
(production)webd$ python
Python 2.6.6 (r266:84292, Dec 27 2010, 00:02:40)
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information
>>> import django
>>> django.VERSION
(1, 5, 0, 'rc', 1)

Дополнительно получите поддержку pytz и postgres:

(production)webd$ pip install pytz
(production)webd$ pip install psycopg2
(production)webd$ pip install gevent-psycopg2

Если вы хотите выйти из производства, используйте deactivate.Если вы хотите активировать его, используйте workon production.Давайте создадим жизненное пространство django (я предпочитаю один мастер-проект django):

(production)webd$ django-admin startproject myproject
(production)webd$ mv myproject/manage.py ./
(production)webd$ chmod u+x manage.py
(production)webd$ mv myproject/myproject/* myproject/
(production)webd$ rm -rf myproject/myproject/
(production)webd$ vim manage.py

Изменитесь на что-то вроде этого:

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    if not '/var/web' in sys.path:
        sys.path.append('/var/web')

    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

Вам нужно будет настроить myproject/settings.py файл вероятно.

Я хочу использовать последнюю версию gunicorn 0.17.2, поэтому я установил ее в производство virtualenv по пунктам.Но я хочу управлять демоном gunicorn, как и другими демонами, тоже /etc/init.d/gunicorn, поэтому давайте установим последнюю возможную, но устаревшую версию 0.14.5 из репозитория backports.

Как уже упоминалось выше, вам понадобится несколько дэбов - некоторые из официальныхрепо, а некоторые из squeeze-backports.Если вы еще не использовали бэкпорт, добавьте эту строку в /etc/apt/sources.list:

deb http://backports.debian.org/debian-backports squeeze-backports main

Обновите свои источники и установите gunicorn:

root$ aptitude update
root$ aptitude -t squeeze-backports install gunicorn

Gunicorn поддерживает основы для virtualenv, но естьнет стандартного способа использовать выделенного gunicorn из скрипта start-stop другого демона.Я решил жестко закодировать эту функцию в файле /usr/sbin/gunicorn-debian.Найдите метод Config.start(self) и замените его первые строки на:

def start(self):
    gunicornpath = self['gunicornpath'] if 'gunicornpath' in self else '/usr/bin'

    daemon = {
        'wsgi': gunicornpath + '/gunicorn',
        'django': gunicornpath + '/gunicorn_django',
        'paster': gunicornpath + '/gunicorn_paster',
    }[self['mode']]

Давайте настроим сервер gunicorn.Создайте /etc/gunicorn.d/web.py файл и поместите (я еще не пробовал режим django):

CONFIG = {
    'mode': 'wsgi',
    'user': 'webd',
    'group': 'webd',
    'working_dir': '/var/web',
    'python': '/var/web/.virtualenvs/production/bin/python',
    'pythonpath': '/var/web/.virtualenvs/production/lib/python2.6',
    'gunicornpath': '/var/web/.virtualenvs/production/bin',
    'args': (
        '--bind=127.0.0.1:9090',
        '--workers=4',
        '--worker-class=egg:gunicorn#gevent',
        '--daemon',
        'myproject.wsgi:application',
    ),
}

Следующая установка nginx, более новая версия, пришла из официального репо (1.2.6-1 ~ dotdeb.0 вместо 1.2.1-2.2 ~ bpo60 + 1):

root$ aptitude install nginx

Создание и редактирование /etc/nginx/sites-available/myproject:

server {
    listen *:80;

    server_name mydomain.com;

    root /var/web/;

    location / {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_connect_timeout 10;
        proxy_read_timeout 10;
        proxy_pass http://localhost:9090/;
    }

    error_page 500 502 503 504 /err50x.html;
}

Пожалуйста, создайте /var/web/err50x.html тоже.Помните, что на реальном сервере вы должны установить static url и некоторые другие детали.Добавьте в качестве первой строки /etc/nginx/nginx.conf:

user webd webd

и chmod для каталогов журналов:

root$ chown -R webd:webd /var/log/gunicorn/ && chmod g+s /var/log/gunicorn/
root$ chown -R webd:webd /var/log/nginx/ && chmod g+s /var/log/nginx/

Примените изменения и запустите оборудование:

root$ cd /etc/nginx/sites-enabled/
root$ ln -s ../sites-available/myproject 001-myproject
root$ /etc/init.d/gunicorn restart
root$ /etc/init.d/nginx restart

Используйте это для оболочки проекта django:

(production)webd$ ~/manage.py shell

Для создания нового приложения используйте:

(production)webd$ cd ~/myproject/
(production)webd$ ~/manage.py startapp myapp

Были ли у вас проблемы?Какие вещи можно сделать лучше?

1 голос
/ 09 сентября 2011

uWSGI поддерживает gevent с версии 0.9.9, вы можете следовать руководству по его адаптации для плагина gevent:

http://projects.unbit.it/uwsgi/wiki/Gevent

...