Wandering Thoughts archives

2010-02-15

IPv6 with Lighttpd on Linux

The situation with lighttpd is sufficiently complicated that I can't call it a brief note, so here's what I've worked out. This is not necessarily valid for all distributions, since I'm working on Fedora 11.

Lighttpd is fully IPv6 enabled, but normally only binds its listening socket to the IPv4 address. Some distributions override this by setting the server.use-ipv6 configuration option if IPv6 is enabled on the machine.

Now, server.use-ipv6 is somewhat underdocumented; the lighttpd documentation says only 'bind to the IPv6 socket'. What it actually does at the moment is make lighttpd always create IPv6 sockets, regardless of what the socket is supposed to be bound to. (I am not sure how well this works if you are binding to specific IPv4 addresses, even on a dual binding machine with bindv6only turned off.)

Since lighttpd fully supports IPv6, you do not need to turn server.use-ipv6 on in order to bind to an IPv6 socket; instead, you simply tell lighttpd to do so by giving it an IPv6 address as server.bind or whatever. So if you have turned bindv6only on to turn off dual-binding and thus need to bind separately to both the IPv4 and the IPv6 sockets, you just need to tell lighttpd to do this by adding the following configuration bit:

$SERVER["socket"] == "[::]:80" { }

(As the lighttpd documentation dryly notes, 'note that it's perfectly valid to leave the body of the [$SERVER] conditional empty'. Lighttpd configuration is sometimes full of these magic side effects.)

This is sadly a lot more complicated than the Apache way, which can be described as 'it all just works, you don't have to worry about it' (cf the brief note).

linux/LighttpdIpv6 written at 01:23:17; Add Comment


Page tools: See As Normal.
Search:
Login: Password:
Atom Syndication: Recent Pages, Recent Comments.

This dinky wiki is brought to you by the Insane Hackers Guild, Python sub-branch.