vislee / leevis.com

Blog
87 stars 13 forks source link

nginx的事件驱动-epoll网络事件和定时器事件 #133

Open vislee opened 6 years ago

vislee commented 6 years ago

概述

nginx作为代理服务器,处理网络读写事件是其核心。在linux平台上使用epoll管理网络读写事件使得nginx有很高的性能,再配合定时器事件可以实现一些超时和控制速率的一些功能。

而nginx又是如何使用epoll,又是何时添加可读、可写、定时事件的呢?

代码分析

以下是部分事件的回调函数,缩进代表了调用层级。 后续会补充对应事件是被何时添加到epoll中的,是使用的水平触发还是边沿触发。定时器是何时使用的。

// 监听的fd事件回调
listen:rev->handler = ngx_event_accept;   // -> ls->handler();
    ls->handler = ngx_http_init_connection;

// 建立起连接的fd的事件回调http模块
connect:
    c->recv = ngx_recv;
    c->rev->handler = ngx_http_wait_request_handler;
        r->read_event_handler = ngx_http_block_reading;
        c->rev->handler = ngx_http_process_request_line;
            c->rev->handler = ngx_http_process_request_headers;
                ngx_http_process_request_header();
                ngx_http_process_request();
                        c->read->handler = ngx_http_request_handler;
                        r->read_event_handler = ngx_http_block_reading;
                        ngx_http_handler(r);
                            ngx_http_core_run_phases(r);

    c->write->handler = ngx_http_empty_handler;
                        c->write->handler = ngx_http_request_handler;
                            r->write_event_handler = ngx_http_core_run_phases;

总结: