среда, 21 мая 2014 г.

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

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


В этом посте опишу последовательность шагов для установки связки apache2,mod_wsgi 3.2django 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).

Комментариев нет:

Отправить комментарий