Когда я впервые начал работать с 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
Межсетевой экран
Нам нужно открыть брандмауэр, чтобы нам было разрешено соединение, если вы ничего не знаете об этом, посмотрите эти ссылки.
- http://cloudservers.rackspacecloud.com/index.php/Firewalls
- http://cloudservers.rackspacecloud.com/index.php/Introduction_to_iptables
- http://cloudservers.rackspacecloud.com/index.php/Sample_iptables_ruleset
# 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/