[Web-SIG] Starting Web Servers using socket FDs
Roberto De Ioris
roberto at unbit.it
Tue Jun 5 11:46:36 CEST 2012
Il giorno 05/giu/2012, alle ore 11:30, Tarek Ziadé ha scritto:
> Hey
>
> I am doing this experimentation where the WGSI server is not started with an host/port or a unix socket, but rather a FD value,
> corresponding to a socket already bound by the parent process.
>
> The server would then just accept new connection on the FD, using socket.fromfd() to get a socket object back,
> and forget about all the binding work.
>
> Here's a prototype based on wsgiref : https://github.com/tarekziade/chaussette
>
> The goal I have is to be able to just spawn web workers using subprocess and take care myself of the process
> management part. I wrote a blog post on my motivations here : http://blog.ziade.org/2012/06/12/shared-sockets-in-circus
> if you want more background.
>
> Anyways, the idea I wanted to bring here was the following:
>
> most web servers out there support regular host/port or Unix Socket, which are usually the "unix:" prefix followed by a path on the system.
>
> What if web servers had these two standards *and* a new one which would be a "fd:" prefix.
>
> For instance, we would start server foo with:
>
> $ foo --fd:12:localhost:8080
>
> Where 12 is the fd number the foo server would use for getting the socket, and "localhost:8080" would just be there
> as an information to be able to fill some WGSI headers that requires it.
>
> From there I could just spawn "foo" and pass to it socket.fileno()
>
> Thoughts ?
>
This is the approach used by fastcgi (even if only on file descriptor 0), old inetd-style daemons, and newer upstart and systemd daemons.
Gunicorn can already bind (or better, accept) from file descriptors specifying an environment variable. uWSGI supports by-default the inheritance of file descriptor 0 for fcgi-like startup,
and working on generic file descriptor or inet/upstart/systemd socket activation.
The vast majority of modern systems expects the file descriptor number on an environment variable:
upstart: UPSTART_FDS
systemd: LISTEN_FDS
Circus, could follow the same behaviour, but i do not know if a standard will be required for that.
Regarding the --fd:12:localhost:8080 syntax, is redundant as you can get the name of the socket mapped to a file descriptor
with getsockname:
http://linux.die.net/man/2/getsockname
--
Roberto De Ioris
http://unbit.it
JID: roberto at jabber.unbit.it
More information about the Web-SIG
mailing list