Настройка сервера для php и django сайтов: nginx, apache2, mysql,uWSGI
Предыстория: выбор Django/Python хостинга
Примерно два года я пользовался услугами WebFaction и был доволен. Там есть и возможность устанавливать/собирать свои приложения и БД не занимает память, положенную мне по тарифному плану как на виртуальных серверах. А еще мне не нужно было настраивать почту и DNS и всем этим можно было управляться через удобную панель. Словом — это классный хостинг, если нет больших нагрузок, нужно много места под файлы, трафик(он ограничен, но его более чем достаточно), и нет никакого желания заниматься настройкой сервера. А еще там хорошие цены на хостинг. И support: очень оперативно, по делу, вежливо и на английском. Последнее для кого-то может стать проблемой.
Но со временем я всё таки понял: сервера в Техасе, пинг за 200мс и на сервере кроме меня есть еще много пользователей и их процессов, что не может положительно влиять на производительность моих приложений. Слишком уж большая разница между 127.0.0.1 и общественным сервером за океаном
И вот, пришел день, когда мы занялись разработкой сервиса TaxiPult, и хостинг перестал устраивать не только меня, но и моего коллегу Ивана Маркеева.
Вопроса куда переносить проекты уже не стояло. К этому моменту я присмотрелся к облачному хостингу Scalaxy. Обычная VPS нас не устраивала, так как процедура увеличения ресурсов в этом случае болезненна и чревата долгим перерывом в работе, а у большинства хостинговых компаний всё сводится к ответу технической поддержки в стиле: «Переходите на выделенный сервер».
Scalaxy в свою очередь предоставляет возможность увеличения ресурсов даже без перезагрузки сервера(исключение — «жесткие диски»). А для случаев когда нагрузка резко возростает, можно настроить автоматическое увеличение используемых слотов(влияет на количество доступной оперативной памяти, CPU, и внешней сети). И конечно же оплата идет за используемые ресурсы — как только пик нагрузки спадет, вы станете платить меньше.
На момент написания статьи Scalaxy предоставляет возможность выбрать одну из 6 linux систем: Debian 5 и 6, Ubuntu 10.04 LTS, CentOS 5.5 и OpenSUSE 11.3.
Выбранная мною конфигурация на первое время: Ubuntu 10.04 LTS, 1 Слот без возможности расширения(512 mb RAM, SWAP 1 GB, Внешняя сеть 5 Mbit/s), 5 гб жесткий диск и всё это обходится в 516 рублей в месяц. IP адрес: 25 рублей в месяц.
Важно! При резервировании большого количества слотов для расширения, память вашего сервера будет занята этим резервом и не будет доступна вашим приложениям. В цифрах: выбрав 1 слот и максимальное их количество: 32 вы займете сразу ~450 мб оперативки из 512 мб.
Собственно настройка
Дабы ничего не забыть — я специально создам новый сервер с указанной выше конфигурацией.
Сразу после загрузки созданного сервера, возможно подключится к нему по ssh. Пароль root’а использовался при создании сервера.
Наша цель: настроить веб-сервер с поддержкой php, django/uwsgi, спрятать это за nginx и установить mysql и Subversion
Для начала обновим кеш пакетов apt и получим обновления
apt-get update apt-get upgrade
Теперь установим самое простое:
Установка mysql:
apt-get install mysql-server
Во время установки нас спросят root пароль для сервера БД.
Установка Subversion:
apt-get install subversion
Установка Apache2 и php
apt-get install libapache2-mod-php5 php5-mysql
Это установит Apache2, Php5 и модуль php для работы с базой данных Mysql.
Мне гараздо комфортнее работать с mc поэтому предлагаю установить и его:
apt-get install mc
Настройка Apache2
По умолчанию, Apache2 работает использует порт 80, но мы сменим его на 8080, чтобы освободить место для nginx.
Для этого отредактируем файл /etc/apache2/ports.conf:
mcedit /etc/apache2/ports.conf
Меняем:
NameVirtualHost *:80 Listen 80
На:
NameVirtualHost *:8080 Listen 8080
Сохраняем (F2) и выходим из редактора (F10).
Перезагрузим Apache2 для применения настроек:
service apache2 restart
Настройка PHP: Установка eAccelerator
При обработке каждого запроса, php каждый раз читает скрипты и исполняет их. Это занимает сравнительно много времени. Сравнительно с тем, что их можно не читать каждый раз, а они раз скомпилировать и использовать запускать скомпилированные файлы. Именно это ползволяет делать eAccelerator, ускоряя тем самым работу php порой в 10 раз!
apt-get install php5-dev
cd /tmp/ wget http://bart.eaccelerator.net/source/0.9.6.1/eaccelerator-0.9.6.1.tar.bz2 tar xvjf eaccelerator-0.9.6.1.tar.bz2 cd eaccelerator-0.9.6.1 phpize ./configure --enable-eaccelerator=shared make make install Теперь подключим eAccelerator к PHP:
cd /etc/php5/conf.d/ mcedit eaccelerator.ini
В файл вставим следующее:
zend_extension = "/usr/lib/php5/20090626/eaccelerator.so" eaccelerator.shm_size = "16" eaccelerator.cache_dir = "/var/cache/eaccelerator" eaccelerator.enable = "1" eaccelerator.optimizer = "1" eaccelerator.check_mtime = "1" eaccelerator.debug = "0" eaccelerator.filter = "" eaccelerator.shm_max = "0" eaccelerator.shm_ttl = "0" eaccelerator.shm_prune_period = "0" eaccelerator.shm_only = "0" eaccelerator.compress = "1" eaccelerator.compress_level = "7" eaccelerator.allowed_admin_path = "/var/www/eaccelerator"
А еще нужно создать каталоги для кеша:
mkdir /var/cache/eaccelerator chown root:www-data /var/cache/eaccelerator chmod g=rwx,o= /var/cache/eaccelerator
Перезагрузим Apache2:
service apache2 restart
Теперь php скрипты будут работать в разы быстрее.
Вернемся в домашний каталог
cd
Установка uWSGI
Перед тем как собрать Nginx, uWSGI должен быть скомпилирован, чтобы в последствии быть включенным в сборку Nginx.
apt-get install build-essential python-dev libxml2-dev wget http://projects.unbit.it/downloads/uwsgi-0.9.7.tar.gz tar xfz uwsgi-0.9.7.tar.gz cd uwsgi-0.9.7 make -f Makefile.Py26
Теперь скопируем исполняемый файл в /usr/local/sbin:
cp uwsgi /usr/local/sbin
А еще нужно скопировать стандартные настройки uwsgi в каталог /etc/nginx:
mkdir /etc/nginx cp nginx/uwsgi_params /etc/nginx cd ..
Nginx
Далее нам потребуется установка пакетов с исходниками. А для того, чтобы их получить нам потребуется изменить список источников apt.
mcedit /etc/apt/sources.list
Файл /etc/apt/sources.list у меня содержит это:
deb http://ru.archive.ubuntu.com/ubuntu/ lucid main restricted deb http://ru.archive.ubuntu.com/ubuntu/ lucid-updates main restricted deb http://ru.archive.ubuntu.com/ubuntu/ lucid universe deb http://ru.archive.ubuntu.com/ubuntu/ lucid-updates universe deb http://ru.archive.ubuntu.com/ubuntu/ lucid multiverse deb http://ru.archive.ubuntu.com/ubuntu/ lucid-updates multiverse deb-src http://ru.archive.ubuntu.com/ubuntu/ lucid main restricted deb-src http://ru.archive.ubuntu.com/ubuntu/ lucid-updates main restricted deb-src http://ru.archive.ubuntu.com/ubuntu/ lucid universe deb-src http://ru.archive.ubuntu.com/ubuntu/ lucid-updates universe deb-src http://ru.archive.ubuntu.com/ubuntu/ lucid multiverse deb-src http://ru.archive.ubuntu.com/ubuntu/ lucid-updates multiverse deb http://security.ubuntu.com/ubuntu lucid-security main restricted deb http://security.ubuntu.com/ubuntu lucid-security universe deb http://security.ubuntu.com/ubuntu lucid-security multiverse
Сохраняем (F2) выходим(F10)
apt-get update
Теперь можем продолжать с nginx:
apt-get install libssl-dev apt-get build-dep nginx apt-get source nginx cd nginx-0.7* mcedit debian/rules
Добавьте эти строки в конец конфигурационных параметров. Незабывайте добавлять обратный слэш «\» чтобы все параметры считались за одну строку. Если SSL Вам не понадобится — проигнорируйте соответствующую строку.
--with-http_ssl_module \ --add-module=$(CURDIR)/../uwsgi-0.9.7/nginx
dpkg-buildpackage cd .. sudo dpkg -i nginx*.deb echo "nginx hold" | sudo dpkg --set-selections echo "nginx-dbg hold" | sudo dpkg --set-selections mkdir -p /usr/local/nginx/uwsgi_temp
Supervisor
Управлять uWSGI процессами будем с помощью Supervisor. В Ubuntu 10.04 поставить его можно с помощью apt-get:
apt-get install supervisor
Настройки uWSGI будут передаваться параметрами коммандной строки в конфиге Supervisor’а.
Каждое отдельное отдельное приложение описывается в /etc/supervisor/conf.d/*.conf
Таким образом для запуска приложения timeline я создал timeline.conf:
[program:timeline] command=/usr/local/sbin/uwsgi -s /sites/timeline.sock --env DJANGO_SETTINGS_MODULE=timeline.settings -w "django.core.handlers.wsgi:WSGIHandler()" --pythonpath /home/timeline/www --pythonpath /home/timeline/www/timeline --home /home/timeline/www/timelineenv --processes 5 --master --harakiri 120 --max-requests 5000 --vacuum directory= /home/timeline/www/timeline environment=DJANGO_SETTINGS_MODULE='timeline.settings' user=www-data autostart=true autorestart=true stdout_logfile=/home/timeline/logs/uwsgi.log redirect_stderr=true stopsignal=QUIT
Nginx
Для каждого сайта в nginx нужно создать отдельный файл конфигурации в /etc/nginx/sites-available .
Так выглядит мой timeline файл:
server {
listen 80;
server_name my.hostname.ru;
access_log /home/timeline/logs/nginx-access.log;
error_log /home/timeline/logs/nginx-error.log;
root /home/timeline/www;
location / {
if (-f /home/timeline/www/downtime) {
return 503;
}
uwsgi_pass unix:///sites/timeline.sock;
include uwsgi_params;
}
error_page 502 503 504 @maintenance;
location @maintenance
{
root /home/timeline/www/public/maintenance;
rewrite ^(.*)$ /maintenance.html break;
}
}
Обратите внимание, что здесь заготовлена конфигурация на случай ошибок сервера — посетитель неработающего сайта получит красивое сообщение, которое лежит в maintenance.html
Запускаем!
Перезапустите Supervisor:
service supervisor restart
Это перезапустит Supervisor с новыми настройками, а также запустит uWSGI процессы. Кстати у меня не всегда эта комманда перезапускала Supervisor.
Приходилось писать
service supervisor stop service supervisor start
тогда был эффект.
Перезапустим nginx:
service nginx resrtart
Subversion
Про настройку Subversion я уже писал в материале «Установка и настройка subversion svn и web сервера apache»
Заключение
Я описал наш опыт настройки сервера. Поэтому в статье такое странное сочетание и php и python/django. Буду признателен за указание на опечатки, ошибки. И конечно буду рад, если этот материал сохранит кому-то драгоценное время!
Подписывайтесь на RSS, пишите комментарии, рекомендуйте этот блог друзьям!



Апрель 18th, 2011 at 02:57
Что то как то очень сложно все. Есть же куча готовых PPA и с Nginx и с uWSGI и с eAccelerator…
Плюс они уже настроены, есть init скрипты, для uWSGI есть аналог Nginx-овых sites-enabled…
NameVirtualHost *:8080
Listen 8080
может лучше не по всем интерфейсам слушать а только на localhost?
Апрель 19th, 2011 at 07:43
Приятно быть упомянутым
.
Предлагаю, однако, убрать из поста «Сохраняем (F2) и выходим из редактора (F10).», так как не стоит навязывать читателю конкретные редакторы текста.
В конфиге uwsgi, видимо, вторая строка не влезла, но то что осталось выглядит «по шамански». Например, DJANGO_SETTINGS_MODULE указан дважды.
На самом деле строка выглядела так:
command=/usr/local/sbin/uwsgi -s /sites/timeline.sock —env DJANGO_SETTINGS_MODULE=timeline.settings -w «django.core.handlers.wsgi:WSGIHandler()» —pythonpath /home/timeline/www —pythonpath /home/timeline/www/timeline —home /home/timeline/www/timelineenv —processes 5 —master —harakiri 120 —max-requests 5000 —vacuum
Май 4th, 2011 at 18:20
А 5 Мбит не маловато будет? Или вы только на время разработки столько взяли, а после запуска проекта планируете увеличить?
Май 6th, 2011 at 11:55
Нам 5 mbit пока хватает. загрузка не большая, пока только переносим свои сайты туда.
Разумеется когда решим запустить TaxiPult увеличим ресурсы сразу же. Ведь 512 mb памяти тоже не очень много