Wednesday, August 10, 2011

Django+nginx

  Всем привет. Сегодня будем ставить высоконагруженный веб-сервер на слабенькое железо. Итак начнем. Что нам нужно будет для работы.


Предварительная работа над системой.
1. Я ставлю на Ubuntu Server 11.04 (вы можете легко адаптировать под свою ОС)
2. Пользователь с нужными правами. Мой пользователь - kir
3. Ему необходимо передать рутовые права приблизительно вот так:
  • заходим в файл /etc/sudoers
  • выставляем такие права kir ALL=(ALL) ALL
4. Устанавливаем django. Описано тут
5. Устанавливаем nginx
#sudo apt-get install nginx
6. Устанавливаем дополнительные библиотеки для python
#sudo apt-get install build-essential python-dev python-setuptools
7. Наконец устанавливаем daemotools
#sudo apt-get install daemontools
8. Создадим папку /etc/service выполнив следующую команду
#sudo mkdir /etc/service

Теперь переходим к настройке daemontools.
1. Создаем настроечный файл для daemontools с названием /etc/init/svscanboot со следующим содержимым
start on runlevel 2
start on runlevel 3
start on runlevel 4
start on runlevel 5
stop on runlevel 0
stop on runlevel 1
stop on runlevel 6
respawn
exec /usr/bin/svscanboot
2. Запустим daemontools
#sudo initctl start svscanboot

Настройка виртуальной среды для Python
1. Мы будем использовать virtualenv для создания изолированной среды для нашего приложения
#sudo easy_install virtualenv
2. Теперь настроим новую виртуальную среду
#mkdir ~/virtualenvs
#virtualenv ~/virtualenvs/mysite
3. Начнем использовать нашу виртуальную среду и установим pip для удобства инсталляции питоновских пакетов
#source ~/virtualenvs/mysite/bin/activate
#easy_install pip
4. Установим flup. Это требования Django для того, чтобы была возможность запускать fcgi через команду runfcg
#pip install flup
5. Для того, чтобы спользовать адаптеры базы данных, графические библиотеки или xml парсеры, инсталлированные по системному пути Питона, мы должны убедиться, что они доступны из нашей виртуальной среды. Для этого мы добавляем .pth файл в директорию виртуальной среды site-packages
#echo "/usr/lib/python2.7/dist-packages/" > ~/virtualenvs/mysite/lib/python2.7/site-packages/fix.pth
6. Теперь любым удобным способом перетащите свой проект Django в директорию ~/virtualenvs/mysite
7. Доставим несколько библиотек для дальнейшей оптимизации
#pip install simplejson python-memcached

Связываем Daemontools c FastCGI
1. Daemontools будет смотреть во ве поддиректории /etc/service и в каждой из них он будет искать исполняемый файл run. Итак, создаем mysite-директорию
#sudo mkdir /etc/service/mysite
2. Теперь делаем скрипт /etc/service/mysite/run, который будет запускать fastcgi-сервер
#!/usr/bin/env bash
source /home/kir/virtualenvs/mysite/bin/activate
cd /home/kir/mysite
exec envuidgid kir python manage.py runfcgi method=threaded host=127.0.0.1 port=8080 pidfile=mysite.pid minspare=4 maxspare=30 daemonize=false
3. Сделаем созданный скрипт исполняемым
#sudo chmod +x /etc/service/mysite/run

Настраиваем nginx для работы с нашим сервером
1. Для начала изменим файл /etc/nginx/fastcgi_params на такое содержание
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
2. Теперь создадим настройку под наш хост /etc/nginx/sites-available/mysite
server {
    listen 80;
    server_name mysite;
    access_log /var/log/nginx/mysite.access.log;
    location /media {
        autoindex on;
        index index.html;
        root /home/mysite/mysite;
        break;    }
   
    location / {
        include /etc/nginx/fastcgi_params;
        fastcgi_pass 127.0.0.1:8080;
        break;
    }
}
3. Теперь подключим его через symlink
#sudo ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/mysite
4. Теперь перезапустим сайт, чтобы все настройки вступили в силу
#sudo /etc/init.d/nginx restart

Радуемся результату. Удачи!

No comments: