<![CDATA[Snooda]]> http://www.xiguqu.com/index zh-cn http://www.xiguqu.com/read/330 <![CDATA[lighttpd的一个日志文件打印切分bug]]> snooda <admin@snooda.com> Wed, 23 Oct 2013 07:16:32 +0000 http://www.xiguqu.com/read/330
    是如果有子q程挂掉。父q程新fork出的子进Eaccesslog会默认打日志到最最开始父q程启动时的那个文g里?br/>

   看了下代码。原来父q程在收到SIGHUP的时候只是把errorlog重新打开了下。没有重新打开accesslogQ没办法Q这个句柄是mod_accesslog模块搞的Q。所以父q程l护的accesslog句柄一直是最老的。它本n不打accesslog日志倒无所谓。但它fork出的子进E是打的。这样就有问题了?br/>


    一个最单方法。就是外部脚本判断进E有更新的时候发一个SIGHUP信号q去?br/>
    ҎҎ是父进E重新启动子q程时给其发一个SIGHUP信号?br/>
    至于父进E自己处理SIGHUP旉新打开句柄q个我感觉不太好。毕竟那是模块内部数据。lighttpdd不应该关心?br/>





Tags - , ]]>
http://www.xiguqu.com/read/310 <![CDATA[lighttpd中CONST_STR_LEN的用法]]> snooda <admin@snooda.com> Thu, 05 Jul 2012 11:49:44 +0000 http://www.xiguqu.com/read/310
    不得Ԍ单步gdbq匹配函数里Q发C个四字符的key值长度被判定?Q很奇怪,查代码原来是用了个CONST_STR_LEN来代替了本来应该填ptr, strlen(ptr)的位|。而CONST_STR_LEN是一个宏Q内容ؓQx, x ? sizeof(x) - 1 : 0。显Ӟ如果传一个指针进ȝ话,sizeof指针的结果是8Q字节,x64)Q这个宏只能在内Ҏ字符串常量的时候用Q不可以用在指针上。当时用的时候看lighttpd代码中一些地方用了这个宏Q于是想当然认ؓ到处都可用。。看来还是要注意一些?br/>









Tags - ]]>
http://www.xiguqu.com/read/306 <![CDATA[lighttpd打印日志出core的问题]]> snooda <admin@snooda.com> Fri, 15 Jun 2012 09:17:26 +0000 http://www.xiguqu.com/read/306     lighttpd支持在日志中打印h头中的字D,Ҏ?{key}iQ这样就能在h头中的key字段打印到日志里Q打印referer{东西的时候比较方ѝ?br/>
    但如果直接写%i的话Q由于没有指定keyQ导致NULL指针Qlighttpd没有校验D出core?br/>
    恰好%I是打印请求长度,大写Iq是比较Ҏ误按成小写的。所以有了这个问?br/>



Tags - , ]]>
http://www.xiguqu.com/read/287 <![CDATA[Transfer-Encoding: chunked http的流式传输]]> snooda <admin@snooda.com> Tue, 08 May 2012 13:31:30 +0000 http://www.xiguqu.com/read/287
    在这U模式下Q应{正文分D发送,每个chunk由长度段和数据段l成Q每个段均由\r\nl束Q当服务器发送完数据后,发送一个长度ؓ0的chunkQ即Q?\r\n\r\n。其中长度段为十六进制表C?br/>

举例一个长?1的chunkQ?br/>
b\r\n12345678901\r\n



    chunk模式多用于结果长度未定的情况下,比如用php输出一个长字符串的时候,默认用的chunk模式Q当然可以通过header来指定用content-length模式。不q需要自q出应{body的长度?br/>
    chunk模式的一个好处是可以q行分段压羃Q服务器Ҏ个chunkq行gzip压羃发送给客户端?br/>


Tags - ]]>
http://www.xiguqu.com/read/273 <![CDATA[lighttpd中handle_start_backend钩子QhookQ函数的理解]]> snooda <admin@snooda.com> Wed, 25 Apr 2012 11:59:50 +0000 http://www.xiguqu.com/read/273     q个hook是在CON_STATE_HANDLE_REQUEST_HEADER状态时Q?br/>如果con->mode仍旧是DIRECTcd且con->physical.path为空Q会先调用:
plugins_call_handle_uri_raw
plugins_call_handle_uri_clean
plugins_call_handle_docroot
plugins_call_handle_physical

如果con->modeq是DIRECTQ那么会判断con->physical.path指定的文件是否存在,
    若存在,如果是Y链但是con->conf.follow_symlink?Q那?03Q如果是目录但请求url不是路径名,?01跌{到目录\径(在末֊/Q?br/>    若无权限讉KQ返?03
    若找不到文gQ返?04
    若ENOTDIRQ对文g做了目录操作Q,则考虑path_info
    若EMFILEQ进E句柄不IQ则q回HANDLER_WAIT_FOR_FD
    若不是以上情况,打印错误日志Q返?00


如果con->physical.path存在且无错误发生Q或为ENOTDIRQ那么又判断了一ơ是否存在(q里代码设计比较恶心Q?br/>    如果是普通文件且没有软链问题Q那么break出去执行plugins_call_handle_start_backend?br/>    反之则一直向上遍历,直到遍历C个真实存在的文gQ如果找不到Q那?04Q如果找CQ将pathinfo串放入con->request.pathinfo。然后截短con->uri.path?br/>
然后才会去调用plugins_call_handle_start_backend?br/>所以对于很多动态请求是不会调用plugins_call_handle_start_backend的?br/>
q个钩子被mod_access调用用来实现deny_all功能?br/>被mod_indexfile调用用来实现默认文g功能Q请?时映到index.php{)

Tags - ]]>
http://www.xiguqu.com/read/272 <![CDATA[lighttpd中钩子(hookQ函数的使用]]> snooda <admin@snooda.com> Tue, 24 Apr 2012 14:57:44 +0000 http://www.xiguqu.com/read/272
    1Q顺序在后面的钩子不能假定前面的钩子函数一定会被执行到?br/>         之前遇到q这L问题Q在一个扩展中使用了两个钩子函敎ͼW一个里面申请了一些资源,W二个里面用ƈ释放Q结果实际中发现对于某些hQ第一个钩子可能没有被执行到了第二个钩子那里Q于是出core?br/>          查了一下原因,原来排在该扩展前面的mod_access扩展在第一个钩子被调用时返回了HANDLER_FINISHQ这P对于后箋调用该钩子的其他扩展不会被回调。于是该扩展的第一个钩子函数未被调用到?br/>    
    2Q同一个钩子可能会被调用多ơ?br/>          一些情况下Q连接状态会rollbackQ这L话同一个hook会被回调多次Q还有一些情况会D调用多次Q比如给多个钩子指定了同一个处理函数?br/>

    有时我们需要ؓ每个扩展在每个连接生命周期内l护一个变量,q时可以用到con->plugin_ctx[p->id]Q这是一个void *指针Q把数据指针存入该变量,q在q接释放旉放掉卛_?br/>Tags - ]]>
http://www.xiguqu.com/read/266 <![CDATA[lemon语法分析器模板初探]]> snooda <admin@snooda.com> Tue, 17 Apr 2012 16:24:24 +0000 http://www.xiguqu.com/read/266
    大概用法Q用lemon的语法编写一?y文gQ然后调用lemon命o或用lemon源文件将.y转化?c?hQ{化后?c看v来就很晕了,完全看不懂的说?br/>    q个东西q是挺有意思的Qlighttpdq用它来解析配置文g。不q配|文件用lua也很不错啊。我准备以后多用lua作ؓ配置文gQ方便灵zR?br/>Tags - , ]]>
http://www.xiguqu.com/read/262 <![CDATA[etag生成规则的配|?lighttpd]]> snooda <admin@snooda.com> Wed, 11 Apr 2012 07:20:45 +0000 http://www.xiguqu.com/read/262

    # 生成ETag的时候是否考虑文g的inode
    etag.use-inode = "enable"
  
    # 生成ETag的时候是否考虑文g的mtime
    etag.use-mtime = "enable"

    # 生成ETag的时候是否考虑文g的size
    etag.use-size  = "enable"


    q是引发困扰的三个参数。^时徏议全部开启,或开启后两个?br/>Tags - , ]]>
http://www.xiguqu.com/read/252 <![CDATA[lighttpd日志切分]]> snooda <admin@snooda.com> Fri, 09 Mar 2012 10:56:01 +0000 http://www.xiguqu.com/read/252     一个新模块没有使用cronlog{日志切分工P直接打印日志到文ӞQ用管道切分日志有风险Q被打印E序一旦hang住,lighttpd也就卡住了)Q但如何切分日志文g变成了一个问题。mv的话׃不改变inodeQ还是往同一个文件打。cp代h太大。直接清I日志的话又太粗暴。这里就用到了sighup功能。只要将文gmv到新名字Q然后用killall -s SIGHUP lighttpdQ这样lighttpd׃自动重新打开lighttpd.log打印了?br/>Tags - , , ]]> http://www.xiguqu.com/read/246 <![CDATA[׃?03问题看配|文仉要性]]> snooda <admin@snooda.com> Sun, 26 Feb 2012 15:55:20 +0000 http://www.xiguqu.com/read/246
    周五试同学H然_现在用的后端server肯定能力要强于前边这个啊Q怎么可能会因载力不D503呢?一想确实啊Q肯定是量调度部分的问题。开gdb仔细一找,l果大跌眼镜Q原来是跟后端的q接池的最大允许ƈ发连接数开的太了。?br/>
    之前那个D|的比较是有道理的Q因为php是每个进E处理一个请求的Q所以ƈ发数肯定不会过启动的phpq程数。但现在后端改用了lighttpdQlighttpd可以承蝲的ƈ发数是很多的Q这L话在高ƈ发请求的情况下后端连接池很容易就用完了?br/>
    由此有两个感触,一是不同场景下配置一定要仔细x如何调优。二是bugq不都是逻辑错误D的,q有可能是配|错了。。。?br/>Tags - ]]>
seƬȫ,s8Ƶ ɫƵ,߾þò,³һ³,һɫɫԴվ һɫ,3XƵ <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <֩>| <ı> <ı> <ı> <ı> <ı> <ı>