nginx

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、队列指针为不同结构体建立联系。 文章来源: nginx

人吐槽 人点赞

猜你喜欢

发表评论

用户名: 密码:
验证码: 匿名发表

你可以使用这些语言

查看评论:nginx