![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
架构与设计
文章平均质量分 89
aweth0me
这个作者很懒,什么都没留下…
展开
-
nginx脚本引擎与变量设计(一)
前言:本来的想法是写一个针对经典配置的情景分析,写到一半的时候就力不从心了,感觉很难给出一个完整全面的展示,主要是这块内容牵扯到整个系统的很多方面,比较复杂。所以就打算从一个有代表性的rewrite配置出发,讲一下在这个情景下,nginx的脚本引擎是如何工作的。nginx的脚本解析系统,虽然不能跟专业的脚本解析器相比,但是它的设计却是非常巧妙,而且抽象性很高。先大体说一下它的大体思路。原创 2011-12-12 23:08:17 · 3524 阅读 · 0 评论 -
缓存服务器设计与实现(四)
这里我们聚焦一个问题,就是缓存满的情况。一般的cache都会配置容量,无论是内存缓存还是磁盘缓存,都不能无节制的去使用他们。这里以磁盘缓存为例,如果配置的限额已用完,该如何处理呢? 对于nginx,如果你开启了cache功能,那么你通过ps命令看到这样的进程:cache manager process。其实这个进程的作用主要是在文件失效或者磁盘空间不足的时候,删除原创 2013-02-19 17:41:16 · 4277 阅读 · 0 评论 -
nginx缓存过期管理小结
先看一个经典的配置,注意红色部分:proxy_cache_path /cache levels=1:2 keys_zone=cache_pool:512minactive=1m max_size=10g;location ~ .*\.(jpg|gif|png)${ proxy_next_upstream http_502 http_504 error timeout in原创 2013-03-25 22:05:09 · 10864 阅读 · 0 评论 -
一个类型转换引起的Bug
最近有个bug实在让人抓狂,仅仅是由于一个简单的类型强转导致的,这里给大家讲讲。这是pwrite系统调用的接口说明,我们关注最后一个参数:ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);我们有个接口实现是:int storage_write_meta_info(int fd, voi原创 2013-03-27 17:52:22 · 4338 阅读 · 1 评论 -
Nginx配置文件解析之三
1. ngx_http_core_location(ngx_conf_t*cf, ngx_command_t *cmd, void *dummy)通过前面的分析,location部分的解析跟http和server是同样的道理。 来看下面两句:clcf = ctx->loc_conf[ngx_http_core_module.ctx_index];clcf->loc_c原创 2011-11-10 09:42:54 · 2446 阅读 · 1 评论 -
nginx 请求server与location配置定位
首先先看一个图:上图是nginx listen端口配置形成一个结构图,有几点需要提醒一下:1. 每个端口会有一个ngx_http_port_t结构,相同端口配置会ngx_http_conf_addr_t结构存放到addrs变量中。2. 并不是所有相同端口都要创建ngx_http_conf_addr_t,当出现listen addr:p原创 2012-02-14 15:54:27 · 6272 阅读 · 2 评论 -
关于nginx中upstream机制的思考
网上搜过upstream相关分析的同学可能都已经有了大概的了解了,而且很多大牛分析的也很棒,我这里为什么还要多说几句呢?一来是总结自己的一些理解,二来是对前辈分析的一些补充,希望能带给大家更多启发。先给出阿里技术牛们的总结和分析,供大家参考:http://tengine.taobao.org/book/chapter_05.htmlhttp://www.pagefault.info原创 2013-01-22 22:36:09 · 9371 阅读 · 3 评论 -
nginx http处理过程分析之细节
在之前的综述中提到过两篇不错的博客,对nginx的http的处理过程分析的很到位,这里还有一些细节需要拿出来跟大家分享一下。题外话: “在认真思考过每一行代码之前,不要说真正理解了它!” ---(这是我说的,大家觉得搞笑就来喷我吧。-_-!) 这句话实际上是在告诉我们,隐藏在一份代码中的诸多细节,是需要你去仔细翻阅的,许多地方并不是你想当然那样子原创 2012-02-09 10:27:18 · 4299 阅读 · 2 评论 -
代理服务器中的内容防拷贝技术
代理服务器,广义上包括正向反向代理,httpcache等等,他们都要处理一个问题,就是从上游取得数据让后发往下游。这块有许多细节要处理,特别是如何避免内容的多次拷贝。nginx在这方面做得很不错,我们拿它来分析下,希望能学到一些东西。原创 2013-08-08 22:45:48 · 6371 阅读 · 0 评论 -
缓存服务器设计与实现(五)
上次讲到lru与缓存重建,这次主要讲一下关于过期处理的一些主要问题。在讨论这个问题之前,有个相关的问题需要大家有所了解。就是对于一个缓存如期只来说,什么东西应该缓存,什么不应该缓存。这是一个比较复杂的问题,涉及到http协议的诸多细节。这里赵永明大哥写了一篇文章,讲得很详细,虽然是以ATS为背景讲的,但是思路是想通的,大家可以点击这里去看一下,文章名字很骚气叫“to cache or not to原创 2014-10-10 17:59:57 · 4564 阅读 · 2 评论 -
关于MP4视频拖动的原理与分析(一)
本来想说说关于mp4和一些常见视频文件格式方面的历史。现在想想没啥必要,毕竟本文是在讲关于mp4点播拖动方面的技术细节。绪论,前言神马的显得有点多余。说起MP4,不得不提“Digital container format”的概念。维基百科给出解释: A container or wrapper format is a metafile format whose specification des原创 2015-07-22 17:46:51 · 14237 阅读 · 3 评论 -
leveldb设计分析之log
在leveldb中log的意义是什么? 所有的写操作都必须先成功的append到操作日志中,然后再更新内存memtable。这样做有两个有点: 1可以将随机的写IO变成append,极大的提高写磁盘速度; 2防止在节点down机导致内存数据丢失,造成数据丢失,这对系统来说是个灾难。log的结构+-------------+-------------+-------------+--原创 2015-09-25 10:49:41 · 4628 阅读 · 0 评论 -
腾讯协程库libco的原理分析
我们以example_echosvr.cpp为例子,这个例子的作用就是读取客户端的请求,然后按原样返回给客户端。在它的main函数里创建了proccnt进程,每个进程里有cnt个task。这里的proccnt和cnt都是来自运行参数。for(int i = 0; i < cnt; i++) { task_t * task = (task_t*)calloc( 1,sizeof(task_t)原创 2015-09-23 10:17:43 · 20043 阅读 · 5 评论 -
leveldb设计分析之memtable
在Leveldb中,所有内存中的KV数据都存储在Memtable中,物理disk则存储在SSTable中。在系统运行过程中,如果Memtable中的数据占用内存到达指定值(Options.write_buffer_size),则Leveldb就自动将Memtable转换为Memtable,并自动生成新的Memtable。在leveldb中存在的5种keyParsedInternalKeyIntern原创 2015-09-23 13:54:53 · 4665 阅读 · 1 评论 -
缓存服务器设计与实现(七)
本文讲缓存中的内容管理–-目录的删除原创 2016-01-05 15:42:15 · 3270 阅读 · 1 评论 -
nginx中rewrite模块break和last原理详解
在使用nginx重写(即rewrite)机制时,大家一般会用到last和break,关于这两个指令的作用,网友问的挺多,网上的讨论也挺多,这里做个总结:网友的给力解释:last: 重新将rewrite后的地址在server标签中执行break: 将rewrite后的地址在当前location标签中执行nginx官方解释:last: stops proc原创 2012-04-18 23:46:20 · 21840 阅读 · 1 评论 -
缓存服务器设计与实现(三)
这里我们讨论一个比较重要功能,在之前的文章中提到过,取源合并。为什么要单独把它拿出来讨论呢?其实主要是出于个人工作的角度。之前公司里的cache需要这样一个功能,现有的squid该功能不完善,并且也不太适合我们的业务。然后我们分别在cache和nginx上加了这个功能,不过现在的nginx版本已经原生支持了。呵呵,您也许不知道我们的nginx可是0.7.x的版本,我们当时开发的时候还在想,也许不久原创 2013-02-16 17:59:01 · 4447 阅读 · 6 评论 -
nginx脚本引擎与变量设计(二)
继续上一篇的分析,下面我们将主要谈论set和rewrite两行的解析处理。为了方便分析,这里把示例配置和调用图列出来location / { if ($uri ~* "(.*).html$" ) { set $file $1; rewrite ^(.*)$ http://$http_host$file.mp4 break; }原创 2011-12-12 23:22:29 · 3211 阅读 · 0 评论 -
nginx脚本引擎与变量设计(四)
前面的几篇文章,从一个情景来大体上呈现出了nginx在变量设计上面的技巧和机制,但是这远远没有覆盖全部的内容,后面我会再找一些情景来进一步的分析补充。在这方面的研究领域,我不得不提一个人,agentzh(中文名叫章亦春)。agentzh在国内nginx研究领域可以算的上首屈一指了,特别推荐大家看一下他在sina博客上,讲nginx变量的文章,名叫“nginx变量漫谈”,虽然里面极少涉及代码,但原创 2011-12-28 16:24:46 · 1992 阅读 · 0 评论 -
nginx多进程模型之配置热加载
前言: 服务器程序通常都会通过相应的配置文件来控制服务器的工作。很多情况下,配置文件会经常地被修改,在使其生效时,我们都希望不重启程序,不影响服务器的正常服务。所以所谓的配置文件”热加载”就成了一项非常重要的功能,而这方面,nginx给我们树立了非常好的榜样,值得我们去学习和借鉴。 分析: 在nginx正常服务时,我们在nginx的程序程序目录执行./ngi原创 2012-01-04 21:22:49 · 6376 阅读 · 0 评论 -
nginx 多进程模型之总览
这里先介绍两位淘宝兄弟的博客: 雕梁:1. nginx的进程模型http://simohayha.iteye.com/blog/467940 yixiao:1. Nginx的master和worker进程间的通信http://www.tbdata.org/archives/12082. Nginx进程管理之master进程htt原创 2011-12-29 18:07:29 · 6681 阅读 · 0 评论 -
nginx多进程模型之热代码平滑升级
平滑升级的主要过程包括一下步骤: 1. 新代码make执行完后,这里不用在make install 了,接下来重名/sbin/nginx为nginx.old# mv /usr/local/nginx/sbin/nginx/usr/local/nginx/sbin/nginx.old 2. 复制编译后objs目录下的nginx文件到nginx的安装目录sbin/下# cp o原创 2012-01-10 21:53:06 · 6511 阅读 · 0 评论 -
开发人的大局观
开发人的大局观 ---希望每个立志成为系统分析员的程序员看一看 就象ken_qian所说的,“出了国门,大家都在变。”短短半年间,自己确实在观念上改变了许多。转载 2012-01-12 10:26:16 · 2394 阅读 · 2 评论 -
nginx事件模型小结
大家看到这篇文章可能会感觉很失望,居然没什么内容。。。写这篇的目的是给出一些我认为比较好的文章,做一下补充和概括。这里不写重复的内容,只是转发一下连接供大家参考。1. http://www.tbdata.org/archives/1214 这是淘宝yixiao的分析文章,这篇给出了nginx事件抽象模型的基础构建,为事件循环的正是运作打基础。2.原创 2011-12-29 17:46:28 · 3393 阅读 · 0 评论 -
nginx http处理过程分析之综述
综述 为了节省大家时间和提高效率,这里给出两篇非常不错的文章,出自同一人(应该是雕梁)之手: 1. nginx接受连接,请求处理的前置工作处理 http://www.pagefault.info/?p=205 2. 正式进行request请求处理 http://simohayha.iteye.com/blo原创 2012-01-12 18:08:32 · 4126 阅读 · 2 评论 -
nginx keepalive连接回收机制
我在nginx 1.0.12代码中发现了名为ngx_reusable_connection的函数(它是在哪个版本里被加上的就不去追究了),很好奇这个函数是做什么的。后来有一次在我的群里讨论nginx的时候,有人发现了一个奇怪的现象,这位同学报告说:并发量大的时候,一些keepalive的连接会被新连接给挤掉。。。 关于这个问题,切入点在ngx_get_connection,并原创 2012-03-05 18:03:14 · 7293 阅读 · 1 评论 -
关于nginx配置解析中merge操作的探讨
我们先来看看http module的类型的结构体:typedef struct { ngx_int_t (*preconfiguration)(ngx_conf_t *cf); ngx_int_t (*postconfiguration)(ngx_conf_t *cf); void *(*create_main_conf)(ngx_conf原创 2012-04-12 14:47:07 · 5627 阅读 · 1 评论 -
nginx脚本引擎与设计设计(三)
这一部分我们将探讨一些较细节的东西,加上前面(一),(二)两篇文章对典型情景的分析,我相信应该会对大家理解nginx的脚本解析机制有很大的帮助的。 这里我们关注ngx_http_core_main_conf_t(下面简写为cmcf)结构中的这两个成员,cmcf->variables_keys和cmcf->variables,其中variables_keys是个hash数组,原创 2011-12-27 17:12:29 · 2117 阅读 · 0 评论 -
缓存服务器设计与实现(一)
这里我们nginx的cache系统为线索,来探讨一个缓存服务器的设计和相关细节,我尽量站在设计和框架的角度来分析,限于篇幅这里不再去撸代码了,相关的细节,欢迎大家一起参与讨论。 一个cache服务器中从后端取得文件之后,要么直接发送给客户端(学名叫透传),要么缓存在本地,后续相同的请求访问到cache服务器时,就可以直接拿本地的拷贝来用了,如果可以用的话。如果本地缓存的文件被原创 2013-01-23 17:56:00 · 6796 阅读 · 2 评论 -
缓存服务器设计与实现(二)
我们现在讨论算是最简单的情景,即服务器还没有文件缓存,第一个需要缓存的请求的处理过程。当然需要关注的情景有很多,一个一个来吧。 在缓存服务器设计与实现(一)中讨论的都是一些准备工作,我们接下来要关注从后端机器取回数据以后进行缓存的情景。首先来探讨一个问题,以nginx为例,它是在取后端数据之前就创建了缓存对象,那么从整个系统的角度来看,创建缓存对象的过程包括在内存中建立原创 2013-02-05 09:39:52 · 5751 阅读 · 0 评论 -
困扰nginx初学者的两个小问题
通过在群里大家的讨论,我总结了两点问题,很多初学者都问过:1. ngixn事件处理中关于active和ready的问题2. ngx_connection_t与ngx_http_connection_t结构的区别与联系这里分开讨论下。1. ngixn事件处理中关于active和ready的问题 这俩成员何时为0,何时又被置1,把很多人搞迷糊了。其实从ngin原创 2013-02-05 10:07:17 · 4537 阅读 · 0 评论 -
缓存服务器设计与实现(六)
本文讲缓存中的内容管理--文件的删除。原创 2016-01-05 15:40:07 · 4911 阅读 · 0 评论