Video Streaming using non http backend, Ref ngx_drizzle

agentzh agentzh at
Mon Jun 4 14:13:14 UTC 2012


On Mon, Jun 4, 2012 at 10:01 AM, Sammy Raul <sammyraul1 at> wrote:
> I am trying to stream video it can be mp4, flv anything using nginx.
> The video streams in the form of 1024 size will be available from the
> backend non-http server.

I think this can be done trivially via ngx_lua module while still
achieving good performance. Here is a small example that demonstrates
how to meet your requirements with a little Lua:

    location /api {
        content_by_lua '
            local sock, err = ngx.socket.tcp()
            if not sock then
                ngx.log(ngx.ERR, "failed to get socket: ", err)

            sock:settimeout(1000)  -- 1 sec

            local ok, err = sock:connect("", 12345)
            if not ok then
                ngx.log(ngx.ERR, "failed to connect to upstream: ", err)

            local bytes, err = sock:send("some query")
            if not bytes then
                ngx.log(ngx.ERR, "failed to send query: ", err)

            while true do
                local data, err, partial = sock:receive(1024)
                if not data then
                    if err == "closed" then
                        if partial then
                        ngx.log(ngx.ERR, "error reading data: ", err)

See the documentation for details:

> For achieveing this I followed the ngx_http_drizzle source.
> I wrote an upstream handler and followed most of the source code from
> ngx_http_drizzle.

As the author of ngx_drizzle, I suggest you start from trying out
ngx_lua. Customizing ngx_drizzle for your needs requires a *lot* of
work. The C approach should only be attempted when Lua is indeed too
slow for your purpose, which is not very likely for many applications

Also, please note that ngx_drizzle does not support strict
non-buffered data output. So, for downstream connections that are slow
to write, data will still accumulate in RAM without control. On the
other hand, the ngx_lua sample given above does not suffer from this

> I have few questions or to be more precise I did not understood how the
> output from drizzle is being streamed to the client.
> 1) In ngx_http_drizzle_output.c the function ngx_http_drizzle_submit_mem is
> the place where it is setting the output filter, Is it also sending the
> response i.e the stream to the client at this point, or it is some other
> function?

Nope. Sending output buffers to the output filter chain is done by the
ngx_http_drizzle_output_bufs function.

> 2) What I need to do to send my video contents to the client, I followed the
> drizzle example but setting output and sending stream to the client, how I
> can achieve this. I have 1024B avaialble at one point and I want to send
> this to the client till the backend server has no stream to send and the
> client should be able to play the content.

Basically, you can call the ngx_http_output_filter function, just as
other nginx upstream modules.

> 3) Is it possible to send the video stream to the client with the browser.

I do not quite follow this question.

Best regards,

More information about the nginx mailing list