首先,nginx接受到请求的报文,此报文为二进制形式,nginx会逐行解析此请求。在此阶段,服务器端会先处理请求头(header),然后处理请求体(body)。在处理请求体的时候,用户可能会上传比较大的文件,在这时我们可以设置一层缓冲区:
proxy_request_buffering on;(若为off,则表示取消缓冲)
此时服务器会等待将请求体(body)完全读完之后再进行反向代理的操作,若为off,则可以一边读取body,一边向上有服务器发送请求。
在请求的过程中,会先在upstream里选择服务器(默认是使用轮询方法进行选择)。选出服务器后,nginx是采用异步的方式去处理用户请求,当客户端发来请求时,还涉及到了回调函数与epoll事件队列,主要为以下步骤
1. 接收数据:当一个客户端连接到达时,Nginx会将该连接注册到Epoll事件队列,并将读事件(客户端有数据可读)添加到关注列表中。
2. Epoll等待事件:Nginx的主循环通过调用Epoll等待函数等待事件的发生。当有事件就绪时,Epoll会通知Nginx。
3. 事件处理:当Epoll通知有数据可读时,Nginx会调用相应的回调函数,该回调函数会从客户端连接中读取数据,并将数据传递给后续处理流程。
4. 处理数据:Nginx将读取到的数据传递给上层的HTTP请求处理模块。这些模块会解析HTTP请求、执行相应的操作,并准备好要发送给客户端的响应数据。
5. 发送数据:Nginx将响应数据注册到Epoll事件队列,并添加写事件(可以向客户端写入数据)到关注列表中。
6. Epoll等待事件:Nginx的主循环再次通过Epoll等待函数等待事件的发生。
7. 事件处理:当Epoll通知可以写入数据时,Nginx会调用相应的回调函数。该回调函数将准备好的响应数据写入到客户端连接中,完成响应过程。
在上游服务器把数据返回给nginx代理服务器的时候,此时可在nginx中开启
proxy_buffering on;
这个指令会开启代理服务器的缓冲操作。接下来举例谈谈如果是关闭状态带来的坏处:假设客户端需要向上游服务器索要20G大小的数据,上游服务器将数据发送给nginx代理服务器需要20s,而代理服务器发送数据给客户端需要1h,此时若proxy_buffering off,则上游服务器和代理服务器的连接将一直不能中断。所以还是尽量将上游服务器的数据缓冲到代理服务器中。与之相关的配置如下:
proxy_buffers 32 64k 缓冲区大小 32个64k大小的内存缓冲块
proxy_max_temp_file_size proxypass读到向磁盘写入的最大值(若内存缓冲块不够,则向磁盘缓冲)
proxy_temp_path 缓冲文件的地址
proxy_temp_file_write_size 向磁盘缓冲区写入时一次写入的大小
注意,以上是对body数据的缓冲的指令,对于header,则是一直都有缓冲的,当proxy_buffering off时,它会利用header的缓冲区缓冲一下body的数据,与header的缓冲区有关的指令为:
proxy_buffer_size
最后的最后,就是再次通过epoll等待事件和相应的回调函数将数据写入到客户端连接中,完成响应过程。