请求体的读取一般发生在nginx的content handler中,一些nginx内置的模块,比如proxy模块,fastcgi模块,uwsgi模块等,这些模块的行为必须将客户端过来的请求体(如果有的话)以相应协议完整的转发到后端服务进程,所有的这些模块都是调用了ngx_http_read_client_request_body()接口来完成请求体读取。值得注意的是这些模块会把客户端的请求体完整的读取后才开始往后端转发数据。

上面我们已经开始处理http request header了,接下来,如果请求中有body内容,那么需要处理body了。这里你肯定不会想要去阻塞式的读取body吧?body的长度可大可小,网络环境也巨复杂,只要有阻塞操作肯定玩完。Nginx这时已经准备了一个现成的读取body的非阻塞模式给用户,就是ngx_http_read_client_request_body方法。

大家看下ngx_http_read_client_request_body方法的原型:
ngx_int_t
ngx_http_read_client_request_body(ngx_http_request_t *r,ngx_http_client_body_handler_pt post_handler);

参数r就是要处理的请求,post_handler则是body接收完成后的回调方法。
所以,在worker进程中,调用ngx_http_read_client_request_body是不会阻塞的,要么读完socket上的buffer发现不完整立刻返回,等待下一次EPOLLIN事件,要么就是读完body了,调用用户定义的post_handler方法去处理body。

ngx_http_read_client_request_body提供两种保存body的方式,一种是把body存储在内存中,另一种是把body存储到临时文件里。这个临时文件也有不同的处理方法,一种是请求结束后nginx便清理掉,另外就是永久保留这个临时文件。例如下面这两个参数就会设定为每个body都存放到临时文件里,并且这个临时文件在请求结束后不会被删除:
r->request_body_in_persistent_file = 1;
r->request_body_in_file_only = 1;

最新文章

  1. 详解SQLServer 存储过程
  2. Tomcat端口被占用错误
  3. ggplot2 多图排版
  4. jquery工具方法proxy
  5. DIV宽度自动缓慢变化
  6. C#构造Http 破解学校教务系统学生账号密码
  7. 数的n次方 s.match(reg) marquee滚动效果
  8. yebis 和phyreengine的集成
  9. 如何在linux系统下对文件夹名有空格的文件夹进行操作
  10. c#中的对象
  11. 人人公益模式系统开发app
  12. 我所使用的Linux软件集合
  13. 关于MySQL 事务,视图,索引,数据库备份,恢复
  14. struct2 拿到url的方法
  15. 面试必问Elasticsearch倒排索引原理
  16. quick-cocos2d-x 游戏开发之一】开发工具sublime text及其强力插件QuickXDev
  17. python中数组与多维数组用法介绍
  18. Topless eclipse导入myeclipse的web项目没法识别问题解决
  19. 如何配置JDK?
  20. 使用base64转码的方式上传图片

热门文章

  1. java面向对象复习之一
  2. 容器镜像服务 联手 IDE 插件,实现一键部署、持续集成与交付
  3. Manacher模板( 线性求最长回文子串 )
  4. 倍增O(1)求区间&值与|值
  5. 【翻译】详解HTML5 自定义 Data 属性
  6. Spring Cloud Commons教程(二)Spring RestTemplate作为负载平衡器客户端
  7. [ethereum源码分析](1) dubug环境搭建
  8. Matlab中imfilter()函数的用法
  9. java执行系统命令, 返回执行结果
  10. MVC4:ajax Json 应用