Это может быть сложно для кого-то вроде меня, который никогда не пробовал 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
Были ли у вас проблемы?Какие вещи можно сделать лучше?