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.