Настройка сервера для php и django сайтов: nginx, apache2, mysql,uWSGI

Предыстория: выбор Django/Python хостинга

Примерно два года я пользовался услугами WebFaction и был доволен. Там есть и возможность устанавливать/собирать свои приложения и БД не занимает память, положенную мне по тарифному плану как на виртуальных серверах. А еще мне не нужно было настраивать почту и DNS и всем этим можно было управляться через удобную панель. Словом — это классный хостинг, если нет больших нагрузок, нужно много места под файлы, трафик(он ограничен, но его более чем достаточно),  и нет никакого желания заниматься настройкой сервера. А еще там хорошие цены на хостинг. И support: очень оперативно, по делу, вежливо и на английском. Последнее для кого-то может стать проблемой.

Добавление Email через панель WebFaction

Добавление Email через панель WebFaction

Но со временем я всё таки понял: сервера в Техасе, пинг за 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 мб.

Панель Scalaxy: Создание сервера

Не правильная настройка слотов

 

Собственно настройка

Дабы ничего не забыть — я специально создам новый сервер с указанной выше конфигурацией.

Сразу после загрузки созданного сервера, возможно подключится к нему по 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, пишите комментарии, рекомендуйте этот блог друзьям!

 

 

 

 

 

 

4 Responses to “Настройка сервера для php и django сайтов: nginx, apache2, mysql,uWSGI”

  1. Сергей Says:

    Что то как то очень сложно все. Есть же куча готовых PPA и с Nginx и с uWSGI и с eAccelerator…

    Плюс они уже настроены, есть init скрипты, для uWSGI есть аналог Nginx-овых sites-enabled…

    NameVirtualHost *:8080
    Listen 8080

    может лучше не по всем интерфейсам слушать а только на localhost?

  2. Иван Маркеев Says:

    Приятно быть упомянутым :) .
    Предлагаю, однако, убрать из поста «Сохраняем (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

  3. Александр Says:

    А 5 Мбит не маловато будет? Или вы только на время разработки столько взяли, а после запуска проекта планируете увеличить?

  4. Konstantin Says:

    Нам 5 mbit пока хватает. загрузка не большая, пока только переносим свои сайты туда.
    Разумеется когда решим запустить TaxiPult увеличим ресурсы сразу же. Ведь 512 mb памяти тоже не очень много :)

Leave a Reply