2.stream&proxy流程解析(TCP)
2023-03-14 15:23:19 0 举报
nginx的初始化流程解析
作者其他创作
大纲/内容
ngx_event_actions.process_events
static ngx_event_module_t ngx_epoll_module_ctx = { &font color=\"#7b1fa2\
连接初始化
ngx_stream_handler.c
【NGX_STREAM_SSL_PHASE】
ngx_stream_proxy_handler(ngx_stream_session_t *s)
font color=\"#388e3c\
static void ngx_stream_proxy_handler(ngx_stream_session_t *s){ ..... //获取srv块配置 pscf = font color=\"#e855a4\
static ngx_stream_module_t font color=\"#7b1fa2\
recv接收处理:
ngx_event_accept(ngx_event_t *ev)
ngx_stream_block()
ngx_stream_proxy_process()(初始化时先处理一下)
ngx_event_core_module. font color=\"#388e3c\
ngx_stream_init_phase_handlers()
c为监听连接对象
for: rev = c->read ; rev->handler( ngx_event_t );
ls->handler(c);
ngx_epoll_add_connection(c)
epoll_ctl(font color=\"#7b1fa2\
ngx_stream_session_handler(ngx_event_t *rev)
ngx_stream_core_module.c
ngx_int_t font color=\"#388e3c\
static ngx_event_module_t font color=\"#ba68c8\
【NGX_STREAM_PREREAD_PHASE】
ngx_epoll_init(c)
ep = epoll_create(cycle->connection_n/2);
proxy 新建会话: proxy在解析proxy_pass指令时,设置了配置内容回调cscf->handler = ngx_stream_proxy_handler;
ngx_stream_proxy_upstream_handler()触发代理上行事件
ngx_stream_proxy_connect_handler()(连接成功触发该事件)
for: rev = c->read ; rev->handler( ngx_event_t );【ngx_event_accept()】
void ngx_stream_core_run_phases(ngx_stream_session_t *s){ ngx_int_t rc; ngx_stream_phase_handler_t *ph; ngx_stream_core_main_conf_t *cmcf; cmcf = font color=\"#1b5e20\
ngx_stream_core_run_phases(ngx_stream_session_t *s)
ngx_linux_init.c (ngx_win32_init.c)
stream核心内容处理阶段
ngx_stream_ssl_module.c
1. 通过epoll_list获取epoll的font color=\"#ff0000\
开始对本地端的连接对象 connection_t 赋值
发送数据:font color=\"#a23c73\
ngx_os_io
ngx_os.h
在 b style=\
通过监听中的size,初始化每个连接的内存池大小
//赋值正常连接的EPOLL数据处理函数c->recv = ngx_recv;c->send = ngx_send;c->recv_chain = ngx_recv_chain;c->send_chain = ngx_send_chain;
1. 新建session对象: s = ngx_pcalloc()2. 关键赋值: s->connection = c; c->data = s; rev->handler = ngx_stream_session_handler
main()
【NGX_STREAM_CONTENT_PHASE】
//新建连接对象(从连接池中获取)c = font color=\"#388e3c\
ngx_stream_proxy_module.c
ngx_single_process_cycle()
for: ngx_process_events_and_timers( cycle )
【NGX_STREAM_ACCESS_PHASE】
nginx.c
!!!重要: 将连接对象存放在EPOLL事件中
static ngx_command_t ngx_stream_proxy_commands[] = { { ngx_string(\"proxy_pass\
获取空闲连接对象: ngx_get_connection()
ngx_stream_init_connection(ngx_connection_t *c)
【NGX_STREAM_CONTENT_PHASE】 : 唯一的内容阶段
ngx_epoll_module.c
c为连接对象(本端)
c->pool = font color=\"#388e3c\
监听connection的处理方法ls->handler = ngx_stream_init_connection();
最后调用监听器的处理方法进行处理(就是上面的session处理)rev-b style=\
static ngx_int_t ngx_event_process_init(ngx_cycle_t *cycle)
系统accept()
font color=\"#a23c73\
ngx_add_conn(c)
ngx_stream_optimize_servers()
ngx_event_accept.c
ngx_linux_io
【NGX_STREAM_other_PHASE】 : 非content阶段
ngx_stream_access_module.c
ngx_stream.c
pc->read->handler = ngx_stream_proxy_upstream_handler; //peer代理事件处理 pc->write->handler = ngx_stream_proxy_upstream_handler; //peer代理事件处理
ngx_stream_proxy_init_upstream()(初始化该upstream)
ngx_io
ngx_event.c
ngx_stream_proxy_process()(循环处理: 接收数据并发送)
0 条评论
下一页