困扰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。


你可能感兴趣的:(nginx)