Статьи

Настройка Green Unicorn, nginx, supervisord и fabric на CentOS 5.5 для Django

Когда я впервые начал работать с Django, я развернул свои приложения, используя Apache и mod_python. Затем, через некоторое время, я начал играть с nginx и переключил свои настройки так, чтобы nginx обслуживал статический контент и обращался с прокси-запросами обратно к Apache и mod_python. Вскоре после этого я переключил mod_python с помощью mod_wsgi и запустил mod_wsgi в режиме демона.

Некоторое время эта настройка работала хорошо, но мне никогда не нравился тот факт, что мне нужно было запустить Apache, что довольно тяжело, даже когда вы удаляете все неиспользуемые модули. Apache великолепен, но все, для чего я действительно использовал его, был маршрутизатор между nginx и mod_wsgi, я не использовал никаких других функций в Apache.

Я посмотрел на fastcgi и uswgi, и они выглядели хорошо, но по тем или иным причинам я никогда не совершал прыжок. В последнее время я слышал много хорошего о зеленом единороге, поэтому я решил проверить это. Когда я впервые посмотрел на него, он был довольно новым и из-за этого немного беспокоился о стабильности, поэтому я следил за ним и наблюдал, как он созревает.

Пока я ждал зеленого единорога, я провел много исследований новых хостинговых сервисов python, которые недавно появились на рынке. Три из пяти сервисов, которые я посмотрел, использовали зеленого единорога, остальные два использовали uWSGI.

Тот факт, что эти три службы основывают там новые предприятия на зеленом единороге, придал ему большой авторитет. Вскоре после этого я начал играть с зеленым единорогом, чтобы посмотреть, что потребуется для запуска и запуска моих сайтов.

Первое, что я заметил, было то, что мне не нужно было создавать файл wsgi, если я использовал их команду gunicorn_django, что было довольно мило. Тот факт, что они встроили его в сервис, показывает, что Джанго — первоклассный гражданин.

Второе, что я заметил, было то, что мне нужен был способ запустить зеленого единорога и поддерживать его работу, что Apache делает для вас с mod_wsgi. Я провел небольшое исследование и обнаружил, что супервизор отлично подойдет для того, что мне нужно сделать с зеленым единорогом.

Поскольку видеть лучше, чем читать, я расскажу вам о шагах, которые вам нужно будет сделать, чтобы настроить систему таким образом, чтобы сделать использование единорога очень простым, особенно если вы хотите запустить более одного веб-сайта. на вашем сервере. Я собираюсь использовать 256-мегабайтный облачный экземпляр Renspace, работающий под управлением Centos 5.5.

Создайте Rackspace Cloud Server

Зайдите на веб-сайт управления облачным сервером RackSpace и выделите себе новый сервер CentOS 5.5 объемом 256 МБ или, если хотите, сделайте то же самое, используя их API. Теперь, когда у вас есть сервер и пароль пользователя root, следуйте пошаговым инструкциям, чтобы полностью настроить систему.

Программное обеспечение и версии

  • RackSpace Cloud Server 256MB
  • CentOS 5.5
  • Python 2.6.6
  • nginx 1.0.4
  • supervisord 3.0a10
  • virtualenv 1.6.1
  • пип 1.0.1
  • Gunicorn 0.12.2
  • ткань 1.1.0

Битбакет проект

Чтобы упростить задачу, я создал каталог проекта начальной загрузки django со всем файлом, использованным в посте блога. Он находится здесь, так что не стесняйтесь клонировать и раскошелиться.

https://bitbucket.org/kencochrane/django-gunicorn-nginx-supervisord-bootstrap/

Войти на сервер

ssh root@<RackSpaceIP>

Обновление пакетов

yum -y update

Установить пакеты

Возможно, вам не нужно все это прямо сейчас, но я обычно нуждаюсь в них, так что делаю их все сейчас

yum -y install emacs readline-devel ncurses-devel libevent-devel glib2-devel libjpeg-devel freetype-devel bzip2 bzip2-devel bzip2-libs openssl-devel pcre pcre-devel gpg make gcc yum-utils unzip

Добавить пользователя Django в качестве системного пользователя

useradd -d /opt/django -m -r django

Установите пароль для Django на то, что вы хотите

passwd django

Каталоги установки

mkdir -p /opt/django
mkdir -p /opt/django/apps
mkdir -p /opt/django/logs
mkdir -p /opt/django/logs/nginx
mkdir -p /opt/django/logs/apps
mkdir -p /opt/django/configs
mkdir -p /opt/django/scripts
mkdir -p /opt/django/htdocs
mkdir -p /opt/django/tmp
mkdir -p /opt/django/configs/nginx
mkdir -p /opt/django/configs/supervisord
mkdir -p /opt/django/apps/my_app

Добавить пустую страницу HTML

echo "<html><body>nothing here</body></html> " > /opt/django/htdocs/index.html

Установить Zlib

# download from zlib.net
mkdir -p /tmp/downloads
cd /tmp/downloads
wget http://www.zlib.net/zlib-1.2.5.tar.gz
tar -xvzf zlib-1.2.5.tar.gz
cd zlib-1.2.5
./configure -s
make install

Установите Python 2.6.6

CentOS 5.5 не поставляется с предустановленным python2.6, поэтому мы должны сделать это самостоятельно.

mkdir -p /tmp/downloads
cd /tmp/downloads
wget http://www.python.org/ftp/python/2.6.6/Python-2.6.6.tgz
tar -xvzf Python-2.6.6.tgz
cd Python-2.6.6
./configure --enable-shared
make
make altinstall

Добавьте следующее в / etc / profile

Нам нужно добавить путь к lib к LD_LIBRARY_PATH, иначе вы получите сообщение о том, что он не может найти libpython2.6.so.1.0

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/:/usr/local/lib64/

Источник Новый Профиль

source /etc/profile

Установить Распространить

mkdir -p /tmp/downloads
cd /tmp/downloads
curl -O http://python-distribute.org/distribute_setup.py
python2.6 distribute_setup.py

Установите Pip & virtualenv

mkdir -p /tmp/downloads
cd /tmp/downloads
curl -O -k https://raw.github.com/pypa/pip/master/contrib/get-pip.py
python2.6 get-pip.py
pip install virtualenv

Установить супервизор

pip install supervisor

Установить Mercurial

pip install mercurial

Установить nginx

mkdir -p /tmp/downloads
cd /tmp/downloads
wget http://nginx.org/download/nginx-1.0.4.tar.gz
tar -xzvf nginx-1.0.4.tar.gz
cd nginx-1.0.4
./configure --sbin-path=/usr/local/sbin --with-http_ssl_module --with-http_stub_status_module
make
/etc/init.d/nginx stop
sleep 2
sudo make install
sudo chmod +x /usr/local/sbin/nginx

Установите мое приложение

Добавьте сначала virtualenv

cd /opt/django/apps/my_app/
virtualenv --distribute --no-site-packages v0.1

# make this a post_create hook?
touch /opt/django/apps/my_app/v0.1/.venv

cd /opt/django/apps/my_app/v0.1/
hg clone https://bitbucket.org/kencochrane/django-gunicorn-nginx-supervisord-bootstrap my_app

ln -s /opt/django/apps/my_app/v0.1 /opt/django/apps/my_app/current

ln -s /opt/django/apps/my_app/current/my_app/conf/nginx.conf /opt/django/configs/nginx/myapp.conf

ln -s /opt/django/apps/my_app/current/my_app/conf/supervisord.conf /opt/django/configs/supervisord/myapp.conf

# activate the ve
source /opt/django/apps/my_app/current/bin/activate
cd /opt/django/apps/my_app/current/my_app/
./bootstrap.py

Настройте nginx

# as root
mkdir -p /etc/nginx
ln -s /opt/django/apps/my_app/current/my_app/server/etc/nginx.conf /etc/nginx/nginx.conf
ln -s /usr/local/nginx/conf/mime.types /etc/nginx/mime.types
ln -s /opt/django/apps/my_app/current/my_app/server/init.d/nginx /etc/init.d/nginx
chmod 755 /etc/init.d/nginx
chkconfig --add nginx
chkconfig nginx on

Настроить супервизор

# as root
ln -s /opt/django/apps/my_app/current/my_app/server/etc/supervisord.conf  /etc/supervisord.conf
ln -s /opt/django/apps/my_app/current/my_app/server/init.d/supervisord /etc/init.d/supervisord
chmod 755 /etc/init.d/supervisord
chkconfig --add supervisord
chkconfig supervisord on

Межсетевой экран

Нам нужно открыть брандмауэр, чтобы нам было разрешено соединение, если вы ничего не знаете об этом, посмотрите эти ссылки.

# Open http port 80
iptables -I RH-Firewall-1-INPUT -p tcp --dport 80 -j ACCEPT

Изменения в файле .bashrc

Я не могу вспомнить, где я увидел этот маленький трюк, если вы знаете, пожалуйста, дайте мне знать, чтобы я мог отдать им должное. Если вы поместите файл в свой каталог Mercurial с именем .venv, когда вы перейдете в каталог, этот маленький взломщик bash автоматически активирует вашу виртуальную среду. Это позволяет вам иметь нечто похожее на virtualenvwrapper в этой пользовательской настройке.

Добавьте этот код в файл .bashrc

emacs /opt/django/.bashrc
#
# User specific aliases and functions
has_virtualenv() {
    if [ -e .venv ]; then
        deactivate >/dev/null 2>&1
        source bin/activate
    fi
}

venv_cd () {
    cd "$@" && has_virtualenv
}

alias cd="venv_cd"

#end of changes

# source the file to get new changes in active shell
source /opt/django/.bashrc

Изменить разрешения домашнего каталога Django на Django

Это очищает и оставляет над владением корнем

chown -R django:django /opt/django/*

Переключиться на пользователя Django

su - django

Запустите nginx

service nginx start

Стартап-супервизор

service supervisord start

Проверьте nginx и supervisord

Проверьте статус супервизора

supervisorctl status
my_app                           RUNNING    pid 13594, uptime 0:00:05

Чтобы проверить nginx, перейдите по IP-адресу или доменному имени вашего сервера rackspace в браузере и убедитесь, что он работает.

Обновление приложения с использованием Fabric

Внутри каталога проекта bitbucket находится файл с именем fabfile.py. Этот файл позволит вам обновлять приложение с вашего компьютера в любое время, просто вызвав одну команду.

Он запросит у вас имя хоста и пароль для пользователя django. Затем он выйдет на сервер стойки, вытащит и обновит приложение и перезапустит приложение в режиме supervisord. На данный момент это очень просто, но вам стоит начать, если вы хотите делать более сложные вещи.

fab update_server

Теперь, когда у нас есть все настройки, если вы хотите добавить новое приложение в нашу настройку, все что нам нужно сделать, это:

  • создать новый каталог в приложениях
  • создать виртуал
  • запустить загрузчик для установки программного обеспечения
  • убедитесь, что приложение имеет конфигурационный файл supervisord и nginx
  • ссылки на эти файлы в правильные места в каталоге конфигурации
  • выполните любые команды управления питоном, которые вам могут понадобиться (syncdb, migrate и т. д.)
  • перезагрузить супервизор и nginx
  • тебе должно быть хорошо идти

Я надеюсь, что это было полезно для кого-то, кроме меня, если это было полезно для вас, пожалуйста, дайте мне знать в комментариях.

Источник: http://kencochrane.net/blog/2011/06/django-gunicorn-nginx-supervisord-fabric-centos55/