Biblioteka Pythona

mod_wsgi

Hosting aplikacji napisanych za pomocą Pythonowych frameworków ww obsługujących standard WSGI z wykorzystaniem serwera Apache i modułu mod_wsgi

mod_wsgi to rozwijany obecnie moduł dla serwera Apache umożliwiający serwowanie zgodnych ze specyfikacją WSGI aplikacji www napisanych w Pythonie. Moduł napisany jest w C, a jego celem jest wydajniejsza obsługa wspomnianych aplikacji niż obecnie używane mod_python i CGI. Moduł można skompilować względem Apache 1.3, 2.0 i 2.2. Pod systemami Uniksowymi można stosować jednowątkowy MPM "prefork" lub wielowątkowy "worker". W odróżnieniu od mod_python moduł wsgi daje domyślnie każdej aplikacji oddzielny sub-interpreter pythona, co zapobiega interferencji między aplikacjami. Posiada też opcję przeładowywania interpreterów zamiast restartowania całego serwera. Mimo iż nie ma jeszcze oficjalnego wydania mod_wsgi można pobrać kod z repozytorium SVN, a na stronie projektu znajdziemy dokumentację dla różnych frameworków i aplikacji www napisanych w Pythonie.

Instalacja Linux/Unix

Pobieramy kod źródłowy z repozytorium:
svn checkout http://modwsgi.googlecode.com/svn/trunk/ modwsgi
Kompilujemy i instalujemy:
./configure
make
make install
Gotowe. Moduł można już wykorzystać.

Test mod_wsgi

Utwórz plik hello.py o kodzie:
def application(environ, start_response):
    status = '200 OK'
    output = 'Hello World!'

    response_headers = [('Content-type', 'text/plain'),
                        ('Content-Length', str(len(output)))]
    start_response(status, response_headers)

    return [output]
W konfiguracji apache ustaw:
LoadModule wsgi_module               modules/mod_wsgi.so
WSGIScriptAlias / /ścieżka/do/hello.py
Teraz po uruchomieniu serwera pod adresem http://localhost/ powinieneś zobaczyć "Hello World!", co oznacza iż moduł działa poprawnie.

Przykładowa konfiguracja dla Django

Oto fragment konfiguracji serwera Apache dla aplikacji Django (w tym przypadku mojej Biblioteki)
Alias /site_media/ "/home/piotr/svn/biblioteka/site_media/"
LoadModule wsgi_module               modules/mod_wsgi.so


<Directory /home/piotr/svn/biblioteka/site_media>
Order deny,allow
Allow from all
</Directory>

WSGIScriptAlias / /home/piotr/svn/biblioteka/mysite.wsgi

<Directory /home/piotr/svn/biblioteka>
Order deny,allow
Allow from all
</Directory>
mysite.wsgi:
import os, sys
sys.path.append('/home/piotr/svn/biblioteka/')
# moja applikacja wymaga dodania dodatkowych katalogow do pythonpath
sys.path.append('/home/piotr/svn/biblioteka/diamandas/')
sys.path.append('/home/piotr/svn/biblioteka/diamandas/cbcplugins/cbcplugins/')
sys.path.append('/home/piotr/svn/')
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

import django.core.handlers.wsgi

application = django.core.handlers.wsgi.WSGIHandler()
Gdzie /home/piotr/svn/biblioteka/ to ścieżka do projektu django.

Wydajność

Przeprowadziłem prosty test wydajności za pomocą Siege dla Apache 2.0.59, Python 2.4.4 i mod_python 3.3.1 pod Gentoo amd64 wykorzystując kod mojej Biblioteki (Django) do porównania wydajności. Poniższe wykresu przedstawiają graficznie otrzymane wyniki. Mod_wsgi wypada nieco lepiej od mod_pythona już w obecnym stanie rozwoju. Szybkość odpowiedzi wyniosła odpowiednio dla mod_python i mod_wsgi 16,79 i 18,63 transakcji na sekundę (po trzy testy Siege, odchylenia standardowe: 1,89 i 0,4). Przepustowość odpowiednio 0,11 i 0,12 MB na sekundę (odchylenia standardowe: 0,02 i 0) a średni czas odpowiedzi: 0,37 i 0,3 sekundy (odchylenia: 0,07 i 0,03)
wsgi_pl_1.png
wsgi_pl_2.png
wsgi_pl_3.png