В этом посте опишу последовательность шагов для установки связки 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).
Дополнительный материал: