Temat: OpenWRT + Lighttpd + FastCGI + Django
Będzie to poradnik jak postawić stronę stojącą na Django na routerze z OpenWRT. Nadmieniam, że nigdy żadnej strony ani serwera http nie stawiałem, więc zaprezentowany przykład może nie być najlepszym przykładem do nauki jak to się powinno robić.
Zakładam, że block-extroot jest z odpowiednio dużym dyskiem.
Krok 1.
Instalujemy paczki z opkg:
python
pysqlite
libsqlite3
lighttpd
lighttpd-mod-alias
lighttpd-mod-rewrite
lighttpd-mod-fcgi
Krok 2.
Instalujemy paczki Pythona.
Najpierw udajemy się na stronę pypi.python.org i szukamy paczki setuptools: http://pypi.python.org/pypi/setuptools.
Ściągamy wersję odpowiednią dla pythona, który nam się zainstalował przez opkg. Żeby sprawdzić jaką wpisujemy
python --version
po zalogowaniu się do routera. Najpewniej Python będzie w wersji 2.6.4. Ściągamy więc plik setuptools-0.6c11-py2.6.egg. Ale poszukajcie sami, bo może będzie coś nowszego. Jak już go ściągniemy uruchamiamy plik jak zwykły plik skryptowy basha:
sh setuptools-0.6c11-py2.6.egg
Co zainstaluje nam program easy_install. Za pomocą easy_install instalujemy pip (easy_install pip). Pip to manager pakietów Pythona. Za jego pomocą instalujemy (pip install paczka):
flup
django
Krok 3.
Pozostało jeszcze skonfigurowanie Lighttpd co okazało się najgorsze z tego wszystkiego.
Metoda: bin-path (1 z 3)
W katalogu z projektem django (tym utworzonym przez django-admin.py startproject ) trzymam plik homepage.fcgi o następującej zawartości:
#!/usr/bin/env python
import sys, os
# Add a custom Python path.
sys.path.insert(0, "/www/apps")
# Set the DJANGO_SETTINGS_MODULE environment variable.
os.environ['DJANGO_SETTINGS_MODULE'] = "homepage.settings"
from django.core.servers.fastcgi import runfastcgi
# maxspare=2 is minimum from what i saw
runfastcgi(method="threaded", daemonize="false", maxspare=2)
Plik konfiguracyjny /etc/lighttpd/lighttpd.conf:
# lighttpd configuration file
#
## modules to load
# all other module should only be loaded if really neccesary
# - saves some time
# - saves memory
server.modules = (
"mod_rewrite",
# "mod_redirect",
"mod_alias",
# "mod_auth",
# "mod_status",
# "mod_setenv",
"mod_fastcgi",
# "mod_proxy",
# "mod_simple_vhost",
# "mod_cgi",
# "mod_ssi",
# "mod_usertrack",
# "mod_expire",
# "mod_webdav"
)
# force use of the "write" backend (closes: #2401)
server.network-backend = "write"
## a static document-root, for virtual-hosting take look at the
## server.virtual-* options
server.document-root = "/www/public"
## where to send error-messages to
server.errorlog = "/var/log/lighttpd/error.log"
## files to check for if .../ is requested
index-file.names = ( "index.html", "default.html", "index.htm", "default.htm" )
## mimetype mapping
mimetype.assign = (
".pdf" => "application/pdf",
".class" => "application/octet-stream",
".pac" => "application/x-ns-proxy-autoconfig",
".swf" => "application/x-shockwave-flash",
".wav" => "audio/x-wav",
".gif" => "image/gif",
".jpg" => "image/jpeg",
".jpeg" => "image/jpeg",
".png" => "image/png",
".css" => "text/css",
".html" => "text/html",
".htm" => "text/html",
".js" => "text/javascript",
".txt" => "text/plain",
".dtd" => "text/xml",
".xml" => "text/xml"
)
$HTTP["url"] =~ "\.pdf$" {
server.range-requests = "disable"
}
##
# which extensions should not be handle via static-file transfer
#
# .php, .pl, .fcgi are most often handled by mod_fastcgi or mod_cgi
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
## to help the rc.scripts
server.pid-file = "/var/run/lighttpd.pid"
#### fastcgi module
## read fastcgi.txt for more info
# this line may help with finding what's wrong, check out errorlog file
# fastcgi.debug=1
fastcgi.server = (
"/homepage.fcgi" => (
"main" => (
"host" => "127.0.0.1",
"port" => 3033,
"check-local" => "disable",
"max-procs" => 1,
"bin-path" => "/www/apps/homepage/homepage.fcgi"
)
)
)
alias.url = (
"/media" => "/www/apps/homepage/media",
)
url.rewrite-once = (
"^(/media.*)$" => "$1",
"^/favicon\.ico$" => "/media/favicon.ico",
"^(/.*)$" => "/homepage.fcgi$1",
)
Jak zauważyliście nazwę tej metodzie nadałem z powodu linijki bin-path w opcji fastcgi.server. Wskazuje ona ścieżkę do wykonywalnego pliku fcgi, który odpala wątki fastcgi z którymi komunikuje się serwer lighttpd kiedy potrzebuje wygenerować jakąś dynamiczną stronę django.
Są jeszcze dwie metody, ale moim zdaniem ta jest najwygodniejsza, bo pozwala obsługiwać serwer za pomocą /etc/init.d/lighttpd start/stop/enable/disable. Wtedy on sam uruchamia sobie wątki, a nie trzeba tego pilnować i robić ręcznie.
Rzeczy, które można by zmienić:
nie uruchamiać serwera jako root
nie przenosić document root, czyli miejsca z którego serwowane są plik html, tylko trzymać aplikację gdzieś poza /www
może użyć virtualenv, bo podobno to takie fajne
Koniec
Trochę chaotycznie, bo z pamięci, ale myślę, że niczego nie pomieszałem. Chętnie usłyszę głosy konstruktywnej krytyki.