Я делаю на Django Энциклопедию языков программирования, о которой уже писал на Хабре. За время работы сайта выяснилось, что нужен свой выделенный сервер для большей производительности и стабильности. Пока что взял дешевый сервер с 1.8 ГГц процессором и 512 Мб памяти.
В этой статье я расскажу об установке и настройке на этом сервере Django с mod_python для Apache, с кэшированием memcached и lighttpd для статических файлов.
Итак, у нас есть свежеустановленная CentOS 5 и желание хостить сайт на Django (или несколько сайтов).
Что для этого надо установить?
Все шаги, кроме установки самого Django, — необязательные (например, можно использовать Django с fcgi вместо mod_python и PostgreSQL или другую СУБД вместо MySQL), но шаги 1-3 – то, что вы скорее всего будете использовать, а 4-5 – для повышения производительности.
Статья, в основном, CentOS-ориентированная, но в определенной степени подойдет и для других дистрибутивов Linux.
Замечание по безопасности: так как это свежеустановленная система, я не боюсь сломать что-то уже работающее, так что могу работать под правами root. Но лучше, конечно, работать под правами непривилегированного пользователя, и использовать “sudo” для команд, требующих административные привилегии.
Ну, начнем.
Собственно Django
В большинстве случаев стоит устанавливать самую свежую svn-версию Django, а не “релиз”. На сегодняшний момент, “официальный релиз” слишком устарел, и в нем отсутствует множество полезных возможностей (например, поддержка unicode и auto-escape).
Для установки вводим в командной строке
Также установка Django с svn рассмотрена в официальной документации Django.
После установки Django нужно скопировать на сервер файлы вашего проекта (через svn или просто копированием по ssh или ftp; также стоит завести в системе отдельного пользователя, который будет владельцем этих файлов) и дамп базы данных, а потом подкорректировать связанные с БД настройки в файле settings.py (подразумевается, что MySQL уже установлен и настроен, база данных и пользователь созданы, все данные на месте – эти вещи далеко за рамками этой статьи).
Теперь попробуйте запустить Django development-сервер из директории проекта
Версия MySQL-python в дистрибутиве CentOS слишком старая для запуска свежей svn-версии Django, так что нужно собирать из исходников.
MySQL-python
Для сборки MySQL-python понадобятся пакеты gcc, python-devel и mysql-devel.
Снова попробуйте запустить python manage.py runserver 127.0.0.1:8000 и проверьте, нет ли каких ошибок. Например, я использую ImageField в своем проекте, так что мне нужно было дополнительно установить Python Imaging Library (yum install python-imaging).
Если ошибок нет, стоит сменить 127.0.0.1 в команде runserver на IP-адрес вашего сервера и проверить работу сайта при помощи браузера, но для этого нужно в брандмауэре CentOS открыть порт 8000 или временно выключить брандмауэр (или можно просто временно выключить Apache и запустить Django development-сервер на 80-том порту).
Если ошибок нет, то самое время выключить Django development-сервер и настроить Apache.
mod_python
Настроить Apache с mod_python на работу с Django просто: достаточно следовать инструкциям из официальной документации Django.
Одно замечание: так как MySQL-python установлен в виде egg-пакета, важно создать временную директорию (установите на нее права 777) для кэширования .egg и указать на нее в httpd.conf
memcached
Включение кэширования memcached очень важно для увеличения производительности. К сожалению, memcached отсутствует в репозитариях CentOS, так что опять придется собирать из исходников. Этот раздел статьи частично основан на этом HOWTO.
Сначала нужно установить libevent:
Чтобы получить еще большую производительность, нужно статические файлы отдавать не при помощи Apache, а менее ресурсоемким сервером – lighhtpd.
lighttpd
Опять-таки, устанавливаем из исходников.
Также смените server.document-root на “/var/www/html/” и создайте символическую ссылку “/var/www/html/media.yourdomain.com/”, указывающую на media-директорию вашего проекта.
И в конце еще несколько советов по производительности:
В этой статье я расскажу об установке и настройке на этом сервере Django с mod_python для Apache, с кэшированием memcached и lighttpd для статических файлов.
Итак, у нас есть свежеустановленная CentOS 5 и желание хостить сайт на Django (или несколько сайтов).
Что для этого надо установить?
- Собственно Django
- MySQL-python
- mod_python
- memcached
- lighttpd
Все шаги, кроме установки самого Django, — необязательные (например, можно использовать Django с fcgi вместо mod_python и PostgreSQL или другую СУБД вместо MySQL), но шаги 1-3 – то, что вы скорее всего будете использовать, а 4-5 – для повышения производительности.
Статья, в основном, CentOS-ориентированная, но в определенной степени подойдет и для других дистрибутивов Linux.
Замечание по безопасности: так как это свежеустановленная система, я не боюсь сломать что-то уже работающее, так что могу работать под правами root. Но лучше, конечно, работать под правами непривилегированного пользователя, и использовать “sudo” для команд, требующих административные привилегии.
Ну, начнем.
Собственно Django
В большинстве случаев стоит устанавливать самую свежую svn-версию Django, а не “релиз”. На сегодняшний момент, “официальный релиз” слишком устарел, и в нем отсутствует множество полезных возможностей (например, поддержка unicode и auto-escape).
Для установки вводим в командной строке
svn co http://code.djangoproject.com/svn/django/trunk/ django-trunkНо сначала нужно установить svn
yum install subversionПосле получения всех файлов с svn нужно сделать символическую ссылку на Django в директории site-packages для Python :
ln -s `pwd`/django-trunk/django /usr/lib/python2.4/site-packages/djangoУбедитесь, что у всех родительских директорий каталога django установлены верные права (доступ на чтение для пользователя httpd, обычно chmod 755).
Также установка Django с svn рассмотрена в официальной документации Django.
После установки Django нужно скопировать на сервер файлы вашего проекта (через svn или просто копированием по ssh или ftp; также стоит завести в системе отдельного пользователя, который будет владельцем этих файлов) и дамп базы данных, а потом подкорректировать связанные с БД настройки в файле settings.py (подразумевается, что MySQL уже установлен и настроен, база данных и пользователь созданы, все данные на месте – эти вещи далеко за рамками этой статьи).
Теперь попробуйте запустить Django development-сервер из директории проекта
python manage.py runserver 127.0.0.1:8000На CentOS 5 будет сообщение об ошибке “Error loading MySQLdb module”.
Версия MySQL-python в дистрибутиве CentOS слишком старая для запуска свежей svn-версии Django, так что нужно собирать из исходников.
MySQL-python
cd /usr/local/src wget http://garr.dl.sourceforge.net/sourceforge/mysql-python/MySQL-python-1.2.2.tar.gz tar xvzf MySQL-python-1.2.2.tar.gz cd MySQL-python-1.2.2
Для сборки MySQL-python понадобятся пакеты gcc, python-devel и mysql-devel.
yum install gcc yum install python-devel yum install mysql-devel cd /usr/local/src/MySQL-python-1.2.2 python setup.py build python setup.py installГотово, MySQL-python установлен как .egg-файл в директории site-packages.
Снова попробуйте запустить python manage.py runserver 127.0.0.1:8000 и проверьте, нет ли каких ошибок. Например, я использую ImageField в своем проекте, так что мне нужно было дополнительно установить Python Imaging Library (yum install python-imaging).
Если ошибок нет, стоит сменить 127.0.0.1 в команде runserver на IP-адрес вашего сервера и проверить работу сайта при помощи браузера, но для этого нужно в брандмауэре CentOS открыть порт 8000 или временно выключить брандмауэр (или можно просто временно выключить Apache и запустить Django development-сервер на 80-том порту).
Если ошибок нет, то самое время выключить Django development-сервер и настроить Apache.
mod_python
Настроить Apache с mod_python на работу с Django просто: достаточно следовать инструкциям из официальной документации Django.
Одно замечание: так как MySQL-python установлен в виде egg-пакета, важно создать временную директорию (установите на нее права 777) для кэширования .egg и указать на нее в httpd.conf
<Location "/"> ... SetEnv PYTHON_EGG_CACHE /var/tmp/egg </Location>И не забудьте перезапустить Apache после изменения httpd.conf:
/etc/init.d/httpd restartСейчас сайт должен работать через Apache на обычном http-порту. Проверьте браузером.
memcached
Включение кэширования memcached очень важно для увеличения производительности. К сожалению, memcached отсутствует в репозитариях CentOS, так что опять придется собирать из исходников. Этот раздел статьи частично основан на этом HOWTO.
Сначала нужно установить libevent:
cd /usr/local/src wget http://monkey.org/~provos/libevent-1.4.2-rc.tar.gz tar xvzf libevent-1.4.2-rc.tar.gz cd libevent-1.4.2-rc ./configure make make install vi /etc/ld.so.conf.d/libevent.conf ## добавьте строку: /usr/local/lib/ ldconfig -vЗатем собственно memcached:
cd /usr/local/src wget http://danga.com/memcached/dist/memcached-1.2.5.tar.gz tar zxvf memcached-1.2.5.tar.gz cd memcached-1.2.5 ./configure make make install cp scripts/memcached.sysv /etc/init.d/memcached ln /usr/local/bin/memcached /usr/bin/memcached /etc/init.d/memcached start chkconfig memcached onИ наконец нужно установить libmemcache и cmemcache (python-расширение для libmemcache):
cd /usr/local/src/ wget http://people.freebsd.org/~seanc/libmemcache/libmemcache-1.4.0.rc2.tar.bz2 bunzip2 libmemcache-1.4.0.rc2.tar.bz2 tar xf libmemcache-1.4.0.rc2.tar cd libmemcache-1.4.0.rc2 ./configure make make install cd /usr/local/src/ wget http://gijsbert.org/downloads/cmemcache/cmemcache-0.91.tar.bz2 bunzip2 cmemcache-0.91.tar.bz2 tar xf cmemcache-0.91.tar cd cmemcache-0.91 python setup.py installВключите memcached-кэширование в settings.py своего проекта
CACHE_BACKEND = 'memcached://127.0.0.1:11211/'(если нужно больше информации, посмотрите в официальной документации Django) и перезапустите Apache.
Чтобы получить еще большую производительность, нужно статические файлы отдавать не при помощи Apache, а менее ресурсоемким сервером – lighhtpd.
lighttpd
Опять-таки, устанавливаем из исходников.
cd /usr/local/src wget http://www.lighttpd.net/download/lighttpd-1.4.19.tar.bz2 bunzip2 lighttpd-1.4.19.tar.bz2 tar xf lighttpd-1.4.19.tar cd lighttpd-1.4.19 yum install glib2-devel openssl-devel pcre-devel bzip2-devel gzip-devel ./configure make make install cp doc/rc.lighttpd.redhat /etc/init.d/lighttpd chkconfig lighttpd on mkdir /etc/lighttpd cp doc/lighttpd.conf /etc/lighttpd/А теперь нужно настроить Apache и lighttpd, чтобы статические файлы отдавались lighttpd (на 80 порту), а остальные запросы обслуживал Apache на 81 порту (спасибо nolancaudill.com за это решение):
- Настройте Apache на 81 порт: найдите
Listen 80 и замените на Listen 127.0.0.1:81. Также не забудьте сменить номер порта во всех VirtualHost-директивах. Перезапустите Apache.
- Отредактируйте /etc/lighttpd/lighttpd.conf. Снимите комментарии с модулей ‘mod_alias’ и ‘mod_proxy’ и добавьте строки (подкорректируйте под свои нужды):
$HTTP["host"] == "yourdomain.com" { # here we are mapping /media/ for admin media # and /static/ for the standard media_url alias.url = ( "/media/" => "/usr/lib/python2.4/site-packages/django/contrib/admin/media/", "/static/" => "/var/www/html/media.yourdomain.com/", ) $HTTP["url"] !~ "^/(static|media)/" { proxy.server = ( "" => (("host" => "127.0.0.1", "port" => 81 )) ) } }
Также смените server.document-root на “/var/www/html/” и создайте символическую ссылку “/var/www/html/media.yourdomain.com/”, указывающую на media-директорию вашего проекта.
- Cоздайте директорию для лог-файлов lighttpd:
mkdir /var/log/lighttpd/
- Еще одна маленькая правка в /etc/init.d/lighttpd: смените пусть с /usr/sbin/lighttpd на /usr/local/sbin/lighttpd. Запустите lighttpd:
/etc/init.d/lighttpd start
И в конце еще несколько советов по производительности:
- отключите все неиспользуемые сервисы
настройте параметры MySQL (например, можно воспользоваться скриптом tuning-primer.sh)
выключите KeepAlive в httpd.conf
еще советы от Jacob Kaplan-Moss (один из создателей Django)
Если интересно, в этом же духе я планирую продолжать писать в блоге My Django.