Archives / Search ›

Configuring Trac with FastCGI and lighttpd

I initially tried getting tracd to work, but couldn’t get it to generate URLs that made sense. So, I decided to investigate all the fuss about using lighttpd and FastCGI. It works, better than tracd likely, and is certainly more flexible.

Here’s my lighttpd.conf for It essentially implements the “Global authentication” example from the TracMultipleProjects page on the Trac wiki. You need a trunk version of Trac for this to work; 0.8.x don’t have FastCGI support.

server.port         = 9013
server.document-root= "/home/nriley/web/public/"
server.indexfiles   = ( "index.html" )     = "/home/nriley/var/run/"
server.errorlog     = "/home/nriley/logs/lighttpd.error.log"
accesslog.filename  = "/home/nriley/logs/lighttpd.access.log"
url.access-deny     = ( "~", ".inc" )
compress.cache-dir  = "/home/nriley/var/cache/lighttpd/compress/"
compress.filetype   = ( "text/plain", "text/html" )
fastcgi.server      = ( "/trac" =>
                       ( "trac" =>
                        ( "socket" => "/home/nriley/var/run/trac-fastcgi.sock",
                          "bin-path" => "/home/nriley/cgi-bin/trac.fcgi",
                          "bin-environment" =>
                           ( "TRAC_ENV_PARENT_DIR" => "/home/nriley/trac" )
alias.url           = ( "/media/" => "/home/nriley/share/trac/htdocs/" )
auth.backend        = "htdigest"
auth.backend.htdigest.userfile= "/home/nriley/etc/trac.digest.passwd"
$HTTP["url"] =~ "^/trac/[^/]+/login" {
    auth.require    = ( "/" =>
                       ( "method" => "digest",
                         "realm" => " Subversion repository",
                         "require" => "user=nicholas"

In order for the above FastCGI association to work, I must create a file named trac in the server’s document root, so lighttpd has something to pass along to the FastCGI script. (I got this tidbit from this article on using Django with lighttpd).

I needed to use /media instead of /trac or something like /trac-common or /trac/common because I couldn’t get lighttpd to give up the FastCGI assocation with /trac.

It appears there’s nothing equivalent to “Require valid-user” in lighttpd, and the “require” statement isn’t parsed until a request is received, so you’ll need to add a bunch of users to a group and require a group, likely. The parsing error is very poorly identified, too: (http_auth.c.345) = is missing. I had to dig through the lighttpd source to see what it was referring to.

So, everything seemingly works; the only problem I’m having is my log file getting polluted with these messages:

2005-08-01 03:08:38: (mod_fastcgi.c.2110) FastCGI-stderr:  

which I’ve filed as a bug in Trac.

I also had to do some digging to figure out how to enable anonymous access to Subversion via WebDAV. The Subversion repository’s DAV interface was created as private to begin with, a sensible precaution. However, I couldn’t use <LimitExcept> to apply permissions, so instead I have a AuthzSVNAccessFile svn-access.conf that looks like this:

nicholas = rw
* = r

Then I open up Apache access with Satisfy Any. Some more discussion of this technique is here. → is now ( still works, too). I have by necessity removed some of the gimmicks such as the XML repository browser and ViewCVS, since my new web host doesn’t support the former, and Trac is much better than the latter. However, it’s no longer run from my desktop Mac and cable modem, and Trac is now using FastCGI/lighttpd instead of plain CGI/Apache, so the response time and throughput should be significantly improved.

For anyone who’s using one of the Subversion repositories, you will need to run svn switch on your working copies, as follows:

% svn switch --relocate

Unfortunately, Subversion does not understand HTTP redirection, and even the awesome power of mod_rewrite is not enough to save me. RewriteRule ^repos/(.+) /svn/$1 [R] gives me svn: PROPFIND of '/repos/dev/trunk/StreamVision': 301 Moved Permanently (, making the redirection a permanent one doesn’t help, and simply rewriting gives me:

% svn up
svn: REPORT request failed on '/svn/dev/!svn/vcc/default'
Unusable URI: it does not refer to this repository

If you’re just using a Web browser to browse the repository, then you will be correctly redirected.

I’ve got some Apache/Trac/lighttpd configuration advice to share, but first I need to eat dinner…

Feeds fixed

WP-Cache 2.0, which caches the output of WordPress pages, broke the MIME types of my feeds, setting them to text/html; it’s still enabled for the non-XML pages I’m serving. This appears to be actually an Apache or PHP bug, but the workaround stands. And yes, I know this page doesn’t validate as XHTML at the moment; it will. I’ve temporarily changed the GUID/permalink format to include numbers, since otherwise there were many duplicate GUIDs for the ex-Radio entries that had no post titles.

Unlike it did last night, NetNewsWire appears to now correctly process the RSS 2.0 and Atom feeds. It may be because the Radio posts aged off the feed since I added the PyCS feeds in; regardless, I’m happy, and this is now my official weblog.

Hello Radio

This blog now includes posts from my Radio period, January 2002 through November 2003. I meant to migrate them to PyCS, but the barrier to entry was always a little too high. Not so with WordPress. Some links are broken, and I need to move the stories, but it’s a start at consolidation.

Sample post

Python [Show Plain Code]:

(the above brought to you courtesy of Syntax Highlighting with Enscript in WordPress Jay Tuley’s SyntHihol plugin).

Older Posts ›