Nginx Module (I/O block)

Maxim Dounin mdounin at
Wed Mar 6 12:50:31 UTC 2013


On Wed, Mar 06, 2013 at 12:01:44AM +0100, alexander_koch_log wrote:

> On 02/10/2013 12:25 AM, Maxim Dounin wrote:
> >Hello!
> >
> >On Sat, Feb 09, 2013 at 04:41:54PM +0100, alexander_koch_log wrote:
> >
> >>It is not clear to me how to avoid blocking the nginx reactor loop
> >>when creating an nginx module which should perform some long I/O
> >>operations  and return the response to the client. Or is this
> >>handled internally by Nginx?
> >Correct aproach is to avoid blocking for a long time, and use
> >non-blocking I/O and event-based notification instead.
> >
> >What exactly should (and can) be done depends on the exact case.
> >E.g. to work with sockets there are lots of various functions
> >available to simplify things.  Working with files without blocking
> >is harder and not always possible, but a common case is handled by
> >nginx - to send some large file you just have to open the file and
> >ask nginx to send an in-file buffer.
> >
> When sending an in-file buffer, is it still possible to have the
> read stop when a special byte char is read like \xFF even though the
> provided bytes to read are larger?

As e.g. with sendfile used file's data is never available in 
user memory, the answer is no.

> One way would be to read to the buffer then truncate the memory,
> then send the buffer? Or is there an efficient way?

What you are trying to do is probably beter handled by a filter 
module.  You may ask nginx to read a file into memory buffers 
(output_buffers), and then inspect/modify all data passed though 
you filter.

Maxim Dounin

More information about the nginx-devel mailing list