Http 11 请求阶段
Post_read
Server_rewrite
Find_config
Rewrite
Post_rewirte
Pre_access
Access
Post_access
Try_files
Content
Log
没一个阶段都有一个checker方法和一个handler方法,checker方法会调用handler方法
Checker 方法会调用http_request , handler方法,然后查看handler返回值
- Ok, 下一个阶段
- Again,Done停留在此handler
- Declined, 下一个handler
- Error, finalize
没个模块负责在某个阶段比如post-configuration, 假如自己的handler
Web服务器
建立连接 调用init_connection
- 读事件加入到定时器
- 读事件handler设置为init_request
- 写事件为empty_handler
当有读事件来临时候,运行init_request
- 初始化http_request, assign 给 connection的data字段
- 找到监听地址的server配置,设置请求的http配置项
- Process_request_line
- 设置读事件handler为 process_request_line
接收完请求行后,设置read event handler为process_request_header用于接收头部
- Parse header line 来解析头部
- 根据头部的host设置server的配置
- 解析完所有头部 process_request 开始11阶段的handler
Process_request
- 设置写handler为request_handler, 读为block
- 调用各个phrase的checker函数,执行handler,返回ok直接return
Request_handler,process_request无法一次处理完,handler返回ok,则表示要等待
- 是否可写,继续调用 各个handler之行
- 可读,block-reading
Run_posted_reqeust
- 处理请求的子请求,调用write_event_handler
Ngx_http_header 发送头部到客户端
- 依次调用各个模块的send_header方法
- 最后调用的send_header为header_filter方法负责发送头部,如果一次没有发送完成,则有finalize_request继续发送完成
Ngx_output_filter发送包体到客户端
- 一次调用各个过滤包体的方法
- 最后调用write_filter方法发送包体,如需减速则设置事件到计时器中
结束请求
- Close connection
- Free request
- Finalize request : 如果是子请求结束,会激活父请求继续执行
反向代理
解决问题:
- 适配协议,下游http,上游可能是tcp
- 上下游网速差距过大
- 节省内存,同一个buffer块既用于接收缓存,发送消息,写入文件
ngx_http_upstream_t为反向代理的上下文
启动upstream
- Create_request准备向上游发送请求
- 设置upstream_clean_up到request的clean_up链表
- 和上游服务器建立连接
上游服务器建立连接ngx_http_upstream_connect
- 建立非阻塞连接,如果当时成功就发送请求upstream_send_request,如果不成功,就将写事件放到epoll模型中
- 放到epoll中事件读写handler设置为ngx_http_upstream_handler, handler会调用upstream中的读写handler
- upstream上下文中的write_handler = upstream_send_request_handler, read_handler=upstreamd_process_header
发送请求到上游服务器
- 调用ngx_outupt_chain向上游服务器发送请求,如果一次没有发送完,会将剩余内容记录下来,将写事件加到epoll模型中继续发送
- 发送完后,如果读事件ready会直接调用upstreamd_process_header接受头部
解析上游的响应ngx_http_upstream_process_header
- Process_header将结果存入header_in buffer中
- Ngx_http_upstream_process_header 将header 存入header_out中
- ngx_http_upstream_send_response发送包头
- process_body_in_memory接受包体,处理包体input_filter
转发包头和包体,以上游网速优先来转发
Ngx_event_pipt_t 为转发包体上下文
- ngx_http_upstream_send_response发送包头,同时设置上游读事件和下游写事件handler分别为ngx_http_upstream_process_upstream, ngx_http_upstream_process_downstream
- 最终调用 ngx_event_pipe_read_upstream处理上游的读,ngx_event_pipe_write_to_downstream处理下游的写
结束upstream请求
- 不会立马结束,会调用ngx_http_stream_next在尝试几次
- 重试过后仍然失败,调用ngx_http_upstream_finalize_request结束请求