Django pod Nginx z wykorzystaniem mod_wsgi i mod_scgi

Opis możliwości zastosowania rozwijanych modułów SCGI i WSGI do obsługi projektów Django.

Rozwijany jest obecnie moduł WSGI dla Nginxa. Dokumentacje oraz informacje o najnowszej wersji znajdziemy na wiki Nginxa. W chwili pisania artykułu moduł kompatybilny jest z Nginxem z serii 0.5. Pod nowszymi nie kompiluje się. Instalacja moduły przebiega następująco:
  • Pobieramy najnowszą wersję (wymagany system kontroli wersji mercurial):
    hg clone http://hg.mperillo.ath.cx/nginx/mod_wsgi/
  • Musimy skompilować ponownie Nginxa dodając do cofigure dyrektywę --add-module=/ścieżka/do/mod_wsgi/, np:
    ./configure --add-module=/ścieżka/do/mod_wsgi/
  • Po skompilowaniu i zainstalowaniu nginxa wszystko jest gotowe
Poniżej fragment nginx.conf odpowiedzialnego za hostowanie projektu Django z wykorzystaniem mod_wsgi:
server { 
	listen       8000;
	server_name  localhost;
	
	wsgi_var  REQUEST_METHOD      $request_method;
	#wsgi_var  SCRIPT_NAME         $uri; # TODO
	#wsgi_var  PATH_INFO           $uri; # TODO
	wsgi_var  QUERY_STRING        $query_string;
	
	wsgi_var  CONTENT_TYPE        $content_type;
	wsgi_var  CONTENT_LENGTH      $content_length;
	
	wsgi_var  SERVER_NAME         $server_name;
	wsgi_var  SERVER_PORT         $server_port;
	
	wsgi_var  SERVER_PROTOCOL     $server_protocol;
	
	#
	# additional variables
	# (they will be present in the WSGI environment only if not empty)
	#
	wsgi_var  REQUEST_URI         $request_uri;
	wsgi_var  DOCUMENT_URI        $document_uri;
	wsgi_var  DOCUMENT_ROOT       $document_root;
	
	wsgi_var  SERVER_SOFTWARE     $nginx_version;
	
	wsgi_var  REMOTE_ADDR         $remote_addr;
	wsgi_var  REMOTE_PORT         $remote_port;
	wsgi_var  SERVER_ADDR         $server_addr;
	
	
	wsgi_var REMOTE_USER $remote_user;
	
	
	#wsgi_middleware  wsgiref.validate  validator;
	#wsgi_middleware  paste.lint;

	location  / {
		#client_body_buffer_size 50;
		wsgi_pass /ścieżka/do/wsgi.py;

		wsgi_pass_authorization off;
		wsgi_script_reloading on;
		wsgi_use_main_interpreter on;
		}
	}
Podajemy ścieżkę do pliku wsgi.py, gdzie plik wsgi.py umieszczony jest w katalogu projektu django i zawiera kod:
import os, sys
sys.path.append('/ścieżka/do/projektu_django/')

os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
Podajemy ścieżkę, uruchamiamy nginxa i powinno ładnie działać (w tym przykładzie localhost:8000)

SCGI

mod_scgi to drugi moduł tego samego autora, również w stanie rozwoju. Nie obsługuje jeszcze w pełni standardu SCGI, co powoduje pewien problem z wykorzystaniem go do hostowania projektu Django. Instalacja przebiega identycznie, natomiast konfiguracja serwera następująco:
location  / {
	## scgi_var  CONTENT_LENGTH     $content_length;
	scgi_var  QUERY_STRING       $query_string;
	scgi_var  REQUEST_METHOD     $request_method;
	scgi_var  CONTENT_TYPE       $content_type;
	
	## scgi_var  SCRIPT_NAME        $fastcgi_script_name;
	scgi_var  REQUEST_URI        $request_uri;
	scgi_var  DOCUMENT_URI       $document_uri;
	scgi_var  DOCUMENT_ROOT      $document_root;
	scgi_var  SERVER_PROTOCOL    $server_protocol;
	
	scgi_var  SCGI               1;
	scgi_var  SERVER_SOFTWARE    nginx/$nginx_version;
	
	scgi_var  REMOTE_ADDR        $remote_addr;
	scgi_var  REMOTE_PORT        $remote_port;
	scgi_var  SERVER_ADDR        $server_addr;
	scgi_var  SERVER_PORT        $server_port;
	scgi_var  SERVER_NAME        $server_name;
	scgi_pass   127.0.0.1:8080;
	scgi_var    SCRIPT_NAME  $uri;
	scgi_var    PATH_INFO    $uri;
	}
Najważniejsze jest scgi_pass 127.0.0.1:8080; - pod podanym IP/portem ma działać serwer WSGI/SCGI. W przypadku Django używamy django-scgi.py, który wykonujemy z parametrami:
python django-scgi.py --projects=/ścieżka/do/projektDjango/ --settings=settings --host=localhost --port=8080
Uruchomienie projektu Django zwróci nam stronę... lecz jako text/plain a nie text/html:
Status: 200 OK
Vary: Cookie
Content-Type: text/html; charset=utf-8
Żeby zadziałało pierwsza linijka musi wyglądać następująco:
HTTP/1.1 200 OK
Co wymaga raczej grzebania w kodzie flupa.
blog comments powered by Disqus

Kategorie

Strony