django na apache2 jako fastcgi

2007-06-12 21:46 | 0 Comments | apache django python

Odkąd pamiętam, męczę się z uruchomieniem django/ror pod fastcgi. Na apache nie mogłem tego zrobić :) - dlatego też porzuciłem ror. Kilka miesięcy temu wróciłem do django, nawet nie wiem czemu. Udało mi się napisać testową aplikację (poll z djangoproject.com). Uruchamiałem ją na wbudowanym serwerze. Śmigała. Przerzuciłem to później na apache, mod_python oczywiście. Też miałem problemy. Rozwiązując je poczułem spełnienie, że jestem w stanie to zrobić. Ciągle jednak nie mogłem uruchomić tego FastCgi. Chodziło to za mną, wiedziałem, że jeśli będę chciał - znów dam radę.

Wpierw zainstalujmy moduł mod_fastcgi do apache2 (Debian)

apt-get install libapache2-mod-fastcgi

Fastcgi zainstalowane.

Dodajemy wirtualkę obsługującą domenę

<VirtualHost *>
    ServerName ejsior.info
    ServerAlias www.ejsior.info
    DocumentRoot /home/Ace/www/ejsior_info/public_html/

</VirtualHost>

W katalogu /home/Ace/www/ejsior_info/ trzymamy aplikację, w /home/Ace/www/ejsior_info/public_html/ tylko dane widziane publicznie. Nie ma możliwości odwołania się wtedy do danych aplikacji z zewnątrz.

Plik .htaccess znajdujący się w katalogu /home/Ace/www/ejsior_info/public_html/ ustawi handler, tak aby czytał wszystkie pliki .fcgi

AddHandler fastcgi-script .fcgi
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ t.fcgi/$1 [QSA,L]

Plik t.fcgi jest plikiem wykonywanym przez interpreter python'a (wersja 2.4). Apache sam wie kiedy odpalać procesy serwera pythona i przekazuje do nich requesty - czyli działa w tym momencie jak proxy?

#!/usr/bin/python
import sys, os
# Add a custom Python path.

sys.path.insert(0, "/home/Ace/www/ejsior_info")
# Set the DJANGO_SETTINGS_MODULE environment variable.

os.environ['DJANGO_SETTINGS_MODULE'] = "settings_prod"
from django.core.servers.fastcgi import runfastcgi
runfastcgi(method="threaded", daemonize="false")

W efekcie możecie przeglądać Mojego bloga, działającego pod apache+fastcgi+django+postgresql. Na pierwszy rzut oka, strona otwiera się szybciej niż poprzednio. Wcześniej wynik

ab -n 1000 -c 10

na moją domenę wychodziło ok 5-5.5 req/s, obecnie w granicach 9-10 req/s w zależności od obciążenia sprzętu. Podczas testów zauważyłem również, iż im większe jest obciążenie tym apache odpala więcej procesów obsługujących je. W przypadku mod_python mialem praktycznie cały ram (512 ram na dedyku) zapełnione po brzegi, teraz poniżej 500 mb. Co więcej apache w niektórych przypadkach mógł obsłużyć pod mod_python nawet 7 requestów/s, dopiero po odpaleniu wszystkich procesów.

Testy najlepiej przeprowadzać odpalając 2x komendę. Przy pierwszym odpaleniu rozgrzewa się apache, przy drugim obciążenie jest faktycznie testowane w 100%.

Moje spostrzeżenia nie powinny być brane jako dowód. Dowód możne mieć tylko w przypadku przeprowadzenia gruntownych testów pod 2 tymi samymi konfiguracjami, na tym samym sprzęcie.