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.
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ć.
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.
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.
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)
- Dodane: 14.07.2008 przez riklaunim