[Ur] socket detaching
Adam Chlipala
adamc at csail.mit.edu
Fri Aug 1 14:32:36 EDT 2014
Thanks for the interesting idea. I have to admit, I'm perplexed as to
why you didn't just use a traditional web server to serve such files.
I think I'll take this opportunity to solicit community input on this
general issue, which has bothered me for a while. People seem to be
assuming that it is axiomatically impossible or clearly undesirable that
an Ur/Web application must always be running in the context of a web
server like Apache. Why is that? Unsurprisingly, in such a setting, it
is quite trivial to do anything that web servers usually do. As far as
I understand, almost all real-world web applications run in the context
of Apache or similar servers, or at least they did 5 years ago.
There are at least three easy modes for running Ur/Web applications with
Apache, lighttpd, etc.:
1) FastCGI process started and stopped automatically by the web server.
I recommend this mode for production deployments.
2) Main web server proxies appropriate HTTP requests to the
application. I recommend this mode for development.
3) CGI program invoked by main web server. This is a pretty retro
option that is rarely appropriate today.
The Ur/Web manual contains example configuration for some of these
strategies, and I could add more, if I've been mistakenly assuming that
some small piece of Apache knowledge is widely enough known that it's
not a big deal for any Ur/Web user to apply it in setting up a
development/production environment.
On 08/01/2014 03:47 AM, Sergey Mironov wrote:
> Hi, Adam. Since you have published your file-serving extension, I'd
> like to share my old code for solving similar task.
>
> The idea is to be able to pickpocket the client-connection socket from
> the urweb and pass it to some standalone application which would use
> it to serve large file. I am using it to send firmware tarballs
> (approx 20-50 Mb in size) to the clients.
>
> Here is how it works in more details:
> 1. The Ur/Web server sets the 'sock' field of the uw_context (see the patch)
> 2. The program calls the detachSocket function which extracts this
> field and prevents Ur/Web from writing anything to this socket.
> 3. The client program starts new process (via my urweb-callback FFI
> library) and passes the socket to it via command line (UNIX layer
> makes sure that child processes inherit opened handles correctly)
> 4. The child process does it job to sending it's content to client
>
> That's it. I'm not asking you to include this modification into the
> Ur/Web, just want to share the approach.
>
> Regards,
> Sergey
>
> Demo - https://github.com/grwlf/urweb-detach
> Patch - https://github.com/grwlf/urweb-detach/blob/master/1_of_1_Introduce__Detach__mechanism_.patch
> (and in attachment)
More information about the Ur
mailing list