Nginx

来源:互联网 发布:epub360 知乎 编辑:程序博客网 时间:2024/05/29 16:27

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,assignconnectiondata字段
  • 找到监听地址的server配置,设置请求的http配置项
  • Process_request_line
  • 设置读事件handlerprocess_request_line

接收完请求行后,设置readeventhandler为process_request_header用于接收头部

  • Parse header line来解析头部
  • 根据头部的host设置server的配置
  • 解析完所有头部 process_request开始11阶段的handler

Process_request

  • 设置写handlerrequest_handler,读为block
  • 调用各个phrasechecker函数,执行handler,返回ok直接return

Request_handler,process_request无法一次处理完,handler返回ok,则表示要等待

  • 是否可写,继续调用各个handler之行
  • 可读,block-reading

Run_posted_reqeust

  • 处理请求的子请求,调用write_event_handler

Ngx_http_header发送头部到客户端

  • 依次调用各个模块的send_header方法
  • 最后调用的send_headerheader_filter方法负责发送头部,如果一次没有发送完成,则有finalize_request继续发送完成

Ngx_output_filter发送包体到客户端

  • 一次调用各个过滤包体的方法
  • 最后调用write_filter方法发送包体,如需减速则设置事件到计时器中

结束请求

  • Close connection
  • Free request
  • Finalize request :如果是子请求结束,会激活父请求继续执行

 

反向代理

解决问题:

  1. 适配协议,下游http,上游可能是tcp
  1. 上下游网速差距过大 
  2. 节省内存,同一个buffer块既用于接收缓存,发送消息,写入文件

  ngx_http_upstream_t为反向代理的上下文

 

启动upstream

  • Create_request准备向上游发送请求
  • 设置upstream_clean_uprequestclean_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_headerheader存入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结束请求
0 0
原创粉丝点击