13.2 邮件模块的处理框架

本节首先会从总体上说明邮件框架是如何处理请求的,接着会介绍这一新的模块类型有什么样的接口,以及应当如何定义,最后将会简单地说明邮件框架的初始化过程。

13.2.1 一个请求的8个独立处理阶段

图13-2大致介绍了请求的处理过程,而对于邮件框架而言,通常可以把请求的处理过程分为8个阶段。这里“阶段”的划分依据是什么呢?由于Nginx是异步的、非阻塞的处理方式,所有负责独立功能的一个(或者几个)方法可能被epoll或者定时器无数次地驱动、调度,故而可以把相同代码可能被反复多次调用的过程称为一个阶段。下面按照这种划分方式,把请求分为8个阶段,如图13-3所示。

13.2 邮件模块的处理框架 - 图1

图 13-3 邮件框架中处理一个请求的主要阶段

这8个阶段必须依次向下进行,它们的意义如下。

1)当客户端发起的TCP连接建立成功时,就会回调邮件框架初始化时设定的ngx_mail_init_connection方法,在这个方法中会初始化将要用到的数据结构,并设置下一个阶段的处理方法。

2)接收、解析客户端的请求。这个阶段会读取客户端发来的TCP流,并使用状态机解析它,如果解析后发现已接收到完整的请求,则进入下一阶段;否则,将会继续把连接上的读事件添加到epoll中,并等待epoll的下一次调度,以便继续读取客户端请求。

3)解析到完整的请求后,就需要向认证服务器发起类似HTTP的请求来验证请求是否合法。Nginx与认证服务器间仍然是通过TCP通信的,发起三次握手自然算是一个独立的阶段。

4)当Nginx与认证服务器成功建立TCP连接时,ngx_mail_auth_http_module模块将会构造、发送请求到认证服务器。在13.4.3节中将要介绍的ngx_mail_auth_http_write_handler方法会确保全部的请求都发送到认证服务器中。

5)Nginx接收认证服务器的响应是通过ngx_mail_auth_http_read_handler完成的,在该方法中,每接收一部分响应都要使用状态机来解析,在接收完整的响应(包括响应行和HTTP头部)后,还会分析响应结果以确定请求是否合法,如果合法,将继续执行下一阶段。

6)这一阶段将从认证服务器返回的响应中获得上游邮件服务器的地址,接着向上游邮件服务器发起TCP连接。

7)在TCP连接建立成功后,接下来是Nginx与邮件服务器使用POP3、SMTP或者IMAP交互的阶段。这一过程主要是Nginx将请求中的用户、密码、发件人、收件人等信息传递给邮件服务器,这个过程是双向的,直到Nginx认为邮件服务器同意继续向下进行时,才会继续下一阶段。

8)这一阶段是最主要的透传邮件协议阶段。只要Nginx收到下游客户端的TCP流(无论是哪一种邮件协议),会原封不动地转发给上游的邮件服务器,同样,如果收到上游的TCP流,也会原样转发给下游。

邮件框架的目标就是健壮、高效地处理这8个阶段。