你以为Nginx只是简单的转发请求?实际上,每个HTTP请求在Nginx内部都经历了一场精彩纷呈的冒险之旅!
从"接线员"到"流水线":Nginx的架构设计
想象一下,Nginx就像一个高效率的快递分拣中心,而每个HTTP请求则是一个个等待处理的包裹。这个"分拣中心"之所以能够同时处理成千上万个包裹,全靠其独特的设计架构。
Nginx采用经典的Master-Worker进程模型,类似于一个"总经理"加多个"产线工人"的组合。Master进程作为总经理,只负责管理Worker进程,不直接处理客户请求,而Worker进程则是真正干活的一线员工。
当一个HTTP请求到达Nginx服务器时,旅程正式开始:
- 监听套接字创建:Nginx根据配置文件中的监听地址和端口,创建监听套接字,相当于给快递中心安装上了"送货大门"。
- 事件驱动准备:Worker进程在初始化时会为每个监听套接字绑定一个连接池,并设置读事件回调为
ngx_event_accept,类似于给每个员工配发了"扫码枪",准备接收包裹。 - 连接建立:当客户端发起TCP连接(接收到SYN包),事件模块检测到连接请求,成功建立连接后,根据nginx.conf文件中的配置会交由HTTP框架处理。
// 实际源码中,监听套接字的回调函数设置大致如下
// 在ngx_http_init_listening()函数中
ls->handler = ngx_http_init_connection;
连接建立后,Nginx并不会立即开始处理HTTP请求,而是先设置好各种回调函数,为后续处理做好准备。这种事件驱动的设计思路,让Nginx能够用有限的资源服务大量的并发连接。
请求接收:拆解HTTP"包裹"
当连接建立完成后,Nginx会调用监听套接字上的handler——ngx_http_init_connection函数开始处理HTTP请求。这就像快递员把包裹送到了分拣中心的传送带上。
HTTP请求的处理始于接收和解析HTTP头部。Nginx会先尝试接收完整的HTTP请求头,因为只有拿到完整的头部,才能知道这个请求想要什么。
在ngx_http_request_t结构体中,保存了所有关于HTTP请求的信息:
struct ngx_http_request_s {
ngx_uint_t method; // HTTP方法(GET、POST等)
ngx_uint_t http_version; // HTTP版本
ngx_str_t request_line; // 请求行
ngx_str_t uri; // URI
ngx_str_t args; // 参数
ngx_str_t unparsed_uri; // 未解析的URI
ngx_str_t method_name; // 方法名
ngx_str_t http_protocol; // HTTP协议
u_char *uri_start;
u_char *uri_end;
u_char *args_start;
// ... 其他字段
};

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



