time

Настраиваем связку apache2, mod_wsgi, django под ubuntu, centos

django_apache.png В этом посте опишу последовательность шагов для установки связки apache2, mod_wsgi 3.2, django 1.1 под ubuntu 9.10 и centos 5.4.

Под ubuntu 9.10

Ставим apache2

Устанавливаем apache2 и сопутствующие модули:

sudo apt-get install apache2 apache2.2-common apache2-mpm-prefork apache2-utils libexpat1 ssl-cert build-essential

Ставим mod_wsgi

Подготовки перед сборкой mod_wsgi 3.2 для apache2.

cd ~/sources
wget http://modwsgi.googlecode.com/files/mod_wsgi-3.2.tar.gz
tar xvfz mod_wsgi-3.2.tar.gz
cd mod_wsgi-3.2/

Что бы при сборке не ругалось на отсутствующий apxs и ошибку вида make: *** [mod_wsgi.la] Error 1 устанавливаем два дополнительных пакета:

sudo apt-get install python-dev apache2-prefork-dev

После всех подготовок собираем и ставим mod_wsgi.

./configure
make
sudo checkinstall

Говорим апачу о новом модуле и активируем его.

sudo echo "LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so" > /etc/apache2/mods-available/wsgi.load
sudo a2enmod wsgi

Ставим mysql

sudo apt-get install mysql-server python-mysqldb mysql-client

После установки должно предложить ввести root'овый пароль, если нет то вводим:

mysqladmin -u root password [PASSWORD]

Ставим расширения для python

sudo apt-get install python-setuptools
easy_install virtualenv
easy_install virtaulenvwrapper
easy_install pip

Ставим django 1.1

Скачиваем последнюю стабильную версию и распаковываем:

cd ~/sources                                                    
wget http://www.djangoproject.com/download/1.1/tarball/
tar xzf Django-1.1.tar.gz -C /opt/

Смотрим где у нас лежат все модули для python.

python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"

Делаем симлинк на распакованную ранее django в папку с модулями python.

sudo ln -s /opt/Django-1.1/django /usr/lib/python2.6/dist-packages

Делаем django-admin.py видимым отовсюду.

sudo ln -s /opt/Django-1.1/django/bin/django-admin.py /usr/bin

Проверяем установленную django.

python -c "import django; print django.VERSION;"

Должно вернуть что-то похожие.

(1, 1, 0, 'final', 0)

Создаем тестовый проект blog.local

cd /var/www/
mkdir myblog
cd myblog/
mkdir -p static logs .python-eggs
django-admin.py startproject blog

Добавляем URL myblog.local в /etc/hosts

sudo echo "127.0.0.1    myblog.local" >> /etc/hosts

В папке /etc/apache2/sites-available/ создаем файл myblog.conf с таким содержимым:


ServerName myblog.local

CustomLog /var/www/myblog/logs/access_log combined
ErrorLog /var/www/myblog/logs/error_log

Alias /media /opt/Django-1.1/django/contrib/admin/media
Alias /static /var/www/myblog/static

WSGIScriptAlias / /var/www/myblog/myblog.wsgi
WSGIDaemonProcess myblog.local processes=7 threads=1 display-name=%{GROUP}

В папке /var/www/myblog/ создаем файл myblog.wsgi:

import os, sys

sys.path.append('/var/www/myblog/blog')
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
os.environ['PYTHON_EGG_CACHE'] = '/var/www/myblog/.python-eggs'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

Активируем новый сайт и перегружаем апач:

sudo a2ensite myblog.conf
sudo apache2ctl restart

Под centos 5.4

Ставим нужные пакеты:

sudo yum install httpd-devel gdbm-devel mysql mysql-server mysql-devel mysql-client 
sudo yum install readline-devel sqlite-devel openssl-devel ncurses-devel
sudo yum install apr-devel gcc make autoconf mod_ssl crypto-utils
sudo yum install bzip2-devel zlib-devel libjpeg libpng libxslt gettext

Ставим новый python

По умолчанию с centos 5.4 идет python 2.4.3, обновим его до python 2.6.4.

cd ~/sources
wget http://www.python.org/ftp/python/2.6.4/Python-2.6.4.tgz
tar xvfz Python-2.6.4.tgz
cd Python-2.6.4/

Собираем новый python.

./configure --prefix=/opt/python2.6 --with-threads --enable-shared --with-zlib=/usr/include
make 
make install

Делаем python2.6 видимый для всех. Создаем файл /etc/ld.so.conf.d/opt-python2.6.conf и пишем в него /opt/python2.6/lib.

ln -s /opt/python2.6/lib/libpython2.6.so /usr/lib
ln -s /opt/python2.6/lib/libpython2.6.so.1.0 /usr/lib
ldconfig -v

Делаем симлинк на новую версию python.

ln -s /opt/python2.6/bin/python /usr/bin/python2.6

Ставим setuptools.

cd ~/sources
wget http://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c11-py2.6.egg
sh setuptools-0.6c11-py2.6.egg --prefix=/opt/python2.6

Ставим MySQLdb.

cd ~/sources
wget http://downloads.sourceforge.net/project/mysql-python/mysql-python-test/1.2.3c1/MySQL-python-1.2.3c1.tar.gz
tar xvfz MySQL-python-1.2.3c1.tar.gz
cd MySQL-python-1.2.3c1/
python setup.py build
python setup.py install

Проверяем MySQLdb.

python2.6 -c "import MySQLdb"

Если все ок, то ничего не должно вернуть.

Ставим mod_wsgi

Установка.

cd ~/sources
wget http://modwsgi.googlecode.com/files/mod_wsgi-3.2.tar.gz
tar xvfz mod_wsgi-3.2.tar.gz
cd mod_wsgi-3.2/
./configure --with-python=/opt/python2.6/bin/python2.6
make
make install

Что бы apache2 (или httpd под centos) увидел mod_wsgi надо добавить в httpd.conf:

LoadModule wsgi_module /usr/lib/httpd/modules/mod_wsgi.so

Ставим django 1.1

Скачиваем последнюю стабильную версию и распаковываем:

cd ~/sources                                                    
wget http://www.djangoproject.com/download/1.1/tarball/
tar xzf Django-1.1.tar.gz -C /opt/

Смотрим где у нас лежат все модули для python.

python2.6 -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"

Делаем симлинк на распакованную ранее django в папку с модулями python.

ln -s /opt/Django-1.1/django /opt/python2.6/lib/python2.6/site-packages/

Делаем django-admin.py видимим отовсюду.

ln -s /opt/Django-1.1/django/bin/django-admin.py /usr/bin

Проверяем установленную django.

python2.6 -c "import django; print django.VERSION;"

Должно вернуть что-то похожие.

(1, 1, 0, 'final', 0)

Создаем тестовый проект blog.local

cd /var/www/
mkdir myblog
cd myblog/
mkdir -p static logs .python-eggs
django-admin.py startproject blog

Добавляем URL myblog.local в /etc/hosts

echo "127.0.0.1 myblog.local" >> /etc/hosts

В папке /etc/httpd/conf.d/ создаем файл myblog.conf с таким содержимым:


ServerName myblog.local

CustomLog /var/www/myblog/logs/access_log combined
ErrorLog /var/www/myblog/logs/error_log

Alias /media /opt/Django-1.1/django/contrib/admin/media
Alias /static /var/www/myblog/static

WSGIScriptAlias / /var/www/myblog/myblog.wsgi
WSGIDaemonProcess myblog.local processes=7 threads=1 display-name=%{GROUP}

В папке /var/www/myblog/ создаем файл myblog.wsgi :

import os, sys

sys.path.append('/var/www/myblog')
os.environ['DJANGO_SETTINGS_MODULE'] = 'blog.settings'
os.environ['PYTHON_EGG_CACHE'] = '/var/www/myblog/.python-eggs'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

Перегружаем апач:

service httpd restart

После этого всего у меня ругалось на ошибку 500 Internal Server Error, а в логе писало ImportError и ругалось Persmission denied на либу _functools.so. Вылечилось отключением SELinux в Text Mode Setup Utility (команда setup).

Дополнительный материал:

blog comments powered by Disqus