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