1 (edytowany przez daniel 2010-12-27 23:05:02)

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.

2

Odp: OpenWRT + Lighttpd + FastCGI + Django

Próbuję właśnie nakłonić lighttpd do działania jako użytkownik www.

W tym celu do pliku /etc/passwd dodałem:

www:*:1024:1024:www:/www:/bin/false

/bin/false daje się wtedy kiedy nie chce się, żeby ktoś się mógł logować jako www, dobrze myślę?
Do pliku /etc/groups:

www:x:1024:www

Czyli do grupy www o numerze gid 1024 należy użytkownik www.
Teraz odkomentowałem następujące linijki w /etc/lighttpd/lighttpd.conf:

## change uid to <uid> (default: don't care)
server.username = "www"

## change uid to <uid> (default: don't care)
server.groupname = "www"

Uruchamiam /etc/init.d/lighttpd start i dostaję:

2010-12-28 12:09:46: (log.c.118) opening errorlog '/var/log/lighttpd/error.log' failed: Permission denied

Więc:

chown -R www:www /var/log/lighttpd/

Teraz już www ma uprawnienia do zapisywania do katalogu /var/log/lighttpd/ i po /etc/init.d/lighttpd start wszystko jest ok.

ALE następuje reboot i /var/log/lighttpd znowu należy do root, a nie www. hmm

3

Odp: OpenWRT + Lighttpd + FastCGI + Django

Bo /var/log jest w /tmp i robiony od nowa za każdym razem? Dodaj sobie chown do /etc/init.d/lighttpd przed uruchomieniem po prostu.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

4

Odp: OpenWRT + Lighttpd + FastCGI + Django

Cezary napisał/a:

Bo /var/log jest w /tmp i robiony od nowa za każdym razem? Dodaj sobie chown do /etc/init.d/lighttpd przed uruchomieniem po prostu.

Ma sens! wink

--- lighttpd.old    Tue Dec 28 12:34:47 2010
+++ lighttpd    Tue Dec 28 12:35:23 2010
@@ -5,6 +5,8 @@
 BIN=lighttpd
 DEFAULT=/etc/default/$BIN
 LOG_D=/var/log/$BIN
+USER=www
+GROUP=www
 RUN_D=/var/run
 PID_F=$RUN_D/$BIN.pid
 
@@ -12,6 +14,7 @@
     [ -f $DEFAULT ] && . $DEFAULT
     mkdir -p $LOG_D
     mkdir -p $RUN_D
+    chown -R $USER:$GROUP $LOG_D
     $BIN $OPTIONS
 }

Trzeba dodać linijki z plusami do pliku /etc/init.d/lighttpd

5

Odp: OpenWRT + Lighttpd + FastCGI + Django

Mam małe pytanko bo wlasnie zaczalem sie bawic Pythonem i jak uzywam tego easy_install zawsze  konczy to sie bledem bo nie podoba mu sie https, macie na to jakies rozwiazanie ?

Zapraszam na http://www.beneficik.co.uk ( to dla Googla smile

6

Odp: OpenWRT + Lighttpd + FastCGI + Django

Po pierwsze to Twój post nie jest na temat instalacji django, ani openwrt, więc załóż nowy temat w innym dziale, a ten tutaj najlepiej niech Cezary usunie razem z tym który teraz piszę.

Po drugie to musisz powiedzieć jaki dokładnie to problem, bo inaczej nikt może wiedzieć jak Ci pomóc oprócz wysłania do google z hasłem "python easy_install problem with https". Może to nie wina https, może to wina serwera. Jaką paczkę próbujesz zainstalować. Nic nie wiemy.

Wklej to co pokaże Ci się na linii komend po wydaniu polecenia easy_install to może coś uda się zaradzić.

7 (edytowany przez kris79 2013-09-14 20:16:09)

Odp: OpenWRT + Lighttpd + FastCGI + Django

Mysle ze jest to post jak najbardziej na  temat bo jak probowałem easy_install flub django (wspomniane w poscie) to dostawałem error o https.
  tak dla przysłych fourumowiczow ktory bede  szukac odpowiedzi to musiałem doinstalowac:
python-curl  python-openssl  pyopenssl  i zaczelo dzialac.

Zapraszam na http://www.beneficik.co.uk ( to dla Googla smile

8

Odp: OpenWRT + Lighttpd + FastCGI + Django

udało się komuś zmusić do działania lighttp z autentykacją ?
robię wszystko jak w helpie :
http://www.cyberciti.biz/tips/lighttpd- … ories.html
(poza domeną, ale i z nią próbowałem)
w logach nie widać nawet próby logowania, odpalania modułów, nic..

9

Odp: OpenWRT + Lighttpd + FastCGI + Django

uwierzytelnianiem...

w/w sposób działa - lighttpd nie ma problemów z parsowaniem konfiguracji?

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

10

Odp: OpenWRT + Lighttpd + FastCGI + Django

W jakich logach sprawdzałeś?

W configu lighttpd ustaw debug level na 1 i zobacz w pliku /var/log/lighttpd/error.log

11

Odp: OpenWRT + Lighttpd + FastCGI + Django

Czy mógłby ktoś "zaktualizować" tą instrukcję, pod najnowsze OpenWRT, myślę, że przez 4 lata się sporo zmieniło i nie chciałbym czegoś zepsuć w tym serwerze ; D

12

Odp: OpenWRT + Lighttpd + FastCGI + Django

Nie wiem czy aż tyle się zmieniło. Chyba zmiana managera pakietów nastąpiła czy coś? Router służy mi teraz za router, a do stawiania aplikacji django używam Debiana na Atomie albo Raspberry Pi. Router dobrze mi się kiedyś sprawdzał jako torrentbox, ale Django muliło na nim strasznie. Nie polecam.

Jeśli nadal chcesz to spróbuj. Jeśli coś pójdzie nie tak daj błąd jaki Ci się pokaże. Wszystko będziesz instalował na extroot, więc w razie czego wyciągniesz dysk czy pendrive i uruchomisz router bez niego. W ostateczności zrobisz reset do firstboota. Ryzyko jakieś tam jest, ale raczej nie zablokujesz tym routera na amen.

13 (edytowany przez IreuN 2014-06-05 22:50:47)

Odp: OpenWRT + Lighttpd + FastCGI + Django

No w końcu się za to zabrałem i... Dojechałem aż do momentu instalacji tego całego "pip'a" easy_install pip nie przeszedł.
http://screenshu.com/static/uploads/temporary/pw/15/rs/rb1x6j.jpg
Próbowałem też czegoś takiego:
http://scr.hu/1ect/qxug5
http://screenshu.com/static/uploads/temporary/2w/pe/pq/qvzc3m.jpg