nginx源码阅读

# 架构

## 架构:

    代码结构

    事件机制

        event框架和非阻塞模型: http://code.google.com/p/wcr/wiki/Nginx

            nginx的worker进程的主要工作在ngx_worker_process_cycle函数中实现,worker线程调用ngx_process_events_and_timers函数,捕获事件,分发事件。

            其中:

            1、(开启accept_mutex的情况)调用ngx_enable_accept_events()侦听accept事件。整个操作是异步的,尝试加锁,加上就侦听,加不上就返回

            2、调用(void) ngx_process_events(cycle, timer, flags);。ngx_process_events是经过定义的宏:#define ngx_process_events   ngx_event_actions.process_events

            ngx_event_actions是全局注册的事件处理模块ngx_event_actions_t,例如event/modules下的ngx_epoll_module_ctx。

        accpet:1、在开启accept_mutex的情况下,worker process在第一次调用ngx_process_events_timers()时,会调用ngx_enable_accept_events()侦听accept事件。

            2、在未开启accept_mutex的情况下,worker process会在event模块初始化的函数中,绑定accept事件的处理函数,由于worker进程共享由master创建的listenning socket,那么,每个worker进程能同时侦听这些套接字,捕获到accept事件,接收新的连接。

        定时器:http://blog.csdn.net/marcky/article/details/7623335

            概述:nginx提供一套高效的定时器实现,除了nginx核心能够使用定时器以外,我们在进行模块开发的时候也可以使用定时器来完成一些定时执行的任务。nginx定时器实现的核心是使用一棵红黑树来存储各个定时事件,每次循环的时候就从这棵树里找出超时的事件,然后一一触发,完成定时任务操作。

            定时器初始化:ngx_event_process_init() -> ngx_event_timer_init()

              配置指令timer_resolution -> ngx_timer_resolution,分两种情况

                1、配置:不会执行这段初始化代码了。也就是说,配置文件中使用了timer_resolution指令后,epoll_wait将使用信号中断的机制来驱动定时器,。初始化里做的setitimer操作就将会发挥它的作用了——定时产生SIGALRM信号将epoll_wait的阻塞给中断掉,从而唤醒

                2、未配置:将使用定时器红黑树的最小时间作为epoll_wait超时时间来驱动定时器

            定时事件的执行:ngx_process_events_and_timers()调用ngx_event_expire_timers(),检查哪些事件超时

        信号,惊群

    进程机制:master,worker,进程间通信

  基础设施:

    * 内存:内存池:http://www.alidata.org/archives/1390

    buffer和chain

    * aio:入门:http://2015.iteye.com/blog/1069444   NGX_HAVE_FILE_AIO,eventfd(),

      NGINX如何配置:http://lenky.info/2013/01/12/nginx%E5%AF%B9linux-native-aio%E6%9C%BA%E5%88%B6%E7%9A%84%E5%BA%94%E7%94%A8%EF%BC%88%E9%85%8D%E7%BD%AE%E7%AF%87%EF%BC%89/

      NGINX如何实现:http://lenky.info/2013/01/12/nginx%E5%AF%B9linux-native-aio%E6%9C%BA%E5%88%B6%E7%9A%84%E5%BA%94%E7%94%A8%EF%BC%88%E5%AE%9E%E7%8E%B0%E7%AF%87%EF%BC%89/

    * 锁:http://simohayha.iteye.com/blog/658012

    基本结构

      数据结构:

        array: ngx_array.{h,c}  内存不够时分配原有的两倍

        list:内存不够再分配一个list_part

        queue:TODO

        radix_tree、rbtree:

      算法:

        crypt:被ngx_http_auth_basic_crypt_handler调用

        hash和murmurhash、md5

        crc16和32:

      和nginx相关的设施:

        内存相关:

        pool:池结构,一般是内存池,也可以用于其他

        buffer和chain:6 TODO

        slab

        其他结构:

        connection:http://blog.csdn.net/lengzijian/article/details/7593861 TCP defer accept选项

        config_file:2 TODO tengine讲的比较详细

        cpuinfo:ngx_cacheline_size CPU的一级缓存大小

        cycle:3 TODO

        inet

        resolver:

        file:ngx_file.{h,c}

        log:4 TODO

        open_file_cache:TODO

        output_chain:TODO ????

        parse:5 TODO ???

        regex:对PCRE的封装

        shmtx和spinlock

        times:

    时间缓存

    文件缓存

    * log:格式说明和使用:http://linux008.blog.51cto.com/2837805/595749

        实现:

  * 启动阶段:http://tengine.taobao.org/book/chapter_11.html

  * 请求处理阶段:http://tengine.taobao.org/book/chapter_12.html

 

# 模块开发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值