Problem installing Trac under Lighttpd+FastCGI
Posted on
I just finished configuring a Trac instance for IMAPClient. To keep page response times tolerable I'm using FastCGI.
It turns out there's a little gotcha when you serve an app at the root (ie. "/") using FastCGI with Lighttpd. It passes the wrong SCRIPT_NAME and PATH_INFO to the app causing unexpected behaviour. The problem isn't there if the app is served from a prefix (eg. "/trac").
The problem is apparently fixed somewhere in Lighttpd 1.5 but I'm on 1.4.13 as shipped with Debian.
With Trac there is a workaround. If you modify Trac's FastCGI runner (fcgi_frontend.py) to correct the SCRIPT_NAME and PATH_INFO environment variables before the rest of the app sees them, the problem is solved. Here's what my fcgi_frontend.py now looks like (header comments removed):
import pkg_resources
from trac import __version__ as VERSION
from trac.web.main import dispatch_request
from os import environ
import _fcgi
def application(environ, start_request):
environ['PATH_INFO'] = environ['SCRIPT_NAME'] + environ['PATH_INFO']
environ['SCRIPT_NAME'] = ''
return dispatch_request(environ, start_request)
def run():
_fcgi.WSGIServer(application).run()
if __name__ == '__main__':
pkg_resources.require('Trac==%s' % VERSION)
run()
Figuring this out cost me lots of time. Hopefully this information helps someone else out.
Relevant links: