1、使用可变参数打印日志。
2、红黑树处理文件。
3、elt?
答、red black tree.
4、typedef定义类型增加代码可读性。
5、EPOLLRDHUP解决对端半关闭,造成服务器从epoll中读取数据错误。
6、问什么是epoll惊群问题?
答、
在主线程中创建一个socket、绑定到本地端口并监听
在主线程中创建一个epoll实例(epoll_create(2))
将监听socket添加到epoll中(epoll_ctl(2))
创建多个子线程,每个子线程都共享步骤2里创建的同一个epoll文件描述符,然后调用epoll_wait(2)等待事件到来accept(2)
请求到来,新连接建立
这里的问题就是,在第5步的时候,会有多少个线程被唤醒而从epoll_wait()调用返回?答案是不一定,可能只有一个,也可能有部分,也可能是全部。当然在多个线程都唤醒的情况下,只会有一个线程accept()调用会成功。
7、EPOLLEXCLUSIVE解决惊群问题。
8、CTX?
答、context;
9、保证较长字符串只出现一次。
10、内存对齐函数:posix_memalign及memalign分配ngx_cycle_t内pool堆内存空间。
11、ngx_modules.c中声明了所有组件
12、使用类似linux内核哲学。
结构体里存放一个队列结构体,用来将所有结构体串连起来,通过相对该队列结构体位置,可以找到下一个结构体的开始地址。
13、
红黑树结构:struct ngx_rbtree_node_s;struct ngx_rbtree_s;
ngx_rbtree_s内设置根节点指针和哨兵节点指针。以及插入回调函数指针。
14、ngx_rbtree_node_t是时间节点。
15、
先简单答一下。Nginx引入线程池是为了解决因为某些长时间阻塞的调用导致
性能下降的问题。比如文章里提到的cache服务器服务大文件就是一个例子。还
有一些大量计算的应用也可以尝试用它来解决。至于实际效果?呵呵,你测测看
啊。跑一下题,作为一个对Nginx研究非常深入的团队(我们是开发Tengine的),
需要cache服务器的时候我们从来不考虑Nginx。。。
16、ngx_array_t类型里的elts的含义是elements。nelts含义是elements number
17、父子进程通过socketpair方式进行通信。
18、FIOASYNC作用?
答、设置/ 清除信号驱动异步I/O 标志。
19、F_SETOWN作用?
答、设置将要在文件描述词fd上接收SIGIO 或 SIGURG事件信号的进程或进程组标识
20、FD_CLOEXEC作用?
答、close on exec, not on-fork, 意为如果对描述符设置了FD_CLOEXEC,使用execl执行
的程序里,此描述符被关闭,不能再使用它,但是在使用fork调用的子进程中,此描述符
并不关闭,仍可使用。
21、加载nginx.conf配置文件的函数位置?
答、nginx.c ngx_process_options ngx_str_set(&cycle->conf_file, NGX_CONF_PATH);
22、st:state
23、ngx_auto_config.h 定义配置文件名。
24、ngx_conf_read_token(cf)函数读配置文件nginx.conf。ngx_conf_file.c
25、ngx_conf_parse(&conf,&cycle->conf_file)处理配置文件nginx.conf。
26、sz:size??
27、nginx.c 938:getcwd
28、ngx_process_cycle.c 345,358::ngx_spawn_process创建子进程。
29、recvmsg、sendmsg: ngx_channel.c 128;类似socket通信中的read和write,
30、1006 ngx_channel_handler(ngx_event_t*ev);1023 ngx_read_channel,socket读。
31、chdir 869
32、ngx_event_s中data很可能是channel。ngx_channel_t
ngx_process_cycle.c:1023;c->fd;
33、ngx_log.c 318 ngx_log_init prefix传出参数。
34、nginx.c 232 ngx_log_init其中ngx_prefix传出参数。ngx_prefix的值是/usr/local/nginx/
35、nginx.c 969:ngx_str_set(&cycle->conf_file.......);
cycle->conf_file=conf/nginx.conf
36、nginx.c 925、cycle->conf_prefix 为ngx_prefix。/usr/local/nginx/
cycle->prefix 为ngx_prefix. /usr/local/nginx/
37、nginx.c 972、运行成功结果:conf_file:/usr/local/nginx/conf/nginx.conf;
38、nginx.c 982、运行结果:cycle->conf_prefix.data=/usr/local/nginx/conf/nginx.conf;
cycle->conf_prefix.len=sizeof(/usr/local/nginx/conf/);
39、ngx_modules.c中所有extern ngx_module_t **;都会在对应的**.c文件中被定义
40、ngx_module_s的name中存储的是组件名字。例如“ngx_core_module”
41、56、ngx_memcpy(cycle->.......)向初始化cycle->modules。
42、ngx_cycle.c 227 module=cycle->modules[i]->ctx;疑似调用module中的create_conf函数创建文件。
43、ngx_conf_file.c 528,file_size是cf->conf_file文件的大小。
44、ngx_conf_file.c 192, ngx_fd_info获得配置文件cf->conf_file的state信息。
45、ngx_conf_t中 args存储cf->conf_file文件中读取的信息。
46、sharp_comment 表示注释判断标志。
47、nginx.conf 中$开头的表示变量。ngx_conf_file.c 727;
48、nginx.conf中基本单元
单词{
};
先将单词解析存入ngx_conf_t中的args中。
49、ngx_conf_file.c 405,出现NGX_CONF_BLOCK_START,说明
ngx_conf_file.c 242,返回NGX_CONF_BLOCK_START运行。
50、ngx_conf_file.c 318,rc=ngx_conf_handler(cf,rc);会遍历module,并用cmd处理。
//51、每次处理ngxin.conf中一段数据,ngx_conf_file.c 528都会被执行一次。
//52、ngx_conf_file.c 579,丢弃之前处理的数据,ngx_memmove(b->start,start,len);
53、ngx_conf_file.c 588,带偏移量地读文件。
54、{}内分号结尾的每一行是word读取的内容。
55、ngx_conf_file.c 380,通过比较组件modules的name和cf->args->elts的name(ngx_conf_file.c 363),
选择对应组件的cmd,例如:ngx_event.c 83:ngx_string("events");与nginx.conf中的events{
}
56、nginx.conf中的配置例如
events{
};
events是什么?
答、对应组件的ngx_command_t中的name字符串值。
57、ngx_http_core_module.c 277 nginx.conf 配置中server设置项location处理
例如:
server{
location /{
}
}
58、
location /hello{
fastcgi_pass 127.0.0.1:8084;
include fastcgi.conf;
client_max_body_size 2000m;
}
其中location:ngx_http_core_module.c:275;
fastcgi_pass:ngx_http_fastcgi_module.c:226;
include:ngx_http_ssi_filter_module.c:291
client_max_body_size:ngx_http_core_module.c:347;
59、
{
}
;
都是读nginx.conf中信息时的分界符。位置ngx_conf_file.c 242;
60、
配置文件nginx.conf中location /demo{
};
demo存储的结构体
ngx_http_core_loc_conf_s;
61、
ngx_http_core_module.c 3204:pclcf是cf的一部分。
62、st:state;
63、cl:chain_link;
64、rb:request_body;
65、nginx.c 372,ngx_single_process_cycle(cycle);
启动所有事件,例如ngx_event.c 184 ngx_event_process_init;
选择ngx_http_auth_basic_module.c、ngx_http_empty_gif_module.c研究组件的运行。
66、所有组件向客户端传递数据,通过结构体ngx_http_complex_value_t;
67、ngx_http_auth_basic_module.c 中23:relm从nginx.conf中读取数据。
68、如何为编写nginx组件,并编译?例如目录src/http/module
答、①、在该目录中写好组件文件.c;注意ngx_http_zongxintext_commands中的ngx_string("zongxintext");用来声明组件名称。
②、进入objs/目录,修改ngx_modules.c,根据其他module添加方式,添加新建的组件;
③、进入objs/目录,修改Makefile,根据所在目录情况,修改编译;
④、make&&make install;
69、nginx组件ngx_http_empty_gif_module.c的分析?
答、ngx_http_complex_value_t结构体存放响应值;从cv.value.data=ngx_empty_gif;可以推断;ngx_http_send_response
函数会发送请求。
ngx_command_s结构体中第三个变量存储对应组件核心处理方法。
70、队列指针为不同结构体建立联系。