《深入理解Nginx:模块开发与架构解析》一3.8 将磁盘文件作为包体发送
3.8 将磁盘文件作为包体发送
上文讨论了如何将内存中的数据作为包体发送给客户端,而在发送文件时完全可以先把文件读取到内存中再向用户发送数据,但是这样做会有两个缺点:
为了不阻塞Nginx,每次只能读取并发送磁盘中的少量数据,需要反复持续多次。
Linux上高效的sendfile系统调用不需要先把磁盘中的数据读取到用户态内存再发送到网络中。
当然,Nginx已经封装好了多种接口,以便将磁盘或者缓存中的文件发送给用户。
3.8.1 如何发送磁盘中的文件
发送文件时使用的是3.7节中所介绍的接口。例如:
ngx_chain_t out;
out.buf = b;
out.next = NULL;
return ngx_http_output_filter(r, &out);
两者不同的地方在于如何设置ngx_buf_t缓冲区。在3.2.5