# 架构
## 架构:
代码结构
事件机制
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
# 模块开发