困扰nginx初学者的两个小问题

通过在群里大家的讨论,我总结了两点问题,很多初学者都问过:

1. ngixn事件处理中关于active和ready的问题

2. ngx_connection_t与ngx_http_connection_t结构的区别与联系

这里分开讨论下。

1.ngixn事件处理中关于active和ready的问题

这俩成员何时为0,何时又被置1,把很多人搞迷糊了。其实从nginx的设计上来讲,它想表达的语义很明确:
当一个fd第一次加入到epoll中的时候,active会被置1,意味着这个fd是有效的。直到我们把这个fd从epoll中移除,active才会清零。ready是另一层处理,这个fd虽然在epoll中,但是有时这个fd可以读写,有时则是未就绪的。那么当可读写时,ready就会被置1。这样我们就可以来读写数据了。当我们从fd读写到EAGAIN时,ready就会被清零,意味着当前这个fd未就绪。但是它不影响active,因为这个fd仍然在epoll中,ready==0只是要等待后续的读写触发。所以nginx在这两个变量的使用上是很明确的。

2. ngx_connection_t与ngx_http_connection_t结构的区别与联系

群里的朋友问过好几次了,这里稍微总结一下:

在nginx的定义里面ngx_connection_t可以看做是四层tcp的抽象,当然除了一些必要的连接信息之外,还有很多其他强大的功能,如有些事件控制相关的变量。对于具体的七层服务,如http,mail等,一般都有各自的具体信息。而这些信息通过ngx_connection_t中的data成员来承载,注意到类型为void *了吧。具体来讲,tcp上承载的http相关信息,使用的是ngx_http_connection_t结构,而mail则使用ngx_mail_session_t。

顺便提一下,下面这个问题也有很多新人问过:

在ngx_http_init_requst中,这里的c->data 是从ngx_get_connection 拿出来的,原来指向的是下一个free connection 。我跟了下代码,也没发现有什么地方改过c->data”。

其实在ngx_get_connection函数中,有个操作是ngx_memzero(c, sizeof(ngx_connection_t)),所以初始的c->data是NULL。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值