服务器开发
文章平均质量分 65
benbendy1984
这个作者很懒,什么都没留下…
展开
-
nginx helloworld
今天按照网上的介绍,自己也动手实践了下,首先建立一个目录,里面放 config 和 ngx_http_hello_module.c两个文件,内容 configddon_name=ngx_http_hello_moduleHTTP_MODULES="$HTTP_MODULES ngx_http_hello_module"NGX_ADDON_SRCS="$NGX_ADDON_SR原创 2010-03-19 10:24:00 · 1269 阅读 · 0 评论 -
nginx phases
nginx 在处理请求的过程中,需要经过一些阶段,具体阶段可以在ngx_http_core_module.h中定义: typedef enum { NGX_HTTP_POST_READ_PHASE = 0, //读取请求 NGX_HTTP_SERVER_REWRITE_PHASE, //server重写 NGX_HTTP_FIND_CONFIG_PHASE, //查找配置 NGX_HTTP_REWRITE_PHASE,原创 2010-11-17 20:25:00 · 1850 阅读 · 0 评论 -
nginx phases 详细介绍
我们知道,nginx 请求分为下面几个阶段:typedef enum { NGX_HTTP_POST_READ_PHASE = 0, //读取请求 NGX_HTTP_SERVER_REWRITE_PHASE, //server重写 NGX_HTTP_FIND_CONFIG_PHASE, //查找配置 NGX_HTTP_REWRITE_PHASE, //重写 NGX_HTTP_POST_REWRI原创 2010-11-18 17:11:00 · 1853 阅读 · 2 评论 -
nginx add listen sock to epoll
到进程获得了监听锁的时候,就会调用ngx_enable_accept_events函数,我们来看看这个函数作什么事情:ngx_enable_accept_events(ngx_cycle_t *cycle){ ngx_uint_t i; ngx_listening_t *ls; ngx_connection_t *c; ls = cycle->listening.elts; for (i = 0; i listening原创 2010-11-19 20:01:00 · 1982 阅读 · 1 评论 -
nginx signal 之 stop
<br /> 当运行的nginx程序收到了 stop信号后是如何处理,使整个程序停下来的呢? 总结了下,主要有下面几个步骤:<br /> <br /> 一 master进程收到 stop 信号后,把 ngx_terminate 设置为1 <br /> <br /> 二 master看到ngx_terminate 为1 ,通过channel向子进程发送 NGX_CMD_TERMINATE 命令<br /> <br /> 三 子进程收到命令后,把 ngx_termi原创 2010-11-21 18:19:00 · 3007 阅读 · 4 评论 -
nginx signal 之 quit
quit信号其实和前面介绍的stop基本一样,唯一的不同之处就是quit是一种优雅的停止,也就是进程如果还在服务中,那么就不会关闭该进程,直到进程完成服务为止。当然这个过程中不能再接受新的任务了。原创 2010-11-21 22:08:00 · 2781 阅读 · 1 评论 -
nginx signal 之 quit reload
<br /> 这个信号,使master进程的环境重新加载,同时启动一批新的子进程,再把原来的进程退出,这样可以是系统平稳的重启。 <br /> <br /> 在收到这个信号好,系统:<br /> //收到 reload 信号 if (ngx_reconfigure) { ngx_reconfigure = 0; //更新程序了 if (ngx_new_binary) {原创 2010-11-23 20:26:00 · 1277 阅读 · 1 评论 -
nginx 数据结构之 array
array是一个动态的数组,可以往里面动态的添加元素,结构图如下原创 2010-11-23 20:57:00 · 1283 阅读 · 1 评论 -
一个简单的微博后台设计
一个小型的微博系统,用户量比较少的时候,采用推的方式,推效率不会太低,用户查看微博的时候,直接从队列中获取,效率很高。 整个系统需要下面几个表: 一 用户表 : 基于了一个用户的基本信息,用户的id,名称等 二 用户关系表: 表明了用户间关注关系。这块可以使用数据库表示 id+id 关系表示,但是这样效率会比较低,特别是关注者原创 2011-06-18 14:57:00 · 5097 阅读 · 3 评论 -
同步阻塞, 同步非阻塞,异步阻塞,异步非阻塞
同步阻塞, 同步非阻塞,异步阻塞,异步非阻塞 我们同意一个幼儿园接小朋友放学的列子,这里定义如下: 家长n个,小朋友n个,管理员1个。家长接小朋友需要根据接送牌的。整个流程是:因为只有一个管理员,所以家长首先需排队。等到的家长把接送牌给管理员,管理员看看小朋友有没有出来了原创 2011-08-06 11:35:47 · 745 阅读 · 0 评论 -
epoll 问题
ev.data 中,我们经常使用的成员 fd 以及ptr ,今天才发现,原来他是一个联合体,而不是一个结构体,所以普通的情况下,我们都直接使用fd , 但是当我们需要传递自己的结构的时候,那么就需要新建一个结构体,在这个结构体中,有个成员是fd , 再使用这个ptr指针指向这个结原创 2011-08-14 19:47:57 · 702 阅读 · 0 评论 -
固定内存和内存池比较
采用固定内存就是在服务启动的时候,分配固定大小的内存,在处理请求的时候,直接在这片内存上操作 采用内存池,需要内存时候,向内存池拿,使用完后就进行释放。 固定内存 内存池优点 1 实现简单2 直接使用,效率高 1 适合任何场景缺点1 受到应用场景限制1 需要管理内存池原创 2011-11-19 15:56:23 · 1492 阅读 · 2 评论 -
redis 删除超时key
该功能主要通过expireIfNeeded 这个函数来实现的,redis对于需要设置超时的key,放到了单独的一个hash中,所以只要检测这个超时hash就可以了。//检查是否超时,超时了那么就删除int expireIfNeeded(redisDb *db, robj *key) { time_t when = getExpire(db,key); //该key原创 2012-03-19 13:42:06 · 4685 阅读 · 0 评论 -
ThreadPoolTaskExecutor 使用和原理
使用ThreadPoolTaskExecutor是一个spring的线程池技术,利用他可以轻松的视线线程池,下面代码是具体的使用pom.xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <原创 2017-02-08 20:04:31 · 23985 阅读 · 1 评论 -
nginx 父子进程通信 channel
<br /> nginx 中利用socketpair()函数,创建一对相互连接的socket,实现父子进程的通信。 下面分析下整个过程: <br /> <br />一 创建 <br /> 在子进程创建之前,需要创建这样一对连接: ngx_spawn_process函数(ngx_process.c中)<br /> //创建一对匿名的已经连接的套接字 if (socketpair(AF_UNIX, SOCK_STREAM, 0, ngx_proces原创 2010-11-20 21:06:00 · 5152 阅读 · 7 评论 -
nginx location 定位
<br /><br /> 我们前面写过hello_world模块,当我们再游览器中输入 http://10.22.222.33:80/helloworld?q=xiaochi ,最后是如何到达我们的hello_world的处理函数的呢? <br /><br /> 首先我们来看我们的配置文件<br /> http{ <br /> server{<br /> location /hello {<br /> ngx_he原创 2010-11-17 14:04:00 · 3631 阅读 · 0 评论 -
apache 模块请求过程
<br /> 在上面介绍了apache下helloworld模块的写法,http://blog.csdn.net/benbendy1984/archive/2010/07/01/5707765.aspx<br />从我们在游览器中输入url到我们的模块接受到请求,中间经过了上面呢?<br /> <br /> 通过调试,具体过程如下:<br /> gdb httpdb mainr -d /usr/local/apache2set follow-fork-mode ch原创 2010-07-01 20:37:00 · 1078 阅读 · 0 评论 -
apache helloworld
写了个简单的helloworld,运行了下,还是比较的顺利,记录下来。主程序: #include #include #include #include #include //处理用户请求的函数 static int helloworld_handler(request_rec *r){ if( !r->handler || ( strcmp( r->handler, "helloworld" ) != 0 ) ) { if( r->method_原创 2010-07-01 20:21:00 · 1701 阅读 · 0 评论 -
nginx 子进程调度
在linux 下,nginx默认是采用多进程模型的,其中一个是父进程,其他都是子进程,父进程主要做一些全局初始化、调度等工作,而真正的处理时在子进程中完成的,那么当一个请求过来的时候,到底有那个进程去服务呢? 我看了代码,还是没有找到答案,后来在网上发现了这篇文章Nginx0.7.61代码分析(二)--worker子进程之间的负载均衡>>,终于揭开了我心中的疑问。系统根原创 2010-05-10 19:17:00 · 2003 阅读 · 0 评论 -
epoll 注意事项
1 epoll_wait 的第四个参数如果是 -1 ,那么如果没有事件,进程就一直 block在那里的,因为这个,浪费了我好多的时间。 这个参数直接设置为0,那么就直接返回,无论有没有时间发生 这个参数如果是设置为>0,原创 2010-05-21 17:17:00 · 1090 阅读 · 0 评论 -
Linux 惊群现象
在linux中,惊群现象已经消失了的,我们可以看 http://simohayha.javaeye.com/blog/561424 ,但是当我们在开发服务器时候,需要使用epoll,发现一个问题,就是当一个请求过来的时候,发现有的时候被唤起的进程不止一个,看下面的程序:#include #include #include #include #include原创 2010-05-24 16:51:00 · 4909 阅读 · 0 评论 -
apache 访问日志的调用堆栈
<br /><br />#0 apr_file_write (thefile=0x10c35c40, buf=0x10cb8730, nbytes=0x7fff2c876ba0) at file_io/unix/readwrite.c:217<br />#1 0x000000000045b583 in ap_default_log_writer (r=0x10cb5a20, handle=0x10c35c40, strs=0x10cb85e8, strl=0x10cb8658, nelts=14, le原创 2010-12-30 15:02:00 · 1023 阅读 · 1 评论 -
nginx accept 加锁
nginx 采用多进程的模,当一个请求过来的时候,系统会对进程进行加锁操作,保证只有一个进程来接受请求。 加锁: ngx_trylock_accept_mutex(cycle) 解锁: ngx_shmtx_unlock(&ngx_accept_mutex) 下面对加锁和解锁进行详细的介绍: 一 加锁操作 ngx_int_t271 ngx_trylock_accept_mutex(ngx_cycle_t *cycle)272 {273原创 2010-11-10 18:35:00 · 3923 阅读 · 0 评论 -
nginx 配置文件解析
<br /> ngx_conf_parse 这个函数来完成对配置文件的解析,其实这个函数不仅仅解析文件,还可以用来解析参数和块的,不过我们在这里分析解析文件。 <br /> <br /> 文件简单的分为三个部分<br /> 一 配置文件预先处理<br /> 二 读取<br /> 三 处理 <br /> <br /> <br /> 一 配置文件预处理<br /> 主要打开文件,创建缓冲区,并把文件信息以及读取的缓冲区信息填到cf->conf_file原创 2010-11-12 17:03:00 · 2138 阅读 · 1 评论 -
nginx 整体结构
零零碎碎的看了nginx的源码,自己感觉还是比较的乱,所以花点时间把它的整体结构给理下, 一 模块的结构(ngx_module_t) index 是指模块的下标,系统在初始化的是,给了每个模块一个唯一id,就好比每个学生都有一个学号,每个员工都有一个工号,下标从0开始。 ctx 是模块的上下文,不同的模块具有不同的上下文,这个具体在第二部分介绍 command 处理指令,在配置文件中的每条指令,在模块中都有对应的处理,因为每个模块可以有多个指令原创 2010-11-11 23:06:00 · 2157 阅读 · 1 评论 -
nginx module
nginx 支持模块化,系统中的很多功能就是一个模块,比如event、http、email 等,可以看出,模块在nginx中重要性,模块的定义在 src/core/ngx_conf_file.h中, struct ngx_module_s { ngx_uint_t ctx_index; //分类索引,在该类别下模块中的索引号,现在系统core、event、http和mail四种模块 ngx_uint_t原创 2010-11-14 16:12:00 · 1356 阅读 · 0 评论 -
nginx 进程的类型
nginx 有使用ngx_process 变量表示进程的类型,这个变量的取值在ngx_process_cycle.h中定义,主要有下面几个#define NGX_PROCESS_SINGLE 0 //单独进程#define NGX_PROCESS_MASTER 1 //主进程#define NGX_PROCESS_SIGNALLER 2 //信号进程#define NGX_PROCES原创 2010-11-14 17:53:00 · 3354 阅读 · 0 评论 -
nginx listen
<br /> nginx中使用ngx_listening 来监听外部的连接请求<br /> struct ngx_listening_s { ngx_socket_t fd; //socket struct sockaddr *sockaddr; //地址 socklen_t socklen; /* size of sockaddr */ size_t ad原创 2010-11-16 11:06:00 · 3574 阅读 · 0 评论 -
nginx 处理accept
<br /> accept过程实现在 ngx_event_accept.c中的ngx_event_accept函数中,主要过程如下:<br /> <br /> 一 accept()<br /> <br /> 二 从连接池中取得一个连接 <br /> c = ngx_原创 2010-11-16 11:51:00 · 2929 阅读 · 0 评论 -
jetty源码分析:QueuedThreadPool
概括我们从几个问题入手,如果搞清楚这几个问题,也就理解了这个线程池的原理了1. 重要的成员线程池常规成员: private int _idleTimeout; //线程空闲多久后退出 private int _maxThreads; //最大线程数原创 2017-02-19 21:30:48 · 2728 阅读 · 0 评论