Nginx模块中调用ngx_localtime()可能死锁

Friday, March 19th, 2010 @ 19:03

如果设定了timer_resolution并在自己的模块中调用了ngx_localtime()nginx极有可能失去响应。

原因看来是localtime_r(3)信号不安全。nginx内部会用ngx_time这个变量中存下当前的时间,默认是在每次event循环中更新这个变量,减少gettimeofday(2)的调用次数。设置timer_resolution参数会导致nginx使用SIGALRM信号来定时更新,作者认为这样会有更好的精度。触发信号处理函数ngx_timer_signal_handler()后,里面调用ngx_localtime(),最后落实到glibclocaltime_r(3)。由于localtime_r(3)信号不安全,这样自己的模块代码中也进行了ngx_localtime()调用的话,两者很容易冲突而死锁(不知道我说清楚了吗)。

这个问题看起来也没什么好修正的,不要在自己的模块里面用ngx_localtime()就好了。如果不需要设定timer_resolution,可以假装一切都很正常。我现在使用ngx_timeofday()/ngx_gmtime()来格式化时间,目前情绪稳定。

Update: nginx 0.7.66 已经修正了此问题。

参考:

ps: 为了这篇post,山寨了个在Windows Live Writer里面给选定文字加<code>标签的插件,有需要的同学吗……

Tags: , , , , ,
Posted in t | 1 Comment »

One Response to “Nginx模块中调用ngx_localtime()可能死锁”

  1. tsing says:

    那为什么不见< code>

Leave a Reply