摘要:之前一直研究nginx的源代码,最近有时间也做了下nginx与apache的性能对比,希望能够够对大家有所帮助!转载请注明:http://blog.csdn.net/lengzijian/article/details/7699444nginx动态文件处理能力差?这是我最困惑的地方,在google了nginx之后发现它的评价并没有想象中那么差劲,并且很多公司已经开始用nginx+php(fast-cgi)作为主流web服务器,于是我决定亲自试一试。测试环境:web服务器:192.168.0.235双核(Intel(R) Xeon(TM) CPU 3.00GHz)测试客户端:192.168.30
阅读全文
摘要:关于:nginx_http_push_module模块致力成为一个成熟的http推送和comet服务,它能够处理好全部链接,并且仅通过http请求,可以完成广播消息到所有客户端,这让你写异步web应用程序时得心应手,并且在代码中完全不必理会延时请求。本文为翻译文章,有部分原创转载请注明地址:http://blog.csdn.net/lengzijian/article/details/7638088为什么选择此模块:当你要写一个实时更新的模块时,例如某些聊天室、多人在线flash游戏等。无论哪种方式,我们都要避免更新请求时刷新页面或者每隔几秒轮训服务器,这样的代码丑陋无比(也许是我翻译错误)。
阅读全文
摘要:在二十一节中,提到过调用ngx_eventfind_timer()获取timer,然后传递给epoll模块,做等待时间,今天我们主要讲解下这个方法。本文来自于:http://blog.csdn.net/lengzijiannginx中的timer用红黑树的结构排序。ngx_event_timer_rbtree就是nginx中timer的红黑树。1.下面我们来看一下ngx_event_timer_rbtree的结构:src/core/ngx_rbtree.h typedef struct ngx_rbtree_s ngx_rbtree_t; typedef void (*ngx_rbtre...
阅读全文
摘要:上一节我们讲到了事件驱动的模块,它把我们引入epoll模块,今天我们主要学习下nginx如何使用epoll完成时间驱动,实现高并发;这里不详细讲解epoll原理,如果有机会再做一次单独的epoll的学习。本文来自于:http://blog.csdn.net/lengzijian回忆一下上一节的内容,在我们讲到ngx_process_events_and_timers时,在源码最后提到了ngx_process_events,这里是把我们引入epoll的入口:1.先来看下ngx_process_events的宏定义:src/event/ngx_event.h #define ngx_proces.
阅读全文
摘要:首先继续回忆下,之前子线程执行操作里面有一个未涉及的内容ngx_process_events_and_timers,今天我们就来研究下这个函数。本篇文章来自于:http://blog.csdn.net/lengzijian/article/details/7601730先来看一下第十九节的部分截图:今天主要讲解的就是事件驱动函数,图中的红色部分:src/event/ngx_event.c void
ngx_process_events_and_timers(ngx_cycle_t *cycle)
{ ngx_uint_t flags; ngx_msec_t timer, ...
阅读全文
摘要:读完之前的学习笔记,相信已经对nginx的启动流程有了一定的认识,从这一节起我们想深入各个模块,学习各个模块的内的主要操作。本文来自于:http://blog.csdn.net/lengzijian/article/details/7598996今天我们就来学习下event模块,在之前的启动里多次提到了调用各个模块的钩子函数,我们先来回忆一下关于event模块钩子函数的执行,也是event模块启动的步骤:1.创建conf(creat_conf):ngx_event_create_conf()该方法,主要是创建了一个ngx_event_conf_t结构体,并且分配内存空间。2.读取配置文件:例如
阅读全文
摘要:学了很久的nginx启动流程,今天决定复习下以前所学的知识,画一个函数调用图,一边之后快速阅读代码。希望对大家有用,由于我的博文被大量网站抓取而且不标注来源,所以决定在图上加上水印,希望各位同学不要喷我。该文章来自:http://blog.csdn.net/lengzijian/article/details/7597852另外:因为不知道大家看的效果怎么样如果需要原图也可以联系我,或者留下邮箱。
阅读全文
摘要:之前几节有讲过多进程的创建过程和子进程所处理的事情,今天要讲一下nginx里面main函数的另一个主要的操作ngx_add_inherited_sockets。ngx_add_inherited_sockets:服务器监听套接字的封装。本文的主要灵感来自:http://blog.csdn.net/livelylittlefish/article/details/7277607,感谢作者分享。在ngx_add_inherited_sockets方法内,有一个重要的结构体需要讲解——ngx_listening_ssrc/core/ngx_connection.h
typedef struct ng
阅读全文
摘要:上一节主要讲解主进程如何开启子进程,并且讲解了主进程做的一些操作,这一节主要学习子进程处理函数ngx_worker_process_cyclesrc/os/unix/ngx_process_cycle.c static void
ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
{ ngx_uint_t i; ngx_connection_t *c; //在master中,ngx_process被设置为NGX_PROCESS_MASTER ngx_process = N...
阅读全文
摘要:上一节,我们主要讲了多进程时,主进程如何利用信号量控制子进程的,这一节我们主要讲解下子进程的启动,和执行的操作。上一节讲过,真正创建worker子进程的函数是ngx_start_worker_processes,这个函数本身很简单:src/os/unix/ngx_process_cycle.c static void
ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n, ngx_int_t type)
{ ngx_int_t i; ngx_channel_t ch; ngx_log_err...
阅读全文
摘要:了解core模块之前还应改学习ngx_start_worker_processes函数,今天我就来详细学一下这个方法,主要内容来自于http://blog.sina.com.cn/s/blog_677be95b0100iivk.html。nginx的进程启动过程是在ngx_master_process_cycle(src/os/unix/ngx_process_cycle.c)中完成的(单进程是通过ngx_single_process_cycle完成,这里只分析多进程的情况),在ngx_master_process_cycle中,会根据配置文件的worker_processes值创建多个子进程
阅读全文
摘要:再打算正式开始研究core模块式,发现有一个很重要的变量ngx_cycle_t,一直伴随,如果不懂ngx_cycle可能读起代码来回非常困难,这里就来详细学习一下吧。本文大部分灵感来自于。http://blog.csdn.net/livelylittlefish/article/details/7247080和http://blog.sina.com.cn/s/blog_677be95b0100iivi.html谢谢作者提供很详细的资料。依照惯例我们直接来看下/src/core/ngx_cycle.h
struct ngx_cycle_s { void ...
阅读全文
摘要:对于c语言来说,如果需要支持多个操作系统,就需要封装一下文件的读写。封装文件的读写还有一个益处就是能够把读写异常,读写的内存控制,日志的记录封装起来,以便于其他的模块更好的应用。文件的读写一般会封装成打开文件,关闭打开的文件,读写文件。在nginx的源码中,文件读写主要放在core/ngx_file.c,core/ngx_file.h,src/os/unix/ngx_files.h和src/os/unix/ngx_files.c中。由于nginx的文件读写函数较多,我们只是详细介绍比较重要,经常使用,实现很有技巧的函数。typedef struct { ngx_str_t ...
阅读全文
摘要:ngx_buf.{c|h}分为两种类型,一种是file,一种是memory。因此这里会有文件的一些操作域。typedef void * ngx_buf_tag_t; typedef struct ngx_buf_s ngx_buf_t; struct ngx_buf_s { u_char *pos; //已经执行的数据位置 u_char *last; //使用的内存的最后一个字节的指针 off_t file_pos; ...
阅读全文
摘要:ngx_list.{c|h}结构非常简单,如果你看过之前的array介绍,这一节可以一带而过:typedef struct ngx_list_part_s ngx_list_part_t;
struct ngx_list_part_s { void *elts; //数据区域指针 ngx_uint_t nelts; //数据实际个数 ngx_list_part_t *next; //下一个数据指针
};
typedef struct { ngx_list_pa...
阅读全文