pagenoare's devblog

python ftw!

web2py na lighttpd (fcgi)

| written by pagenoare, on Mar 20, 2009 1:44:48 PM.

Gdy napisałem pierwsze aplikację w web2py, postanowiłem jedną postawić widoczną w sieci – użyłem jak zawsze lighttpd, stawiając po fcgi. Początkowe rozwiązanie było bardzo złe, więc wczoraj postanowiłem wymyślić nowy sposób.

Początkowy sposób:

screen -S web2py python fcgihandler.fcgi
chmod 777 web2py.sock
sudo /etc/init.d/lighttpd restart

Prawda, że takie… nijakie? Na szczęście pozbyłem się tego i teraz wystarczy zrestartować httpd, aby odpalić nową aplikację (zakładając, że odpalamy pod inną instancją web2py, jeśli pod tą samą to nawet nie trzeba restartować). Napiszę zaraz swoją konfigurację, bo pewnie niedługo zapomnę jak to zrobić, a przy okazji może ktoś skorzysta.

Konfiguracja lighttpd:

$HTTP["host"] =~ "^adres.domena$" {

fastcgi.server    = (
    "/" => (
              (
                "bin-path"        => "/sciezka/do/fcgihandler.fcgi",
                "socket"          => "/tmp/web2py.sock",
                "check-local"     => "disable",
                "disable-time"    => 1,
                "min-procs"       => 1,
                "max-procs"       => 1,
                "bin-environment" => (
                    "web2py_path" => "/sciezka/do/web2py",
                )
              ),
           ),
)

url.rewrite-once = (
    "^(/.*)$" => "/web2py$1",
)

}

fcgihandler.fcgi (prawa +x):

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import os

import gluon.main
import gluon.contrib.gateways.fcgi as fcgi
from gluon.contrib.wsgihooks import ExecuteOnCompletion2, callback

# Append the file path in python path
os.environ['web2py_path'] = path = os.environ.get('web2py_path') or os.path.dirname(os.path.abspath(__file__))
if not path in sys.path:
    sys.path.append(path)

# Choose one of the ways below to define the application
application = ExecuteOnCompletion2(gluon.main.wsgibase, callback)

# application=gluon.main.wsgibase
# # or
# application=gluon.main.wsgibase_with_logging

fcgi.WSGIServer(application).run()

To by było na tyle, mam nadzieję, że kod jest na tyle czytelny, że nie trzeba tłumaczyć zasady działania.

Comments

  • Próbuję postawić serwer lighttpd tak jak to opisałeś. Jednak nie daje rady. wpisuje: $HTTP["host"] =~ "^moje_ip:port$" { po uruchomieniu przeglądarka nie może uzyskać połączenia z serwerem. Nie mam pojęcia co jest źle

    Comment by Robert — Apr 28, 2009 12:05:47 AM | # - re

  • Robert: http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs:Configuration#Conditional-Configuration $HTTP["host"] jest do domeny, nie ip. Aby zrobić tak jak mówisz należy użyć $SERVER["socket"].
    match on socket. Value must be on the format "ip:port", where ip is an IP address(optional) and port a port number. Only equal match (==) is supported. It also binds the daemon to this socket. Use this if you want to do IP/port-based virtual hosts.
    Podsumowując, użyj:
    $SERVER["socket"] == "ip:port" {
    Zamiast:
    $HTTP["host"] =~ "^moje_ip:port$" {
    Pozdrawiam.

    Comment by pagenoare — Apr 28, 2009 8:22:02 AM | # - re

Leave a Reply