随笔分类 -  nginx

摘要:对于web server来说,必须能够监听到客户端的连接才能与之通信,这篇文章就看一下nginx是如何实现连接的建立。监听到新的连接实际上就是监听socket上的读事件,此时监听socket的已完成连接队列是非空的,可以非阻塞的调用accpet获取新到的连接。在nginx中每个socket都会被封装成一个连接结构,就是ngx_connection_t类型。每个ngx_connection_t结构具有读写事件read和write,它们是ngx_event_t类型的,有一个handler回调函数指针,在发生读写事件时被调用。在ngx_event_process_init函数中为每个监听sock.. 阅读全文
posted @ 2012-11-29 20:01 风去无痕 编辑
摘要:1. 一些相关的数据结构:// 监听端口配置信息,addrs是在该端口上所有监听地址的数组。typedef struct { ngx_int_t family; in_port_t port; ngx_array_t addrs; /* array of ngx_http_conf_addr_t */} ngx_http_conf_port_t;typedef struct { ngx_http_listen_opt_t opt; ngx_hash... 阅读全文
posted @ 2012-11-29 18:38 风去无痕 编辑
摘要:对于一个服务器模型来说,事件模型是至关重要的,nginx本身的高性能也归功于它的事件模型。一般来说,nginx的事件模型是基于epoll。而epoll中会调用3函数,epoll_create,epoll_ctl,epoll_wait. (1) 首先介绍一些相关的数据结构:typedef struct { ngx_int_t (*add)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags); //将某描述符的某个事件(可读/可写)添加到多路复用监控里 ngx_int_t (*del)(ngx_event_t *ev, ng... 阅读全文
posted @ 2012-11-29 16:46 风去无痕 编辑
摘要:nginx的模块非常之多,可以认为所有代码都是以模块的形式组织,这包括核心模块和功能模块,针对不同的应用场合,并非所有的功能模块都要被用到,附录A给出的是默认configure(即简单的http服务器应用)下被连接的模块,这里虽说是模块连接,但nginx不会像apache或lighttpd那样在编译时生成so动态库而在程序执行时再进行动态加载,nginx模块源文件会在生成nginx时就直接被编译到其二进制执行文件中,所以如果要选用不同的功能模块,必须对nginx做重新配置和编译。对于功能模块的选择,如果要修改默认值,需要在进行configure时进行指定,比如新增http_flv功能模块... 阅读全文
posted @ 2012-11-28 21:25 风去无痕 编辑
摘要:首先来看一下,配置文件解析时的数据结构,这里主要是ngx_conf_t,这个结构保存了解析配置文件所需要的一些域,是一个非常重要的数据结构.struct ngx_conf_s{ char *name;//当前解析的命令名 ngx_array_t *args; //当前命令的所有参数 ngx_cycle_t *cycle; ngx_pool_t *pool; ngx_pool_t ... 阅读全文
posted @ 2012-11-27 14:57 风去无痕 编辑
摘要:slab的一些结构体:typedef struct { ngx_atomic_t lock; // 锁,因为slab在nginx中一般配合共享内存使用 size_t min_size; // 分配空间的最小值 size_t min_shift; // 该最小值对应的移位数 ngx_slab_page_t *pages; // 页数组 ngx_slab_page_t free; // 空闲的页 u_char *start; // 分配... 阅读全文
posted @ 2012-11-26 20:26 风去无痕 编辑
摘要:我们知道,如果我们模块需要一块共享的内存,需要调用ngx_share_memory_add来创建共享内存,而该函数不会马上创建一个共享内存,它是先登记一下共享内存的信息,例如名称,大小,然后在进程初始化时再进行共享内存的创建和初始化. ngx_shared_memory_add这个函数是将共享内存的分配登记在哪里,在ngx_cycle_s这个结构体中有一个成员,即ngx_cycle_s->shared_memory,它是个list,用来保存所有登记的共享内存,这个list中保存的ngx_shm_zone_t类型的数据, ngx_shm_zone_t的结构体:struct ngx_sh.. 阅读全文
posted @ 2012-11-26 17:49 风去无痕 编辑
摘要:共享内存是Linux下进程之间进行数据通信的最有效方式之一,而nginx就为我们提供了统一的操作接口来使用共享内存。在nginx里,一块完整的内存以结构体ngx_shm_zone_s封装.其中包括是共享内存的名字(shm_zone[i].shm.name),大小(shm_zone[i].shm.size),标签(shm_zone[i].tag), ngx_shm_zone_init_pt init; (初始化共享内存时的回调函数)一些共享内存的结构体:struct ngx_shm_zone_s void *data; n... 阅读全文
posted @ 2012-11-26 16:15 风去无痕 编辑
摘要:运行在多进程模型的nginx在正常工作时,自然就会有多个进程实例,比如下图是在配置“worker_processes 4;”情况下的显示,nginx设置的进程title能很好的帮助我们区分监控进程与工作进程,不过带上选项f的ps命令以树目录的形式打印各个进程信息也能帮助我们做这个区分。多进程联合工作必定要牵扯到进程之间的通信问题,下面就来看看nginx是如何做的。 采用socketpair()函数创造一对未命名的unix域套接字来进行进程之间的双向通信.基本的数据结构: typedef struct { /** * 进程id */ ngx_pid_t ... 阅读全文
posted @ 2012-11-26 14:02 风去无痕 编辑
摘要:nginx的进程模型和大多数后台服务程序一样,按职责将进程分成监控进程和工作进程两类,启动nginx的主进程充当监控进程,而由主进程fork出来的子进程则充当工作进程。工作进程的任务自然是完成具体的业务逻辑,而监控进程充当整个进程组的对外接口,同时对工作进程进行监护,比如如果某工作进程意外退出,监控进程将重新fork生成一个新的工作进程。nginx也可以单进程模型执行,在这种进程模型下,主进程就是工作进程,此时没有监控进程,单进程模型比较简单且官方建议仅供测试使用,所以下面主要分析多进程模型。 nginx多进程模型的入口函数为主进程的ngx_master_process_cycle(), .. 阅读全文
posted @ 2012-11-26 11:50 风去无痕 编辑

点击右上角即可分享
微信分享提示