web2py na lighttpd (fcgi)
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.
Comment by Robert — Apr 28, 2009 12:05:47 AM | # - re
$SERVER["socket"] == "ip:port" {Zamiast:$HTTP["host"] =~ "^moje_ip:port$" {Pozdrawiam.Comment by pagenoare — Apr 28, 2009 8:22:02 AM | # - re