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,assign给connection的data字段
- 找到监听地址的server配置,设置请求的http配置项
- Process_request_line
- 设置读事件handler为process_request_line
接收完请求行后,设置readeventhandler为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结束请求
- nginx
- Nginx
- Nginx
- Nginx
- Nginx
- nginx
- nginx
- nginx
- nginx
- nginx
- nginx
- nginx
- nginx
- Nginx
- nginx
- nginx
- nginx
- nginx
- 蓝桥杯省赛
- 附录:8皇后问题代码
- 巴恩斯利蕨
- 【数据库技术】ORACLE基本数据类型总结
- CodeForces
- Nginx
- 未来智能手机摄像技术发展趋势:应用
- 决策树算法
- 浅谈CSRF攻击方式
- 附录:球钟代码
- nyoj 21 三个水杯
- Gson
- 常用设计没模式
- spark RDD算子(三) distinct,union,intersection,subtract,cartesian