摘要:
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... 阅读全文
摘要:
对于一个服务器模型来说,事件模型是至关重要的,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... 阅读全文
摘要:
nginx的模块非常之多,可以认为所有代码都是以模块的形式组织,这包括核心模块和功能模块,针对不同的应用场合,并非所有的功能模块都要被用到,附录A给出的是默认configure(即简单的http服务器应用)下被连接的模块,这里虽说是模块连接,但nginx不会像apache或lighttpd那样在编译时生成so动态库而在程序执行时再进行动态加载,nginx模块源文件会在生成nginx时就直接被编译到其二进制执行文件中,所以如果要选用不同的功能模块,必须对nginx做重新配置和编译。对于功能模块的选择,如果要修改默认值,需要在进行configure时进行指定,比如新增http_flv功能模块... 阅读全文
摘要:
我们知道,如果我们模块需要一块共享的内存,需要调用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.. 阅读全文
摘要:
共享内存是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... 阅读全文
摘要:
运行在多进程模型的nginx在正常工作时,自然就会有多个进程实例,比如下图是在配置“worker_processes 4;”情况下的显示,nginx设置的进程title能很好的帮助我们区分监控进程与工作进程,不过带上选项f的ps命令以树目录的形式打印各个进程信息也能帮助我们做这个区分。多进程联合工作必定要牵扯到进程之间的通信问题,下面就来看看nginx是如何做的。 采用socketpair()函数创造一对未命名的unix域套接字来进行进程之间的双向通信.基本的数据结构: typedef struct { /** * 进程id */ ngx_pid_t ... 阅读全文
摘要:
一,什么是foreign key,及其完整性个人觉得,foreign key就是表与表之间的某种约定的关系,由于这种关系的存在,我们能够让表与表之间的数据,更加的完整,关连性更强。关于完整性,关连性我举个例子,大家就会明白了。有二张表,一张是用户表,一张是订单表:1,如果我删除了用户表里的用户,那么订单表里面根这个用户有关的数据,就成了无头数据了,不完整了。2,如果我在订单表里面,随便插入了一条数据,这个订单在用户表里面,没有与之对应的用户。这样数据也不完整了。如果有外键的话,就方便多了,可以不让用户删除数据,或者删除用户的话,通过外键同样删除订单表里面的数据,这样也能让数据完整。二,使用fo 阅读全文
摘要:
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。让我们分别说明。 先声明几个指针放着做例子: 例一: (1)int*ptr; (2)char*ptr; (3)int**ptr; (4)int(*ptr)[3]; (5)int*(*ptr)[4]; 指针的类型 从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型: (1)int*ptr;... 阅读全文